两个或多个docker容器之间通过名字相互访问

前言

由于容器的 IP 地址会在容器重启后发生变化,因不能写死 IP 地址,使用容器的名字访问容器服务是最优的,所以就有了下文。

1.使用 --link 参考

docker run --link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,并且接收容器可以获取源容器的一些数据,如源容器的环境变量。

--link的格式:

--link <name or id>:alias

其中,name和id是源容器的name和id,alias是源容器在link下的别名。

举例:

源容器

创建并启动名为nginx_test的容器。

[root@ambari01 ~]# docker run -d --name nginx_test nginx

接收容器

创建并启动名为node的容器,并把该容器和名为nginx的容器链接起来。

[root@ambari01 ~]# docker run -itd --name node --link nginx_test:nginx centos:7 bash

其中:

--link nginx_test:nginx

nginx_test是上面启动的源容器的名字,nginx是该容器在link下的别名,可省略。

通俗易懂的讲,站在node容器的角度,nginx_test和nginx都是指向提供nginx服务容器的名字,并且作为容器的hostname,node用这2个名字中的任何一个都可以访问到那个容器并与之通信(docker通过DNS自动解析)。我们可以来看下:

进入node容器:

[root@ambari01 ~]# docker exec -it nginx

[root@2398e6006f7e /]#  ping nginx
PING nginx (172.17.0.5) 56(84) bytes of data.
64 bytes from nginx (172.17.0.5): icmp_seq=1 ttl=64 time=0.064 ms
64 bytes from nginx (172.17.0.5): icmp_seq=2 ttl=64 time=0.045 ms
 
[root@2398e6006f7e /]#  ping nginx_test
PING nginx (172.17.0.5) 56(84) bytes of data.
64 bytes from nginx (172.17.0.5): icmp_seq=1 ttl=64 time=0.060 ms
64 bytes from nginx (172.17.0.5): icmp_seq=2 ttl=64 time=0.058 ms
 

[root@2398e6006f7e /]# ping node
ping: node: Name or service not known

当使用--link时,docker会自动在接收容器内创建基于--link参数的环境变量:

docker会在接收容器中设置名为<alias>_NAME的环境变量,我们进入node容器,看下此环境变量:

[root@ambari01 ~]# docker exec -it node /bin/bash
[root@2398e6006f7e /]#  env | grep -i nginx_name
NGINX_NAME=/node/nginx

另外,docker还会在接收容器中创建关于源容器暴露的端口号的环境变量,这些环境变量有一个统一的前缀名称:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要实现 Docker 容器相互访问,可以通过以下几种方式: 1. 使用 Docker 网络:在 Docker 中,每个容器都有自己的 IP 地址,并且可以在同一个网络中相互通信。可以创建一个自定义的 Docker 网络,将需要相互通信的容器加入到同一个网络中,然后它们就可以使用容器名称或者 IP 地址来相互访问了。 2. 使用容器名称访问:在 Docker 中,每个容器都有一个唯一的名称,可以使用容器名称访问其他容器。当一个容器需要访问另一个容器时,可以使用该容器名称作为主机名进行访问。 3. 使用容器的 IP 地址访问:每个容器都有自己的 IP 地址,可以通过容器的 IP 地址来进行访问。可以通过 Docker 命令 `docker inspect` 来查看容器的 IP 地址,然后使用该 IP 地址进行访问。 4. 使用容器的端口映射:如果需要让外部的容器能够访问到某个容器内部的服务,可以通过容器的端口映射来实现。可以在运行容器时通过 `-p` 参数来指定端口映射规则,然后可以使用外部主机的 IP 地址和映射的端口来访问容器内部的服务。 5. 使用 Docker DNS 服务:当容器在同一个网络中时,Docker 会自动提供 DNS 服务,使得在容器中可以使用容器名称进行域名解析。可以通过容器名称加上服务的域名后缀来进行访问。 以上是实现 Docker 容器相互访问的几种常见方式,可以根据具体的需求和场景选择适合的方法来实现容器之间的通信和访问。 ### 回答2: 在Docker中,容器之间可以通过网络互相访问。要让容器相互访问,有以下几个步骤。 首先,我们需要创建一个网络。可以使用以下命令来创建一个网络: ``` docker network create mynetwork ``` 该命令将创建一个名为mynetwork的网络。 接下来,我们可以将容器连接到这个网络中。在创建容器时,可以使用`--network`选项将容器连接到我们创建的网络。例如,我们创建两个容器container1和container2,并将它们连接到mynetwork: ``` docker run --name container1 --network mynetwork image1 docker run --name container2 --network mynetwork image2 ``` 通过`--network`选项,我们可以将容器连接到指定的网络。 此时,container1和container2就可以相互访问了。它们可以使用容器名称来进行访问,因为Docker会自动为每个容器分配一个DNS记录,以容器名称作为主机名。例如,如果container1需要访问container2中的某个服务,可以使用容器名称作为主机名: ``` curl http://container2:port ``` 这样就可以从container1中访问container2。 另外,我们还可以通过网络别名来进行访问。在连接容器到网络时,可以使用`--network-alias`选项为容器指定一个别名。例如,我们可以将container2的别名设置为service2: ``` docker run --name container2 --network mynetwork --network-alias service2 image2 ``` 现在,container1可以使用service2作为主机名来访问container2中的服务: ``` curl http://service2:port ``` 这样就可以从container1中访问container2。 通过以上步骤,我们可以实现Docker容器之间相互访问。 ### 回答3: Docker容器之间相互访问可以通过容器间的网络进行实现。Docker提供了三种网络模式,包括默认的桥接网络、主机网络和容器网络,可以根据具体需求选择不同的网络模式来实现容器间的通信。 在默认的桥接网络模式下,Docker会为每个容器分配一个IP地址,并创建一个名为docker0的虚拟网桥。在该网络下,容器之间可以通过容器的IP地址进行相互访问。可以使用容器名称或者IP地址作为主机名进行访问,例如可以使用ping命令来测试容器之间的连通性:ping <容器名称或IP地址>。 在主机网络模式下,容器和宿主机共享同一个网络命名空间,容器直接使用宿主机的IP地址和端口进行通信。在该网络模式下,不需要进行端口映射,容器之间可以直接使用localhost或者本地IP地址进行访问容器网络模式允许用户自定义网络,可以创建多个容器并将它们连接到同一个自定义网络中。在自定义网络中,容器之间可以使用容器名称或者服务名称进行通信。可以使用docker network create命令创建自定义网络,使用docker network connect命令将容器连接到自定义网络中。 综上所述,Docker容器之间相互访问可以通过容器的IP地址、容器名称、服务名称等方式来实现。可以根据实际需要选择不同的网络模式,灵活地实现容器间的通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值