Docker,为两个容器创建网络的正确方法

时间:2018-04-11 11:20:11

标签: docker

关于码头工人间的沟通。

鉴于--link标志已弃用(我读过),首选方法是创建新网络,如:

docker network create my_network

然后用--network my_network创建两个容器,即:

docker run --name container1 --network my_network -d iamsecret -p 1234:1234
docker run --name container2 --network my_network -d iamawebserver -p 80:80

我如何实现:

  1. 指定将哪个子网和哪些IP 静态分配给网络和我的两个容器(因此我可以在代码中引用它们)。例如,让我说我希望我的网络使用172.16.23.0; container1172.16.23.2container2172.16.23.3
  2. 仅允许container1container2进行对话(就像它是数据库一样)
  3. 允许container2container1通话,但同时可以通过我的电脑访问(例如,如果它是网络服务器)。
  4. 由于

2 个答案:

答案 0 :(得分:0)

嗯,我找到了一种方法,但我确信有一种更简单,更优雅的方式。积分转至http://www.dasblinkenlichten.com/docker-networking-101/

#start containers attached to bridge default network, both open at this point
docker run --name container1 --network bridge ...
docker run --name container2 --network bridge ...

# create new internal network with my ips
docker network create --internal --driver=bridge --subnet=172.16.23.0/24 --gateway=172.16.23.1 mynet

# disconnect secret host from public bridge
docker network disconnect bridge container1

# connect containers to secret network with my chosen ips
docker network connect --ip 172.16.23.2 mynet container1
docker network connect --ip 172.16.23.3 mynet container2

如果您认为有更好的方法或上面的错误,请添加您的答案! 感谢

答案 1 :(得分:0)

使用docker-compose可能更容易。

您需要一个docker-compose.yml文件(参见下面的示例),它将按照上一节创建网络,按照前两个部分构建映像,将容器端口映射到网络端口,然后附加容器到网络。

version: '3'

services:
  container1:
    image: container1
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - "5100:80"
    depends_on:
      - container2
    networks:
      mynetwork:
        ipv4_address: 172.16.1.10
  container2:
    image: container2
    build:
      context: ./container2
      dockerfile: ./Dockerfile
    ports:
      - "5200:80"
    networks:
      mynetwork:
        ipv4_address: 172.16.1.20
networks:
  mynetwork:
    driver: bridge
    ipam:
      driver: default
      config:
      -
        subnet: 172.16.1.0/24
      -
        subnet: 2001:3984:3989::/64

设置好docker-compose文件后,运行它:

docker-compose up

将其删除:

docker-compose down

强制它重建图像(如果在使用现有图像之前构建):

docker-compose up --build