Networking

docker - 創建兩個容器有兩個不同的網路 ID,而不是使用預設的橋接網路

  • September 3, 2021

我的目標是,Jenkins容器將與Ansible容器“對話”,以便為**Jenkins管道創建Jenkins文件。

我預計這兩個容器將“加入”以橋接網路並獲得相同網路 ID 的 2 個 IP 地址,但是創建了另外兩個網路,並且每個容器都獲得了不同網路 ID 的 IP。

此外,預計這兩個容器將可以訪問網際網路。

因此,在我的 Windows 10 中,我正在執行 Docker Desktop,我有 2 個 docker-compose.yml 文件,

一個用於Jenkins容器:

version: '3.7'
services:
 jenkins:
   image: jenkins/jenkins:lts
   privileged: true
   user: root
   ports:
     - 8080:8080
     - 50000:50000
   container_name: jenkins

另一個,對於Ansible容器:

version: '2'
services:
 ansible:
   container_name: ansible
   hostname: ansible
   image: ansible
   volumes:
     - ~/product/ansible:/ansible
   working_dir: /ansible
   build:
     context: .
     dockerfile: Dockerfile
   dns:
     - 200.20.200.20

我為每個 docker-compose.yml 文件執行了以下命令,所以我有兩台獨立的機器:

docker-compose up --build

我檢查了容器的網路詳細資訊,發現每個容器都有不同的網路 ID,見下文:

PS > docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ansible
172.18.0.2
PS > docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' jenkins
172.19.0.2

檢查我的 docker 網路部分,發現除了bridgehostnone之外,還創建了 2 個網路:

PS > docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
8cefaed24885   ansible_default   bridge    local
44bedcd1622d   bridge            bridge    local
61e1c7f7051e   host              host      local
b5a7a7a424a4   jenkins_default   bridge    local
4e5d6c77cb5a   none              null      local

當然,檢查橋接網路顯示容器密鑰為空:

{
   "Name": "bridge",
   "Id": "44bedcd1622d820ce4e29a5cd545f244ba2d303102f1956fe76069a63e7c220e",
   "Created": "2021-08-25T13:13:57.6577149Z",
   "Scope": "local",
   "Driver": "bridge",
   "EnableIPv6": false,
   "IPAM": {
       "Driver": "default",
       "Options": null,
       "Config": [
           {
               "Subnet": "172.17.0.0/16",
               "Gateway": "172.17.0.1"
           }
       ]
   },
   "Internal": false,
   "Attachable": false,
   "Ingress": false,
   "ConfigFrom": {
       "Network": ""
   },
   "ConfigOnly": false,
   "Containers": {},
   "Options": {
       "com.docker.network.bridge.default_bridge": "true",
       "com.docker.network.bridge.enable_icc": "true",
       "com.docker.network.bridge.enable_ip_masquerade": "true",
       "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
       "com.docker.network.bridge.name": "docker0",
       "com.docker.network.driver.mtu": "1500"
   },
   "Labels": {},
   "CreatedTime": 1629897237657
}

我的問題是: a)為什麼在我執行命令

時又創建了兩個 docker 網路? b)如何使這些容器與橋接網路一起工作並獲得相同網路 ID(橋接網路 ID 172.17.xx)的 IP,以便它們能夠相互通信?docker-compose up --build

連接多個 docker-compose 實例的解決方案是使用外部網路。

首先使用以下命令創建一個新網路:

docker network create my-network

然後將以下內容添加到 docker-compose.yml 中:

networks:
 my_network:
   external: true

在服務的網路部分:

(...)
 networks:
   - my_network
(...)

Jenkins docker-compose 將變為:

version: '3.7'

networks:
 my_network:
   external: true

services:
 jenkins:
   image: jenkins/jenkins:lts
   privileged: true
   user: root
   networks:
     - my_network
   ports:
     - 8080:8080
     - 50000:50000
   container_name: jenkins

對另一個 docker-compose.yml 遵循相同的想法。

引用自:https://serverfault.com/questions/1076500