docker-compose为我们带来了很多便利,可以批量安装大量的服务,针对大而复杂的系统可以一键部署,真的很方便,但大多数情况下都是一个单独的文件中配置所有的服务,有时需要分开配置,就需要网络配置了。
Docker-Conpose为应用创建一个网络,Docker-Compose为每个Service创建一个容器,并加入到这个网络中,被网络中的其它容器访问和发现。此容器能够以容器名称作为hostname标识,被其它容器访问。
在不使用Docker Compose的时候,将两个容器链接起来使用 --link
参数,相对来说比较简单,以 nginx 镜像为例子:
docker run --rm --name test1 -d nginx #开启实例test1
docker run --rm --name test2 --link test1 -d nginx #开启实例test2并与test1建立链接
这样 test2 与 test1 便建立了链接,就可以在 test2 中使用访问 test1 中的服务了,在docker-compose更简单。
示例docker-compose创建资源
docker-compose.yml
version: '2'
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
在myapp目录使用命令docker-compose up,将执行以下几步:
- 创建一个名为myapp_default的网络
- 以服务名(web、db)分别创建两个容器,添加到myapp_default网络中
- 以服务名(web、db)作为其hostname相互访问,如web可以postgres://db:5432访问db容器
更新容器
使用docker-compose up将停止并移除旧容器,重建新容器。
任何连接到旧容器的(其它容器的)连接将关闭,然后检测条件,根据容器名称查找并重建连接。
Links
默认情况下,Docker-Compose下的Servcie之间是可通过服务名称(容器名称,也即hostname)相互访问的。
links只不过为Service提供了以别名访问其它Service的一种方式。
容器连接external_links
我们以Docker-compose一键部署zk集群+dubbo-admin为例,将其拆开部署,如下:
zk.yml
version: '3'
services:
zoo1:
image: zookeeper:3.4 #zk镜像版本
container_name: zoo1
restart: always
hostname: zoo1 #容器名
ports:
- "2181:2181" #将左端口绑定到右端口上
environment: #配置zk集群环境变量
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo2:
image: zookeeper:3.4
container_name: zoo2
restart: always
hostname: zoo2
ports:
- "2182:2181"
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo3:
image: zookeeper:3.4
container_name: zoo3
restart: always
hostname: zoo3
ports:
- "2183:2181"
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
启动zk容器docker-compose -f zk.yml up -d
tomcat.yml
version: '3'
services:
dubbo-admin:
image: dubbo-admin:1.0
container_name: dubbo-admin
external_links:
- zoo1:zk #外部容器连接
#links:
# - zoo1:zk #配置容器link名,可理解为别名
#depends_on:
# - zoo1
# - zoo2
# - zoo3
ports:
- 7001:7001 #主机端口:容器端口
restart: always
启动tomcat容器docker-compose -f tomcat.yml up -d
注意,tomcat容器依赖于zk容器,所以要先启动zk容器。
接着我们使用ping来测试下连通性:
[root@localhost network]# docker exec -it dubbo-admin ping zoo1
PING zoo1 (192.168.96.3): 56 data bytes
64 bytes from 192.168.96.3: icmp_seq=0 ttl=64 time=0.128 ms
64 bytes from 192.168.96.3: icmp_seq=1 ttl=64 time=0.113 ms
64 bytes from 192.168.96.3: icmp_seq=5 ttl=64 time=0.112 ms
^C--- zoo1 ping statistics ---
[root@localhost network]# docker exec -it zoo1 ping dubbo-admin
PING dubbo-admin (192.168.96.5): 56 data bytes
64 bytes from 192.168.96.5: seq=0 ttl=64 time=0.127 ms
64 bytes from 192.168.96.5: seq=1 ttl=64 time=0.132 ms
64 bytes from 192.168.96.5: seq=2 ttl=64 time=0.135 ms
从上面得知,两个容器都能ping通。
学习交流群:64691032
网友评论