4.镜像分层
镜像封层类似于kvm链接克隆,只保留修改过的内容
镜像封层的好处:节省磁盘空间,相同的内容只需加载一份到内存
每当使用docker load导入一个镜像时就会发现会分为好几层,layer是层的意思,每一层对应不同执行命令所产生的数据,在使用dockerfile时定义RUN,每一个RUN就是一层,可以用docker image history 镜像名来查看镜像构建的历史
[root@docker01 ~]# docker image history centos69_kod_df:v4
上图中多行都有大小大于0的,大于0表示这个命令对容器产生了写数据,每次对容器写数据都会产生分层,每层都保留对容器更改过的数据
容器分层的原理
每当运行一个镜像后,镜像处于只读层,当执行命令对容器产生了操作后会多出来一层,作为容器的可写层,并产生一个parent id,再执行一条命令产生了数据就又多出来一层,也是可写层,parent id就是上一层的值,一次类推,当有parent id时,再出现一模一样的操作时就会提示已经缓存过,命令将会很快执行完,当后期修改dockerfile时,如果改的是前面的部分则从修改的地方开始一直到最后都不会再有缓存机制,因此建议每次修改dockerfile都在最后部分修改
5.容器互连
很多时候是需要多个容器相互配合来构建出一个相对稳定的平台,连接的时候需要知道容器各自的IP地址,但是由于一开始不知道,所以就用到了容器互连技术,通过docker run的–link参数,将一个已经存在的容器设置一个好记的名称,当容器启动后,会在本地hosts文件中多出来一行解析,里面包含了要连接的那个容器的IP地址、主机名,这时就可以通过ssh命令进行连接
容器使用–link参数表示要与哪个容器进行互联,被连接的一定要先启动,然后需要去连接的容器就可以使用–link参数与其进行连接,比如有一个PHP+nginx的容器,和一个mysql、nfs的容器,这时就需要先将mysql和nfs容器分别启动,再由php+nginx的容器去连接数据库容器,要连接多个容器则使用多个–link即可
语法格式:
docker run -itd --link 已经存在的容器名:别名 镜像名 执行的命令
–link参数是单方向的,也就是说只有需要连接的容器端才会有hosts文件解析,被连接端是没有的
6.利用容器互连实现zabbix的安装
6.1.安装并运行mysql容器
[root@docker01 ~]# docker run --name mysql-server -it -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix_pwd" -e MYSQL_ROOT_PASSWORD="root_pwd" -d -p 3306:3306 mysql:5.7 --character-set-server=utf8 --collation-server=utf8_bin 4cb930948826b988d7c79d58bab5e367dea4c9f5529935a53a63bfd79a7b85f1 命令解释: --name指定容器的名字为mysql-server -e指定环境变量 -p端口映射 --chara表示dockerfile中用的entrypoint的启动命令,这边表示启动的参数
6.2.安装并运行zabbix-java-gateway容器
[root@docker01 ~]# docker run --name zabbix-java-gateway -it -d zabbix/zabbix-java-gateway:latest 501014ebd79f610043081bb9aca129b7d9f44970413b741257bfeb59f99f5dcb 命令解释: --name指定容器的命令
6.3.安装并运行zabbix配置mysql容器
[root@docker01 ~]# docker run --name zabbix-server-mysql -itd -e DB_SERVER_HOST="mysql-server" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix_pwd" -e MYSQL_ROOT_PASSWORD="root_pwd" -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 58f5a0ee0bdae836cfbc172a8b713298b652cb5d808fa537bf2ead2063598cf2 --name指定容器的名字 -e环境变量 --linke mysql-server:mysql 表示与mysql-server的容器互连,简称为mysql,必须是mysql-server启动后才可以指定 --link zabbix-java-gateway:zabbix-java-gateway表示与zabbix-java-gateway容器互连,简称为zabbix-java-gateway,必须在启动当前容器之前就要启动完成
6.9.安装并运行zabbix+nginxweb界面
[root@docker01 ~]# docker run --name zabbix-web-nginx-mysql -itd -e DB_SERVER_HOST="mysql-server" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix_pwd" -e MYSQL_ROOT_PASSWORD="root_pwd" --link mysql-server:mysql --link zabbix-server-mysql:zabbix-server -p 80:8080 zabbix/zabbix-web-nginx-mysql:latest 11d2065610e215d7b23ba70f9fd965b65ba09598b5a4e2ea340a340aa4eadb1f --name指定名字 -e指定环境变量 --link mysql-server:mysql表示与mysql容器互连,将mysql容器的ip地址主机名写到hosts解析中 --link zabbix-server-mysql表示与zabbi-server-mysql容器互连 注意最新版本的zabbix-web-nginx-mysql容器用的端口是8080,因此要将本机的80端口映射成容器的8080端口否则会访问不到页面
6.10.登录zabbix
账号Admin密码zabbix
6.11.添加一个主机