Docker容器链接与编排
容器链接
前面学习到的端口映射,并不是唯一把docker连接到另一个容器的方法。
docker有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。
有时出于安全原因,可以强制docker只允许有连接的容器之间互相通信,可以在启动docker守护进程的时候,加上--icc=false,关闭没有连接的容器间通信。
在docker run的时候, 指定--link :标志创建了两个容器间的父子连接,这样容器就不用暴露端口了,大大增加安全性。
基本使用
基本语法:--link 要连接的容器的名字:这个链接的别名
1:执行连接需要依靠容器的名字,因此创建每一个容器的时候,请使用--name来命名。
注意:容器的名称必须是唯一的。如果想使用重复的名称来命名容器,需要使用
docker rm
命令删除以前的容器。
2:被连接的容器必须运行在同一个Docker宿主机上
示例:
docker run --name db -e MYSQL_ROOT_PASSWORD=123321qq -d mysql
docker run -d -p 9080:8080 --name web --link db:dblink cctomcat:9.0
3:可以通过docker inspect查看里面的Links,如: "/db:/web/dblink"
如果启动的时候,出现类似如下的错误:
COMMAND_FAILED: '/usr/sbin/iptables -w2 -t nat -A DOCKER -p tcp -d 0/0 --dport
9080 -j DNAT --to-destination 172.17.0.4:8080 ! -i docker0' failed:
这可能是网络问题造成,解决方法如下:
1:首先先验证docker容器内部网络是否能ping通宿主机如果能ping通,即可通过重建docker0网络恢复
2:先停掉宿主机上运行的docker容器,然后执行以下命令
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
3:重启docker服务
使用容器连接来通信
最简单的方法就是在子容器里面,也就是web里面,直接使用link的别名来代替具体的host或者是ip地址,比如:
jdbc:mysql://dblink:3306/mydb
容器编排
编排简介
Docker的最佳实践建议:一个容器只运行一个进程。而实际的应用会由多个组件构成,要运行多个组件就需要运行多个容器,这就需要对这多个容器进行编排。
所谓编排:主要就是多个docker容器的自动配置、协作和管理服务的过程。Docker提供了docker-compose工具来实现。
Docker-compose简介
compose是用来定义和运行一个或多个容器应用的工具,使用python开发,通过yml文件来定义多个容器应用,非常适合在单机环境下部署一个或多个容器,并自动把多个容器互相关联起来。
其实,docker-compose做的就相当于解析配置文件,然后按照配置去执行一系列的docker命令。
Docker-compose安装
官方安装文档:https://docs.docker.com/compose/install/
Docker-compose基本示例
1:准备好要启动的镜像,虽然可以直接在compose里面build镜像,建议还是先准备好
2:编写docker-compose.yml
3:然后就docker-compose up -d,启动就好了
4:docker-compose.yml示例如下:
version: '2'
services:
mysqldb:
image: 'mysql:5.7'
environment:
- MYSQL_ROOT_PASSWORD=123321qq
volumes:
- /home/dev/mysqldata:/var/lib/mysql
privileged: true
web:
image: 'cctomcat:9.0'
ports:
- "9080:8080"
volumes:
- /home/dev/tomcat9docker/webapps/test:/usr/local/tomcat/webapps/test
privileged: true
links:
- mysqldb:dblink
Docker-compose yml文件的配置
1:一份标准配置文件可以包含version、services、networks 三大部分,详细的参照指南见官方网站:https://docs.docker.com/compose/compose-file/
2:version目前是有1,2,3这么三个
3:srvices常见的配置有:
(1)服务名称:用来表示一个服务,自定义的
(2)image:指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像,Build和image必须使用一个。
(3)build:服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up 启动之时执行构建任务,这个构建标签就是build,它可以指定Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。如果你同时指定了image 和build 两个标签,那么Compose 会构建镜像并且把镜像命名为image 后面的那个名字。
(4)args:类似Dockerfile 中的ARG 指令,可以在构建过程中指定环境变量,构建成功后取消
(5)command:使用command 可以覆盖容器启动后默认执行的命令
(6)container_name:自定义容器的名称
(7)links:指定与其它容器的连接,与Docker client的--link一样效果
(8)volumes:将host主机上的路径或文件,挂载到容器中
(9)ports:将host主机的端口映射到容器的某个端口
(10)environment:设置环境变量, 与Dockerfile 中的ENV 指令一样会把变量一直保存在镜像、容器中,类似docker run -e 的效果
(11)privileged:设置挂载目录的权限
(12)depends_on:一般项目容器启动的顺序是有要求的,可以用depends_on来解决容器的依赖、启动先后的问题。
Docker-compose 的networks配置
容器间的通讯,除了使用--link外,现在更推荐使用自定义网络,然后利用服务名进行通讯。每个自定义网络都可以配置很多东西,包括网络所使用的驱动、网络地址范围等设置。例如:
networks:
frontend:
backend:
1:你会看到frontend、backend后面是空的,这是指一切都使用默认,换句话说,在单机环境中,将意味着使用bridge 驱动;而在Swarm 环境中,使用overlay 驱动,而且地址范围完全交给Docker 引擎决定。
2:然后在每个services配置里面,也有一个networks,用来指定服务要连接到哪些网络上,可以指定多个,例如:
services:
nginx:
...
networks:
- frontend
web:
...
networks:
- frontend
- backend
mysql:
...
networks:
- backend
3:连接到同一个网络的容器,可以进行互连;而不同网络的容器则会被隔离。
4:处于同一网络的容器,可以使用服务名访问对方
5:给前面的例子添加networks的配置,如下:
version: '2'
services:
mysqldb:
image: 'mysql:latest'
environment:
- MYSQL_ROOT_PASSWORD=cc
volumes:
- /home/dev/mysqldata:/var/lib/mysql
privileged: true
networks:
- frontend
web:
image: 'cctomcat:9.0'
ports:
- "9080:8080"
volumes:
- /home/dev/tomcat9docker/webapps/test:/usr/local/tomcat/webapps/test
privileged: true
links:
- mysqldb:dblink
networks:
- frontend
networks:
frontend:
backend: