1.使用Docker虚拟化出一个Centos7操作系统(140、141机器上执行)
Docker官网:https://docs.docker.com/
Docker文档:https://docs.docker.com/engine/reference/commandline/network_rm/
1.1 Docker安装
1.1.1 支持的操作系统
Docker支持以下的CentOS版本:
CentOS 7 (64-bit)
CentOS 6.5 (64-bit) 或更高的版本
1.1.2 前提条件
目前,CentOS 仅发行版本中的内核支持 Docker。
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
Docker要求CentOS系统的内核版本高于3.10,查看CentOS版本是否支持Docker.
通过uname –r命令查看你当前的内核版本
[root@bigdata1 ~]# uname -r
3.10.0-693.el7.x86_64
上面的Linux内核的版本大于3.10版本,可以进行安装。
1.1.3 使用yum安装(CentOS7下)
安装Docker
Docker软件包和依赖包已经包含在默认的CentOS-Extras软件源里,安装命令如下:
[root@runoob ~]# yum -y install docker-io
测试运行hello-world
[root@runoob ~]#docker run hello-world
由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。
1.1.4 使用脚本安装Docker(Centos7下)
1.使用sudo或root权限登录Centos.
2.确保yum包更新到最新
sudo yum update
3.执行Docker安装脚本
$ curl -fsSL https://get.docker.com/ | sh
执行这个脚本会添加docker.repo源并安装Docker.
4.启动Docker进程。
$ sudo service docker start
5.验证docker是否安装成功并在容器中执行一个测试的镜像。
$ sudo docker run hello-world
docker ps
到此,docker在CentOS系统的安装完成。
1.1.5 Docker卸载
[root@bigdata2 ~]# yum list installed | grep docker
docker.x86_64 2:1.13.1-68.gitdded712.el7.centos @extras
docker-client.x86_64 2:1.13.1-68.gitdded712.el7.centos @extras
docker-common.x86_64 2:1.13.1-68.gitdded712.el7.centos @extras
[root@bigdata2 ~]# sudo yum -y remove docker.x86_64
[root@bigdata2 ~]# sudo yum -y docker-client.x86_64
[root@bigdata2 ~]# sudo yum -y remove docker-common.x86_64
卸载docker生成的网卡:
#ifconfig docker0 down
#brctl delbr docker0
docker0这个网桥是在启动Docker Daemon时创建的,因此,这种删除方法并不能根本上删除docker0,下次daemon启动(假设没有指定-b参数)时,又会自动创建docker0网桥。
1.1.6 使用Centos7.5.1804 docker镜像虚拟一个操作系统
1.1.6.1 运行一个centos7镜像
以下是/centos/”>https://hub.docker.com//centos/给出的方式,以下不是最终运行方式
docker run --rm -d -i -t centos:centos7.5.1804 /bin/bash
注意:要加上-d,如果不加,这个当退出的时候,发现没有docker镜像了。
1.1.6.2 查看Linux下运行了哪些docker镜像
[root@bigdata1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46ba1c2535fc centos:centos7.5.1804 "/bin/bash" 6 seconds ago Up 5 seconds naughty_euler
daaa23c63483 centos:centos7.5.1804 "/bin/bash" 2 minutes ago Up 2 minutes keen_golick
fbb65c980d65 sshd:Dockerfile "/usr/sbin/sshd -D" About an hour ago Up About an hour 0.0.0.0:10022->22/tcp mycentos2
[root@bigdata1 ~]#
1.1.6.3 进入运行的Linux操作系统
第一步中使用的后台静默的方式运行,通过docker attach 访问该容器
[root@bigdata1 ~]# docker attach 46ba1c2535fc
[root@46ba1c2535fc /]#
1.1.6.4 ifconfig的安装
进入Centos之后,发现没有ifconfig,接下来配置ifconfig
yum search ifconfig
yum install net-tools.x86_64
上面运行完之后,可以执行ifconfig进行查看ip了
1.1.6.5 安装wget
在很多时候,需要通过wget下载资源
[root@9b291665f9af /]# yum -y install wget
1.1.6.6 更新安装vim,安装vim增强包
[root@5ec004281336 /]#yum -y install vim-enhanced
1.1.6.7 修改docker容器虚拟出来的Linux系统的用户名和密码
passwd root
然后按照提示进行密码的修改,密码改成123456
1.1.6.8 安装sshd
[root@b5926410fe60 /]# yum install passwd openssl openssh-server -y
启动sshd(这步骤可以跳过):
# /usr/sbin/sshd -D
这时报以下错误:
[root@ b5926410fe60 /]# /usr/sbin/sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
执行以下命令解决:
[root@b5926410fe60 /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
[root@b5926410fe60 /]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
[root@b5926410fe60 /]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''
然后,修改 /etc/ssh/sshd_config 配置信息:
为了让服务能够被远程工具连接,配置/etc/ssh/sshd_config中监听的端口和ip地址
vim /etc/ssh/sshd_config
Port 22 (这个可以不设置,默认22端口)
PermitRootLogin yes
PasswordAuthentication yes (这里发现有两处,一处注释了,一处没有注释,这里不改)
修改完后,重新启动sshd
[root@b5926410fe60 /]# /usr/sbin/sshd -D
1.1.6.9 将当前容器保存为镜像
要注意的是,要在宿主机器上另外开启一个终端,然后在执行下面的命令,或者使用以下命令:
#退出,但不停止容器 (笔者电脑上执行,发现下面的命令不给力,建议另外开一个终端替代下面的快捷键)
Ctrl+P+Q[root@bigdata2 ~]# docker ps -all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ec004281336 centos:centos7.5.1804 "/bin/bash" 12 minutes ago Up 12 minutes hopeful_hypatia
使用docker commit REPOSITORY
[root@bigdata2 ~]# docker commit 5ec004281336 tuzq/centos7-ssh
sha256:bbb85bb5c0cdefb070162c9791cbec85942c4e25ac4714b19da060ecf91ab03e
[root@bigdata2 ~]#
docker images查看是否有新的docker镜像
[root@bigdata1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tuzq/centos7-ssh latest 953019243206 2 minutes ago 350 MB
sshd Dockerfile 38f1fe25a171 2 hours ago 399 MB
sshd dockerfile 38f1fe25a171 2 hours ago 399 MB
docker.io/centos 7.5.1804 fdf13fa91c6e 8 days ago 200 MB
[root@bigdata1 ~]#
1.1.6.10 在宿主机上基于新创建的镜像启动新的容器
(退出的时候看下面的注意说明)
–先删除之前的容器
[root@bigdata1 ~]# docker ps -all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b291665f9af centos:centos7.5.1804 "/bin/bash" 12 minutes ago Up 12 minutes wonderful_cori
[root@bigdata1 ~]#hr:centos7 hr$ docker rm -f 9b291665f9af
–基于新镜像运行容器(下面的命令为测试命令,在创建好自己网络之后(1.1.5.1章节),可以直接跳到下面的1.1.6章节)
[root@bigdata1 ~]# docker run -d -p 10022:22 tuzq/centos7-ssh:latest /usr/sbin/sshd -D
d8fda5ddf55b1876e70f9cd82de888402538ebcbcadac46f3f5044f2e02b302a
[root@bigdata1 ~]# docker ps -all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8fda5ddf55b tuzq/centos7-ssh:latest "/usr/sbin/sshd -D" 6 seconds ago Up 5 seconds 0.0.0.0:10022->22/tcp eloquent_carson
--查看映射端口是否成功
[root@bigdata1 ~]# docker port d8fda5ddf55b
22/tcp -> 0.0.0.0:10022
[root@bigdata1 ~]#
注意事项:
#退出,但不停止容器
Ctrl+P+Q
#回到Docker下面,停止容器 (容器ID即:CONTAINER ID)
docker stop <容器ID>
#提交当前容器到镜像
docker commit <容器ID> <NAME/VERSION>
#启动新容器,并且进行端口映射(刚才提交的镜像id即:通过docker images看到的REPOSITORY: REPOSITORY 即:tuzq/centos7-ssh:latest)
docker run -itd -p 10022:22 <刚才提交的镜像ID> /bin/bash
1.1.6.11 使用XShell连接到容器
从宿主机是非Linux操作系统,则需要通过docker-machine ip连接到容器
接下来就可以通过ssh进行访问了,访问方式:
xxx.xxx.xxx.140
连接: port 为10022
用户名:root
密码:123456
即:
接下来的用户名是:root,密码:123456
1.1.7 使用固定ip的方式创建Docker容器
1.1.7.1 Docker默认网络
参考博文地址:https://www.jb51.net/article/118396.htm
Docker安装后,默认会创建下面三种网络类型:
[root@bigdata1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
35fbf8bcb831 bridge bridge local
a5baf164f11f host host local
43eba2f0486e none null local
[root@bigdata1 ~]#
启动Docker的时候,用—network参数,可以指定网络类型,如:
docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:latest /bin/bash
bridge:桥接网络
默认情况下启动Docker容器,都是使用bridge,Docker安装时创建Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了。
none:无指定网络
使用–network=none,docker容器就不分配局域网的IP
host:主机网络
使用–network=host,此时,Docker容器的网络会附属在主机上,两者是互通的。
例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。
1.1.7.2 创建自定义网络
步骤1:创建自定义网络
创建自定义网络,并指定网段:192.168.200.0/24 (注意这里使用的200段,不能和宿主机器所在的网段相同)
[root@bigdata1 ~]# docker network create --subnet=192.168.200.0/24 dockernet
985d0b115bc9593943be74942330025fd75fbcb87ddad6a154bb584cc4ff5a69
[root@bigdata1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
35fbf8bcb831 bridge bridge local
985d0b115bc9 dockernet bridge local
a5baf164f11f host host local
43eba2f0486e none null local
删除自定义网络的方式:
[root@bigdata1 ~]# docker network dockernet
1.1.7.3 使用指定ip启动容器
docker run -itd --name dockerOS143 --net dockernet --ip 192.168.200.143 -p 10022:22 tuzq/centos7-ssh:latest /usr/sbin/sshd -D
启动完成之后,进入容器中查看ip信息(下面的网络的ip地址应该是192.168.200.143,不是xxx.xxx.xxx.143,配置修改之后,图没修改)
1.1.8 为系统指定内存和交换空间,并设置不被宿主机器杀死
关于虚拟容器的内存参数设置参考:https://blog.csdn.net/csdn_duomaomao/article/details/78567859
上面的问题解决之后,发现就可以继续执行(140机器上执行下面的命令,测试发现使用1G的运行时很卡):
docker run -itd --name dockerOS143 --net dockernet --ip 192.168.200.143 -p 10022:22 -m 1G --memory-swap=1G --oom-kill-disable tuzq/centos7-ssh:latest /usr/sbin/sshd -D
进入Linux系统,然后查看内存情况:
注意141机器上执行下面的命令(测试发现使用1G的运行时很卡):
docker run -itd --name dockerOS145 --net dockernet --ip 192.168.200.145 -p 10022:22 -m 1G --memory-swap=1G --oom-kill-disable tuzq/centos7-ssh:latest /usr/sbin/sshd -D
使用xshell 工具访问:
进入虚拟出的Linux服务器上之后,效果如下:
另外,也可以
1.1.9 常见错误
1.1.9.1 错误一
如果在运行过程发现类似如下问题:
/usr/bin/docker-current: Error response from daemon: Conflict. The container name "/dockerOS143" is already in use by container 987e1127d5ef543f459807a4b33f84144bcfec9bca97d218f98af870ade3ca47. You have to remove (or rename) that container to be able to reuse that name..
See '/usr/bin/docker-current run --help'.
[root@bigdata1 ~]#
解决办法是:
docker rm (镜像ID)
查看镜像ID的方式如下:
[root@bigdata1 ~]# docker ps -all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
987e1127d5ef herong/centos7-ssh:latest "/usr/sbin/sshd -D" 38 minutes ago Exited (0) 14 minutes ago dockerOS143
[root@bigdata1 ~]# l
即执行:
[root@bigdata1 ~]# docker rm 987e1127d5ef
987e1127d5ef
再次执行以下命令,若发现还有未关闭的镜像,再次删除相关镜像:
[root@bigdata1 ~]# docker ps –all
1.1.9.2 错误二
如果出现类似:
[root@bigdata2 ~]# docker run -itd --name dockerOS --net dockernet --ip 192.168.200.145 -p 10022:22 tuzq/centos7-ssh:latest /usr/sbin/sshd -D
43f876ec1f3f67478d4a7757c2e996111f9987b8566b7f597aab00aaede3ed7a
/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint dockerOS (a449051624b7701e619e3c3cb996e3c84190df984dce09cc7a4a119d6a43d775): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 10022 -j DNAT --to-destination xxx.xxx.xxx.145:22 ! -i br-3989d73e540e: iptables: No chain/target/match by that name.
解决办法:
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d
service docker restart
1.1.10 关于删除本地docker镜像
https://blog.csdn.net/hubanbei2010/article/details/58135234
1.1.11 141示例容器最终启动方式
在141容器机器上的145容器中,最后安装了nginx,imply。
这个容器重新被打成了镜像:
其中cfc4762785b1为145容器这个容器的id
docker commit cfc4762785b1 foo/live
最终启动:
docker run -itd --name dockerOS --net dockernet --ip 192.168.200.145 -p 29095:9095 -p 20080:80 -p 23306:3306 -p 10022:22 foo/live:latest /usr/sbin/sshd -D
说明:上面的29095、20080、23306、10022都是宿主机器xxx.xxx.xxx.141上的端口号,分别映射到192.168.200.145上的9055、80、3306、22端口。
页面访问效果:
注意:访问的时候使用宿主机器的ip:宿主端口号