Docker容器分层、容器互联

93 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

1.Docker容器分层、容器互联

1.首先备份镜像
[root@192.168.146.112~]# docker save centos:latest > centos_latest.tar.gz
[root@192.168.146.112/data/load]# docker image rm -f 3bdc0e2059e

2.导入镜像(也称为恢复镜像,但是恢复镜像是,把我们备份的原镜像给删除了,叫做恢复镜像)
[root@192.168.146.112/data/load]# docker load -i kod.tar.gz
b978a9e149dd: Loading layer [==================================================>]  320.2MB
d08323497927: Loading layer [==================================================>]   7.68kB
fc2e71fa98c3: Loading layer [==================================================>]  3.584kB
7784014011bf: Loading layer [==================================================>]   2.56kB
6bb7b775029c: Loading layer [==================================================>]   13.9MB
f371d75a09a7: Loading layer [==================================================>]   47.5MB
ae96d2f236ce: Loading layer [==================================================>]   12.8kB
750085bb022a: Loading layer [==================================================>]   2.56kB
Loaded image I: sha256:3bdc0e2059e28f49ee65589b4f863b0957224e8860d240a62f8f81075e365093

1.2.镜像分层

镜像封层类似于kvm链接克隆,只保留修改过的内容

镜像封层的好处:节省磁盘空间,相同的内容只需加载一份到内存

图片.png

每当使用docker load导入一个镜像时(前提删除这个镜像)就会发现会分为好几层,layer是层的意思,每一层 对应不同执行命令所产生的数据,在使用dockerfile时定义RUN,每一个RUN就是一层,可以用docker image history镜像名来查看镜像构建的历史

