docker虚拟化技术文档(自己总结最全版本)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/toto1297488504/article/details/88659016

目录

1 使用Docker虚拟化出一个Centos7操作系统(140、141机器上执行) 2
1.1 Docker安装 3
1.1.1 支持的操作系统 3
1.1.2 前提条件 3
1.1.3 使用yum安装(CentOS7下) 3
1.1.4 使用脚本安装Docker(Centos7下) 3
1.1.5 Docker卸载 4
1.1.6 使用Centos7.5.1804 docker镜像虚拟一个操作系统 5
1.1.2 使用固定ip的方式创建Docker容器 13
1.1.3 为系统指定内存和交换空间,并设置不被宿主机器杀死 15
1.1.4 常见错误 18
1.1.5 关于删除本地docker镜像 19
1.1.6 141示例容器最终启动方式 20
2 162机器docker镜像安装 20
2.1 Docker安装 20
2.1.1 支持的操作系统 20
2.1.2 前提条件 21
2.1.3 使用yum安装(CentOS7下) 21
2.1.4 使用脚本安装Docker(Centos7下) 21
2.1.5 创建docker子网 22
2.2 最终启动: 25
3 docker常见命令 25
4 docker镜像仓库搭建 26
5 数据持久化 26
6 安装内存压测工具stress 26
7 docker内存限制 27
8 docker限制容器可用的CPU 27
9 Docker集群管理工具kubernetes搭建 30
10 Centos7基于lxcfs增强Docker隔离能力(docker free显示问题) 30
11 修改5台机器的hosts和hostname 32
12 对运行中的Docker容器添加端口映射 32

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
chkconfig docker on

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 remove docker-client.x86_64
[root@bigdata2 ~]# sudo yum -y remove docker-common.x86_64

卸载docker生成的网卡:

[root@youx-pub registry]# ifconfig docker0 downic
[root@youx-pub registry]# ifconfig br-29857dc941f6 down

[root@youx-pub registry]# brctl delbr docker0
[root@youx-pub registry]# brctl delbr br-29857dc941f6 

docker0这个网桥是在启动Docker Daemon时创建的,因此,这种删除方法并不能根本上删除docker0,下次daemon启动(假设没有指定-b参数)时,又会自动创建docker0网桥。

删除docker相关的文件:
[root@youx-pub registry]# find / -name docker
/run/docker
/etc/selinux/targeted/active/modules/disabled/docker
/etc/docker
/var/lib/docker
/var/lib/docker/overlay2/0bfbb9a9704620e83e3f2b700288f15dcd3aec87bce09c9994f582a57c062369/diff/etc/docker
[root@youx-pub registry]# rm -rf /run/docker/
[root@youx-pub registry]# rm -rf /etc/selinux/targeted/active/modules/disabled/docker
[root@youx-pub registry]# rm -rf /etc/docker/
[root@youx-pub registry]# rm -rf /var/lib/docker
[root@youx-pub registry]# rm -rf /docker

1.1.6 使用Centos7.5.1804 docker镜像虚拟一个操作系统

1.1.6.1 运行一个centos7镜像

