Docker容器之间通信的主要方式

1.通过容器ip访问

    容器重启后,ip会发生变化。通过容器ip访问不是一个好的方案。

2.通过宿主机的ip:port访问

    通过宿主机的ip:port访问,只能依靠监听在暴露出的端口的进程来进行有限的通信。

3.通过link建立连接(官方不推荐使用)

     运行容器时,指定参数link,使得源容器与被链接的容器可以进行相互通信,并且接受的容器可以获得源容器的一些数据,比如:环境变量。

# 源容器:mysql
docker run -itd --name test-mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7
#被链接容器 centos
docker run -itd --name test-centos --link test-mysql:mysql  centos /bin/bash
#进入test-centos
docker exec -it test-centos /bin/bash

直接通过 link的名字或者link时候取的别名就能进入:

通过link建立连接的容器,被链接的容器能 ping 通源容器,反过来不行。

在被链接的容器上查看环境变量

被链接容器会继承源容器的环境变量信息。

/etc/hosts中的主机条目不同,如果重新启动源容器,则不会自动更新存储在环境变量中的IP地址。我们建议使用主机条目 /etc/hosts来解析链接容器的IP地址。

除了环境变量之外,Docker还将源容器的主机条目添加到/etc/hosts文件中。

如果重新启动源容器,/etc/hosts链接容器上的文件将使用源容器的新IP地址自动更新,从而允许链接通信继续。

4.通过 User-defined networks(推荐)

使用 docker network 来创建一个桥接网络,在docker run的时候将容器指定到新创建的桥接网络中,这样同一桥接网络中的容器就可以通过互相访问。

创建网桥:

docker network create test-network

启动容器时,将容器加入到创建的网桥中:

docker run -it --network test-network --network-alias mysql  -e MYSQL_ROOT_PASSWORD=123 mysql:5.7

启动另一个容器:

docker run -it --network test-network --network-alias centos  centos /bin/bash

在docker-compose中可以进行如下配置:

... # 省略内容
services:
  service2:   # 服务名称
    ....	  # 省略内容
    networks: # 将容器加入指定网络,等同于docker network connect的作用
      mynet:  # 自定义的网桥名称
        aliases: # 用来设置服务别名,相同的服务可以在不同的网络上有不同的别名
          - service2

networks:
  mynet: # 自定义网桥的名称
    driver: bridge       

如果想让服务有特定的网段以及容器有特定的IP,可以在docker-compose.yaml中进行如下的配置:

... # 省略内容
services:
  service2:   # 服务名称
    ....	  # 省略内容
    networks: # 将容器加入指定网络,等同于 docker network connect 的作用
      mynet:  # 自定义的网桥名称
        aliases: # 用来设置服务别名,相同的服务可以在不同的网络上有不同的别名
          - service2
        ipv4_address: 10.172.100.5  # 给容器设置固定的IP

networks:
  mynet: # 自定义网桥的名称
    driver: bridge  
    ipam:
      config:
        - subnet: 10.172.100.0/24  # 设置网段

原文地址:https://blog.csdn.net/u013355826/article/details/84987233

你可能感兴趣的:(Docker,docker,运维,容器)