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

[ 编辑 | 历史 ]
最近由“jilili”在“2019-12-03 01:13:25”修改