[root@192.168.146.112/data/load]# docker image history centos6.9_kod_ssh:v2
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
cd399b582b32   45 hours ago   /bin/sh -c #(nop)  CMD ["/usr/sbin/sshd" "-D…   0B
8a66366049a8   45 hours ago   /bin/sh -c #(nop)  VOLUME [/data/kodexporer]    0B
f1319de89708   46 hours ago   /bin/sh -c #(nop) WORKDIR /data/kodexporer      0B
b6f1f80cb580   46 hours ago   /bin/sh -c echo redhat | passwd --stdin root    537B
8674d4eb75ce   46 hours ago   /bin/sh -c /etc/init.d/sshd start               4.91kB
4c37e9896f0b   46 hours ago   /bin/sh -c yum -y install openssh-server        181MB
ef69dbd3f366   2 days ago     /bin/sh -c curl -o /etc/yum.repos.d/CentOS-B…   4.8kB
ee1ec9ba61ac   2 days ago     /bin/sh -c rm -rf /etc/yum.repos.d/*            0B
2199b8eb8390   2 years ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      2 years ago    /bin/sh -c #(nop)  LABEL name=CentOS Base Im…   0B
<missing>      2 years ago    /bin/sh -c #(nop) ADD file:0e6d175401c5b4260…   195MB

我们从上面中可以看到有多行都是大于小于0的,大于0表示这个命令对容器产生了数据,每次对容器写数据都会产生分层,每层都保留对容器更改过的数据

容器分层的原理

每当运行一个镜像后,镜像处于只读层,当执行命令时,会对容器产生操作,操作后会多出来一层,作为容器 可写层,并产生一个parent id,在执行一条命令产生了数据就又多出来一层,也是可写层,parent id就是 上一层的值,以此类推,当有parent id时,再出现同样的操作,就会提示有缓存,命令很快就会执行完,当 后期修改dockerfile时,如果改的是前面的部分则从修改的地方开始一直到最后都不会有缓存机制。因此建议 每次修改dockerfile都在最后修改

2.容器互连

很多时候是需要多个容器相互配合来构建出一个相对稳定的平台,连接的时候需要知道容器各自的IP地址,但是由于一开始 不知道,所以就用到了容器互连技术,通过docker run的–link参数,将一个已经存在的容器设置一个好记的名称,当容器 启动后,会在本地hosts文件中多出来一行解析,里面包含了要连接的那个容器的IP地址、主机名,这时就可以通过ssh命令 进行连接 容器使用–link参数表示要与哪个容器进行互联,被连接的一定要先启动,然后需要去连接的容器就可以使用–link参数与 其进行连接,比如有一个PHP+nginx的容器,和一个mysql、nfs的容器,这时就需要先将mysql和nfs容器分别启动,再由 php+nginx的容器去连接数据库容器,要连接多个容器则使用多个–link即可

语法格式:

docker run -itd --link 已经存在的容器名:别名 镜像名 执行的命令

–link参数是单方向的,也就是说只有需要连接的容器端才会有hosts文件解析,被连接端是没有的

3.利用容器互连实现zabbix的安装

3.1.安装并运行mysql容器

[root@192.168.146.112~]# docker run --name mysql-server -it -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="123456" -e MYSQL_ROOT_PASSWORD='redhat' -d -p 3306:3306 mysql:5.7 --character-set-server=utf8 --collation-server=utf8_bin
028358a5cac5f25a95cac45f4d2bc3f6ea26e9acf2a3af93f962ec40679c3b26

命令解释:
        -e:指定环境变量
        -p:端口映射
        --chara:表示dockerfile中用的entrypoint的启动命令,这边表示启动的参数

3.2.安装并运行zabbix-java-gateway容器

拉取zabbix/zabbix-java-gateway:latest镜像,容器名字:zabbix-java-gateway
[root@192.168.146.112~]# docker run --name zabbix-java-gateway -it -d zabbix/zabbix-java-gateway:latest
a1f00e7ff3179d5e6602aac5c524498dad2ebd04cfc3497eddfb0eefa1ff7808

3.3.安装并运行zabbix配置mysql容器

1.其中连接了mysql容器和zabbix-java-gateway容器
[root@192.168.146.112~]# docker run --name zabbix-server-mysql -it -d -e DB_SERVER_HOST="mysql-server" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="123456" -e MYSQL_ROOT_PASSWORD="redhat" -e ZBX_JAVAGATEWAY="zabbix-java-gateway" --link mysql-server:mysql --link zabbix-java-gateway:zabbix-java-gateway -p 10051:10051 zabbix/zabbix-server-mysql:latest
00c30989daa115c5b25dd43823835e7df806b25af7c1418d1ff33eb5d977fce1

解释说明:
 --linke mysql-server:mysql 表示与mysql-server的容器互连,简称为mysql,必须是mysql-server启动后才可以指定
--link zabbix-java-gateway:zabbix-java-gateway表示与zabbix-java-gateway容器互连,简称为zabbix-java-gateway,必须在启动当前容器之前就要启动完成

3.4安装并运行zabbix+nginxweb界面

1.其中连接了mysql容器和zabbix配置mysql容器
docker run --name zabbix-web-nginx-mysql -it -d -e DB_SERVER_HOST="mysql-server" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="123456" -e MYSQL_ROOT_PASSWORD="redhat" --link mysql-server:mysql --link zabbix-server-mysql:zabbix-server -p 80:8080 zabbix/zabbix-web-nginx-mysql:latest
9df54423e5b27c6033a273da9cfdc2e26ae2cf16e5cf88155201777f77c119d5

解释说明:
--link mysql-server:mysql表示与mysql容器互连,将mysql容器的ip地址主机名写到hosts解析中
--link zabbix-server-mysql表示与zabbi-server-mysql容器互连
注意最新版本的zabbix-web-nginx-mysql容器用的端口是8080,因此要将本机的80端口映射成容器的8080端口否则会访问不到页面(必须得是80端口)

4.登录zabbix

默认账号密码Admin/zabbix

图片.png

图片.png

图片.png

图片.png

4.1.测试一下(随便添加一个主机)

被监控端--zabbix-agentd,给平常安装zabbix-agentd一样
#安装zabbix-agent 
yum -y install zabbix-agent

#配置zabbix agent
vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.146.101
ServerActive=192.168.146.101

egrep '^[a-z]|^[A-Z]' /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=192.168.146.112
ServerActive=192.168.146.112
Hostname=Zabbix server
Include=/etc/zabbix/zabbix_agentd.d/*.conf

#启动zabbix-agent
systemctl start zabbix-agent.service
systemctl enable zabbix-agent.service

图片.png