本文主要介绍如何优雅的让 Docker 容器和 Docker 容器之间相互通信,以及 Docker 容器如何和宿主机进行网络通信。

容器间网络通信

docker 容器间通信常见的方式是使用 –link 进行连接,但是 Docker 已经弃用这种方式,并且容器数量一旦一多,–link 会显得很乱。官方推荐使用自定义网络来进行互联。

创建自定义网络

1
docker network create my-network

创建容器使用自定义 network

比如一个 nginx 容器需要访问 php 容器

1
2
docker run -p 80:80 --network my-network nginx
docker run --name php --network my-network php

这个时候 nginx 可以直接通过 php 来访问 php 容器,打开/etc/hosts 可以发现是 docker 自动帮你添加了解析

容器访问主机服务

可以使用容器的网关 IP 来访问(nat 网络),不过使用 ip 不优雅,旧版本的 Docker 可以使用 host.docker.internal 来访问主机,新版本的无法直接访问,可以通过 docker run 增加启动参数来兼容这种方案

1
2
3
4
5
6
7
8
9
10
11
docker run --name nginx \
-v "$(pwd)"/www:/usr/share/nginx/html:ro \
-v "$(pwd)"/conf/nginx.conf:/etc/nginx/nginx.conf \
-v "$(pwd)"/conf/conf.d:/etc/nginx/conf.d \
-v "$(pwd)"/conf/ssl:/etc/nginx/ssl \
-p 80:80 \
-p 443:443 \
--add-host=host.docker.internal:host-gateway \
--network iuxt \
--restart always \
-d nginx

之后就可以在容器内通过 host.docker.internal 来访问主机了。

使用固定的 ip 进行通信

如果想固定每个容器的 IP,比如想部署一个 ElasticSearch 集群,需要每个节点 IP 都配置到配置文件里面。可以使用这种方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 创建一个Docker网络
docker network create --subnet=172.16.0.0/24 elasticsearch-br0

# 每个容器手动指定使用这个Docker网络,并分配固定的IP
docker run -d --name elasticsearch1 \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-v "$(pwd)"/elasticsearch1.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro \
-v es-data1:/usr/share/elasticsearch/data:rw \
-v es-logs1:/usr/share/elasticsearch/logs:rw \
--network elasticsearch-br0 \
--ip 172.16.0.11 \
-p 9201:9200 -p 9301:9300 \
elasticsearch:7.16.2

docker run -d --name elasticsearch2 \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-v "$(pwd)"/elasticsearch2.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro \
-v es-data2:/usr/share/elasticsearch/data:rw \
-v es-logs2:/usr/share/elasticsearch/logs:rw \
--network elasticsearch-br0 \
--ip 172.16.0.12 \
-p 9202:9200 -p 9302:9300 \
elasticsearch:7.16.2

docker run -d --name elasticsearch3 \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-v "$(pwd)"/elasticsearch3.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro \
-v es-data3:/usr/share/elasticsearch/data:rw \
-v es-logs3:/usr/share/elasticsearch/logs:rw \
--network elasticsearch-br0 \
--ip 172.16.0.13 \
-p 9203:9200 -p 9303:9300 \
elasticsearch:7.16.2