如果你之前有 Docker
使用经验,你可能已经习惯了使用 --link
参数来使容器互联。
随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link
参数。
使用--link
在Docker中,--link
参数用于将一个容器链接到另一个容器。这使得两个容器可以相互通信,而不需要暴露它们的端口给外部网络。
使用--link
参数的一般语法为:
docker run --link <name or id>:<alias> <image>
其中,<name or id>
是要链接的容器的名称或ID,<alias>
是要为链接容器指定的别名,<image>
是要运行的镜像。
例如,如果要将一个名为mysql
的MySQL容器链接到一个名为webapp
的Web应用程序容器,可以使用以下命令:
docker run --name webapp --link mysql:db mywebapp
这将创建一个名为webapp
的新容器,并将其链接到名为mysql
的现有容器,并将别名db
分配给链接。在webapp
容器中,可以使用db
作为MySQL容器的主机名来访问MySQL服务,例如:
import pymysql
conn = pymysql.connect(host='db', port=3306, user='root', passwd='password', db='mydb')
在这个例子中,db
是在--link
参数中指定的别名,而不是MySQL容器的实际主机名。
使用--network
#新建网络
下面先创建一个新的 Docker 网络。
$ docker network create -d bridge my-net
-d
参数指定 Docker 网络类型,有 bridge
overlay
。其中 overlay
网络类型用于 Swarm mode,在本小节中你可以忽略它。
#连接容器
运行一个容器并连接到新建的 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
再打开一个新的终端查看容器信息
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b47060aca56b busybox "sh" 11 minutes ago Up 11 minutes busybox2
8720575823ec busybox "sh" 16 minutes ago Up 16 minutes busybox1
下面通过 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
容器建立了互联关系。
#Docker Compose
如果你有多个容器之间需要互相连接,推荐使用 Docker Compose。