Docker容器的IP地址是变动的,在容器间调用服务时就需要解决互访问题。
方法一:使用容器的--link参数在建立容器时指定依赖关系(此方式已经不建议使用)
方法二:使用“User-defined network”方式
容器link参数
此方式适用于同一个主机内的容器间的互访。
docker run --name c4weixin --link c4service:c4service --link objstsvr:objstsvr -e C4SERVICE_HOST=c4service -e OBJSTSVR_URL=http://objstsvr --restart=always -t -i nihw/c4weixin /bin/bash
link参数自定依赖后,在容器的/etc/hosts
中会有对应的主机名和IP地址,访问其它容器使用主机名访问即可,如:上面的c4sevice和objstsvr。
- 使用主机名访问其他容器的服务,同一个主机内的服务;
- 当容器被删除后再次以同样的名字建立时,依赖的容器也需要重新建立(docker run);
官方已经不建议使用此方式,请查看说明:https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/
User-defined network
使用用户自定义网络后,系统中将使用docker内置的dns来解析主机名,并且自动维护,无需用户自己维护,相比link要简便许多。
先建立两个容器来测试下
docker run -itd --name=container1 busybox docker run -itd --name=container2 busybox
完成后是加入的默认网络,我们需要建立“User-defined network”,此网络为隔离网络,只有加入同一个网络的容器可以互访
docker network create appnetwork
将容器加入“User-defined network”
docker network connect appnetwork container1 docker network connect appnetwork container2
测试容器互访
docker exec container1 ping container2
也可以在创建时用--network
指定容器使用的网络,因为有些管理软件是在容器被创建时获取的网络配置信息,如Traefik。
docker run -itd --name=container1 --network=appnetwork busybox
更多内容请查看:https://docs.docker.com/engine/userguide/networking/work-with-networks/#basic-container-networking-example