以下是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 <CONTAINER ID >访问该容器
[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 docker 容器中设置中文语言包的问题

参考博文:https://blog.csdn.net/hnmpf/article/details/81478972

由于使用镜像安装的Centos7没有中文语言包,所以在查看日志等的时候发现是乱码,为了解决这个问题,需要安装中文语言包。
进入虚拟的Linux操作系统之后,采用”locale”查看,发现没有配置语言LANG
在这里插入图片描述
可以采用”locale -a”,查看系统语言包,会发现没有中文包

[root@9f117c915dea software]# locale -a
C
POSIX
en_AG
en_AG.utf8
en_AU
en_AU.iso88591
en_AU.utf8
en_BW
en_BW.iso88591
en_BW.utf8
en_CA
en_CA.iso88591
en_CA.utf8
en_DK
en_DK.iso88591
en_DK.utf8
en_GB
en_GB.iso88591
en_GB.iso885915
en_GB.utf8
en_HK
en_HK.iso88591
en_HK.utf8
en_IE
en_IE.iso88591
en_IE.iso885915@euro
en_IE.utf8
en_IE@euro
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ
en_NZ.iso88591
en_NZ.utf8
en_PH
en_PH.iso88591
en_PH.utf8
en_SG
en_SG.iso88591
en_SG.utf8
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
en_ZA
en_ZA.iso88591
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW
en_ZW.iso88591
en_ZW.utf8
[root@9f117c915dea software]

解决办法:
1、yum -y install kde-l10n-Chinese 安装语言包(针对centos 7)
2、yum -y reinstall glibc-common 更新gitbc 包(因为该镜像已阉割了该包的部分功能,所以需要更新)
3、localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 (设置系统语言包),执行完成之后,再查看语言,结果如下:
在这里插入图片描述

然后在/etc/profile中配置:
export LC_ALL=zh_CN.utf8
在这里插入图片描述

4、ENV LC_ALL zh_CN.UTF-8 通过设置环境变量的方式设置(可以采用直接修改/etc/locale.conf 文件来实现,不过需要reboot),这里通过修改/etc/locale.conf的方式实现,最终修改的结果为:

LANG="zh_CN.utf8"     (其中,原始的配置是:LANG="en_US.UTF-8")

由于要reboot,这里重启docker容器的方式进行实现(以下命令在宿主机器上执行)。

[root@VM_0_8_centos ~]# systemctl restart docker
1.1.6.10 解决docker容器时间与本地时间不一致

进入容器(也可以xshell远程进入)

docker exec -t -i b5926410fe60 /bin/bash    // b5926410fe60为容器id

在/usr/share/zoneinfo目录下找上海时区

cd /usr/share/zoneinfo/Asia

3)复制上海时区到 /etc 重命名localtime文件

cp -i Shanghai /etc/localtime

完成后的效果:

程序运行过程中,docker容器中的时间比实际容器中的时间慢8小时,解决办法是在容器中执行:

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
1.1.6.11 将当前容器保存为镜像

