docker容器间互联
单机部署的时候考虑,能不能使docker各个容器间互通呢。比如我的web应用容器可以和db容器间互通,而不是现在这样再web应用调用本机ip去访问。网上查了一下还真有这种方法。还有两种方法:1、links在容器启动时,启动命令中加入links指定链接的容器:docker run -itd --name nginx-web02 --link nginx-web:nginx01 -p 81:81 su
单机部署的时候考虑,能不能使docker各个容器间互通呢。比如我的web应用容器可以和db容器间互通,而不是现在这样再web应用调用本机ip去访问。
网上查了一下还真有这种方法。还有两种方法:
1、links
在容器启动时,启动命令中加入links指定链接的容器:
docker run -itd --name nginx-web02 --link nginx-web:nginx01 -p 81:81 sunmmi/nginx nginx
run容器nginx-web02时,link容器nginx-web,其中nginx-web:nginx01前面是链接哪个容器名,后面是对这个容器别名.
进入nginx-web02容器,查看hosts文件,nginx-web,nginx01已经增加到hosts文件中.
[root@37e693a5f7a3 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 nginx01 7d89f9196f78 nginx-web
172.17.0.3 37e693a5f7a3
此时在容器1中就能通过别名直接Ping通容器2了。测试:
[root@37e693a5f7a3 /]# ping nginx01
PING nginx01 (172.17.0.2) 56(84) bytes of data.
64 bytes from nginx01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from nginx01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.170 ms
2、network
第二种也是在容器启动时,启动命令中加入network指定局域网络:
首先创建一个新的 Docker 网络:
$ docker network create -d bridge my-net
运行一个容器并连接到新建的 my-net 网络
$ docker run -it --rm --name busybox1 --network my-net busybox sh
打开新的终端,再运行一个容器并加入到 my-net 网络
$ docker run -it --rm --name busybox2 --network my-net busybox sh
下面通过 ping 来证明 busybox1 容器和 busybox2 容器建立了互联关系。在 busybox1 容器输入以下命令
/ # ping busybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms
用 ping 来测试连接 busybox2 容器,它会解析成 172.19.0.3。同理在 busybox2 容器执行 ping busybox1,
/ # ping busybox1
PING busybox1 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.064 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.143 ms
这样,busybox1 容器和 busybox2 容器建立了互联关系。
network 官方 docker-compose.yml ,替换links的方法:
2.1、network固定子网络Ip
适用于链接redis等需要固定ip的场景,需要设置两点1、容器的networks:ipv4_address,再单独配置networks:config:subnet,gateway,参照下面实例:
version: "3.9"
networks:
loki:
ipam:
driver: default
config:
# 子网络
- subnet: "172.22.0.0/24"
gateway: 172.22.0.1
services:
resty:
image: beyond147896/resty:latest
ports:
- "80:80"
- "443:443"
networks:
loki:
# 固定子网ip,网段必须在子网络172.22.*.*
ipv4_address: 172.22.0.2
redis:
image: redis:latest
ports:
- "6379:6379"
networks:
loki:
# 固定子网ip,网段必须在子网络172.22.*.*
ipv4_address: 172.22.0.99
在web应用的配置中也可以直接写上面配置的ipv4_address固定Ip连通。
如果首次启动出现报错,可能是docker-compose的版本不够高,升级版本后可能可以解决。
如果第二次启动出现报错,可能是网络占用,使用docker-compose up之后,docker-compose会创建一个名称为: {项目名}_{网络名} 的网络,一旦创建了这个网络,docker-compose 将永远不会删除它。所以当修改了docker-compose.yaml文件后,第二次运行docker-compose up时,使用的还是之前创建的loki_loki网络。
解决方法将之前创建的网络手动删除:
$ docker network rm loki_loki
$ docker-compose up
参考文档:
https://blog.csdn.net/pushiqiang/article/details/78682323
更多推荐
所有评论(0)