使用Docker虚拟化出一个Centos7操作系统(140、141机器上执行)

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> 
#启动新容器,并且进行端口映射(刚才提交的镜像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:宿主端口号

你可能感兴趣的:(#,Docker)