要注意的是,要在宿主机器上另外开启一个终端,然后在执行下面的命令,或者使用以下命令:
#退出,但不停止容器 (笔者电脑上执行,发现下面的命令不给力,建议另外开一个终端替代下面的快捷键)

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 <CONTAINER ID> 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.12 在宿主机上基于新创建的镜像启动新的容器
(退出的时候看下面的注意说明)
--先删除之前的容器
[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

--基于新镜像运行容器(下面的命令为测试命令,在创建好自己网络之后(30.1.5.1章节),可以直接跳到下面的30.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.1.4 使用XShell连接到容器

从宿主机是非Linux操作系统,则需要通过docker-machine ip连接到容器
接下来就可以通过ssh进行访问了,访问方式:
192.168.18.140

连接: port 为10022

用户名:root
密码:123456

即:
在这里插入图片描述

接下来的用户名是:root,密码:123456

1.1.2 使用固定ip的方式创建Docker容器

1.1.2.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.2.2 创建自定义网络

步骤1:创建自定义网络
创建自定义网络,并指定网段:192.168.200.0/24 (注意这里使用的200段,不能和宿主机器所在的网段相同)
注意:162机器docker的这个的网段是:192.168.18.100.0

[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 rm dockernet
1.1.2.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,不是192.168.18.143,配置修改之后,图没修改)
在这里插入图片描述

1.1.3 为系统指定内存和交换空间,并设置不被宿主机器杀死

关于虚拟容器的内存参数设置参考: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.4 常见错误

1.1.4.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.4.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 192.168.18.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.5 关于删除本地docker镜像

https://blog.csdn.net/hubanbei2010/article/details/58135234

1.1.6 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都是宿主机器192.168.18.141上的端口号,分别映射到192.168.200.145上的9055、80、3306、22端口。

页面访问效果:
在这里插入图片描述
注意:访问的时候使用宿主机器的ip:宿主端口号

2 162机器docker镜像安装

2.1 Docker安装

2.1.1 支持的操作系统

Docker支持以下的CentOS版本:
CentOS 7 (64-bit)
CentOS 6.5 (64-bit) 或更高的版本

2.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版本,可以进行安装。

2.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的镜像,并在容器内运行。

2.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系统的安装完成。

2.1.5 创建docker子网

[root@youx-pub ~]# docker network create --subnet=192.168.100.0/24 dockernet

[root@youx-pub ~]# docker run -itd --name dockerOS --net dockernet --ip 192.168.100.100 -p 29095:9095 -p 20080:80 -p 23306:3306 -p 10022:22 centos:centos7.5.1804 /bin/bash

[root@youx-pub ~]# docker ps -a
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS                                                                                            NAMES
2b0f4e86048d        centos:centos7.5.1804   "/bin/bash"         15 seconds ago      Up 13 seconds       0.0.0.0:10022->22/tcp, 0.0.0.0:20080->80/tcp, 0.0.0.0:23306->3306/tcp, 0.0.0.0:29095->9095/tcp   dockerOS
[root@youx-pub ~]# docker attach 2b0f4e86048d
2.1.5.1 ifconfig的安装

进入Centos之后,发现没有ifconfig,接下来配置ifconfig

[root@2b0f4e86048d /]# yum search ifconfig
[root@2b0f4e86048d /]# yum install net-tools.x86_64

上面运行完之后,可以执行ifconfig进行查看ip了

2.1.5.2 安装wget

在很多时候,需要通过wget下载资源

[root@2b0f4e86048d /]# yum -y install wget
2.1.5.3 更新安装vim,安装vim增强包
[root@2b0f4e86048d /]# yum -y install vim-enhanced
2.1.5.4 修改docker容器虚拟出来的Linux系统的用户名和密码

passwd root

然后按照提示进行密码的修改,密码改成123456

2.1.5.5 安装sshd
[root@2b0f4e86048d /]# yum install passwd openssl openssh-server -y

启动sshd(这步骤可以跳过):

# /usr/sbin/sshd -D

这时报以下错误:

[root@2b0f4e86048d /]# /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@2b0f4e86048d /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''  
[root@2b0f4e86048d /]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
[root@2b0f4e86048d /]# 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@2b0f4e86048d /]# /usr/sbin/sshd -D
2.1.5.6 将当前容器保存为镜像

要注意的是,要在宿主机器上另外开启一个终端,然后在执行下面的命令,或者使用以下命令:
#退出,但不停止容器 (笔者电脑上执行,发现下面的命令不给力,建议另外开一个终端替代下面的快捷键)

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@youx-pub ~]# docker commit 2b0f4e86048d youx-v1.0/centos7.5.1804
> sha256:d41832c8bf0bfe4e9d050ffa96a6892ce3ed53e14e04c8740b0bb7f55b13a24b
> [root@bigdata2 ~]#

docker images查看是否有新的docker镜像

[root@youx-pub ~]#docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
youx/centos7.5.1804   latest              d41832c8bf0b        4 seconds ago       353 MB
docker.io/centos      centos7.5.1804      fdf13fa91c6e        4 weeks ago         200 MB
[root@youx-pub ~]#

删除旧的docker镜像,然后启动新的镜像。

docker run -itd --name dockerOS --net dockernet --ip 192.168.100.100 -p 19095:9095 -p 10080:80 -p 13306:3306 -p 10022:22 youx/centos7.5.1804:latest /usr/sbin/sshd -D

使用下面的方式连接虚拟容器:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 最终启动:

docker run -itd --name dockerOS --net dockernet --ip 192.168.100.145 -p 29095:9095 -p 10080:80 -p 13306:3306 -p 10022:22 localhost:5000/centos7:1.0 /usr/sbin/sshd -D

3 docker常见命令

docker start < CONTAINER ID>
docker stop < CONTAINER ID>
docker restart < CONTAINER ID>

更新运行着的容器的内存

docker update -m 2048m <name>

4 docker镜像仓库搭建

参考:https://blog.csdn.net/tototuzuoquan/article/details/82025954

5 数据持久化

案例:

docker run -itd --restart=always --name bigdata1 -p 20080:80 -p 20022:22 -v /home/docker/volum/node-pub2:/data --privileged=true centos7:v0.2 /usr/sbin/sshd -D

说明:

/home/docker/volum/node-pub2   :为宿主机器上的目录
/data                          :为容器上的目录
--privileged=true                 :目的是为了能够在容器中访问/data下的内容

运行起来之后,在宿主机器上的/home/docker/volum/node-pub2 和 在容器中的/data目录中产生新数据之后,两者都可以互相看到。

6 安装内存压测工具stress

安装命令:

yum install -y epel-release
yum install -y stress

下面命令会创建一个线程并通过malloc函数分配内存(以下命令在容器中查看):

stress --vm 1 --vm-bytes 500M

再如:

stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s

在容器所在的宿主机器上查看实际状态:

docker stats

结果类似如下:
在这里插入图片描述

7 docker内存限制

docker run -itd -m 1024M --memory-swap=1024M --restart=always --name bigdata1 -p 20080:80 -p 20022:22 -v /home/docker/volum/node-pub2:/data --privileged=true centos7:v0.2 /usr/sbin/sshd -D

说明:
A:docker run命令中通过-m选项限制使用的内存上限为300M.同时设置memory-swap值为-1,它表示容器程序使用内存的受限,而可以使用的swap空间使用不受限制(宿主机有多少swap容器就可以使用多少)

2、可以限制使用的swap
要注意的是–memory-swap是必须要与–memory 一起使用的。
正常情况下,–memory-swap 的值包含容器可用内存和可用swap。所以 --memory=“300m” --memory-swap=“1g” 的含义为:
容器可以使用 300M 的物理内存,并且可以使用 700M(1G -300M) 的 swap。–memory-swap 居然是容器可以使用的物理内存和可以使用的 swap 之和!
把 --memory-swap 设置为 0 和不设置是一样的,此时如果设置了 --memory,容器可以使用的 swap 大小为 --memory 值的两倍。
如果 --memory-swap 的值和 --memory 相同,则容器不能使用 swap。

8 docker限制容器可用的CPU

参考博文:https://m.jb51.net/article/135395.htm

通过下面的命令创建容器,–cpus=1表示容器最多可以使用主机上两个CPU:

docker run -itd -m 1024M --memory-swap=1024M --cpus=1 --restart=always --name bigdata1 -p 20080:80 -p 20022:22 -v /home/docker/volum/node-pub2:/data --privileged=true centos7:v0.2 /usr/sbin/sshd -D
然后由 stress 命令创建四个繁忙的进程消耗 CPU 资源:
stress -c 2

我们先来看看 docker stats 命令的输出:
在这里插入图片描述
从上面看出,其cpu使用情况是100%、

在容器内部查看现象是:
在这里插入图片描述
在宿主机器上查看机器的CPU使用情况:
在这里插入图片描述
上面四个线程加起来为100%。

停止掉容器,然后开始使用指定数量的CPU

[root@youx-pub ~]# docker rm -f f68ae32581e6

指定固定的 CPU
查看数组机器上的CPU数量(top,然后再按数字1)
在这里插入图片描述
通过 --cpus 选项我们无法让容器始终在一个或某几个 CPU 上运行,但是通过 --cpuset-cpus 选项却可以做到!这是非常有意义的,因为现在的多核系统中每个核心都有自己的缓存,如果频繁的调度进程在不同的核心上执行势必会带来缓存失效等开销。下面我们就演示如何设置容器使用固定的 CPU,下面的命令为容器设置了 --cpuset-cpus 选项,指定运行容器的 CPU 编号为 1:

docker run -itd -m 1024M --memory-swap=1024M --cpus=1 --cpuset-cpus="1" --restart=always --name bigdata1 -p 20080:80 -p 20022:22 -v /home/docker/volum/node-pub2:/data --privileged=true centos7:v0.2 /usr/sbin/sshd -D

然后在宿主机器上安装stress,然后执行以下命令:、

[root@753d19cb5dcb ~]# stress -c 4

查看宿主机器上的CPU使用状况
在这里插入图片描述

CPU不止是使用一个CPU,可以使用多个CPU,例如如下配置:

[root@youx-pub ~]# docker run -itd -m 1024M --memory-swap=1024M --cpus=1.5 --cpuset-cpus="1,3" --restart=always --name bigdata1 -p 20080:80 -p 20022:22 -v /home/docker/volum/node-pub2:/data --privileged=true centos7:v0.2 /usr/sbin/sshd -D

上面的表示使用第二,第四个CPU,使用CPU核心数量是1.5个。
然后再在。
在这里插入图片描述

9 Docker集群管理工具kubernetes搭建

参考博文:https://blog.csdn.net/jay763836801/article/details/52648280

10 Centos7基于lxcfs增强Docker隔离能力(docker free显示问题)

参考博文:https://blog.csdn.net/shida_csdn/article/details/79196258
在宿主操作系统为Centos7上安装lxcfs软件

yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm

lxcfs-2.0.5-3.el7.centos.x86_64.rpm(下载地址:https://copr-be.cloud.fedoraproject.org/results/ganto/lxd/epel-7-x86_64/00486278-lxcfs/)

将文件放到:/root目录下
lxcfs-2.0.5-3.el7.centos.x86_64.rpm
在这里插入图片描述
在这里插入图片描述

启动lxcfs

systemctl start lxcfs

或者直接执行启动命令:

lxcfs /var/lib/lxcfs &

配置容器启动参数
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw

-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw

 -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw

-v /var/lib/lxcfs/proc/stat:/proc/stat:rw

-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw

-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw

只要容器启动时映射了宿主机的这些文件,即可修正 free、top等命令的错误显示

示例:

docker run -itd -m 20g --memory-swap=20g --cpus=4 --cpuset-cpus="16,17,18,19" --restart=always --name bigdata6 -v /data/disk-two/lost+found/bigdata6:/data -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw -v /var/lib/lxcfs/proc/stat:/proc/stat:rw -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw --privileged=true --net zjnet --ip xxx.xxx.xxx.xxx -p xxxx:22 centos7.5.1804.v0.2:latest /usr/sbin/sshd -D

11 修改5台机器的hosts和hostname

分别类似如下:

vim /etc/hosts
172.19.0.2      bigdata2
172.19.0.3      bigdata3
172.19.0.4      bigdata4
172.19.0.5      bigdata5
172.19.0.6      bigdata6

修改各自hostname

vim /etc/hostname

bigdata2     (依次类推,配置后面各台机器)

修改完成之后,发现宿主机器上有如下变化:
在这里插入图片描述

12 对运行中的Docker容器添加端口映射

原文:https://blog.csdn.net/weixin_36343850/article/details/79954174
解决方案:

iptables -t nat -A DOCKER -p tcp --dport ${YOURPORT} -j DNAT --to-destination ${CONTAINERIP}:${YOURPORT}

iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source ${CONTAINERIP} --destination ${CONTAINERIP} --dport ${YOURPORT}

iptables -A DOCKER -j ACCEPT -p tcp --destination ${CONTAINERIP} --dport ${YOURPORT}

总共有3条命令,把他们运行在安装了docker的宿主机上。其中就修改两个参数:
${CONTAINERIP} 就是对应容器的ip地址,比如我的容器ip地址是 172.19.0.2 ,(容器的IP可以通过如下方式查看:a.在容器中:ip addr;b.在宿主机中: docker inspect 容器名 |grep IPAddress )所以我就把上述的参数换成我的IP地址。
${YOURPORT} 就是要映射出来的端口,我配置的是一个hadoop平台,其端口是8088

最终我的命令是:

sudo iptables -t nat -A DOCKER -p tcp --dport 8088 -j DNAT --to-destination 172.19.0.2:8088

sudo iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source 172.19.0.2 --destination 172.19.0.2 --dport 8088

sudo iptables -A DOCKER -j ACCEPT -p tcp --destination 172.19.0.2 --dport 8088

腾讯云上安全组中添加规则:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/toto1297488504/article/details/88659016