docker compose 指定容器 ip

docker compose 指定容器 ip

参考:
https://www.zctou.com/2158.html
https://www.cnblogs.com/xuanmanstein/p/10576476.html

在 docker-compose.yml 文件中为容器分配固定IP,一般有两种方法:

  • 利用 docker ipam 功能在同一 yml 文件中分配固定IP
  • 先在外部创建一个网络(external),然后在想要用这网络的容器指定IP

利用 docker ipam 分配固定 IP

docker ipam 就是 IP Address Management Driver ,docker 官方文档地址如下:

https://docs.docker.com/engine/reference/commandline/network_create/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
version: '3.1'

services:

  db:
    image: mariadb:5.5.60
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ROOT_HOST: "%"
      TZ: Asia/Shanghai
    ports:
      - 3306:3306
    volumes:
      - .data:/var/lib/mysql
      - .conf:/etc/mysql/conf.d
    networks:
      mynet1:
        ipv4_address: 172.15.0.2

  adminer:
    image: adminer
    restart: always
    environment:
      TZ: Asia/Shanghai
    ports:
      - 18080:8080
    networks:
      mynet1:
        ipv4_address: 172.15.0.3

networks:
  mynet1:
    ipam:
      config:
      - subnet: 172.15.0.0/16

可以看到用 ipam 指定一个内部网络,容器用 ipv4_address 获取固定IP。

所有的容器都需要配置固定IP,否则容器IP位于不同网段,导致同一个yml中的容器网络不通。

但这些 IP 只能用于这个内部网络容器间相互访问,要打通与其他网络间的访问,至少要有一个容器要同时在两个网络内。

说得更白一点就是:这样分配的IP,是以这个yml为单位的小局域网,只能是这个yml中创建的容器间能互相访问。其他yml创建的容器访问不到这网络里面的容器。

若要不同docker-compose.yml创建的网络互通,在yml中添加一个external为true的网络

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
version: '3.1'

services:

  db:
    image: mariadb:5.5.60
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ROOT_HOST: "%"
      TZ: Asia/Shanghai
    ports:
      - 3306:3306
    volumes:
      - .data:/var/lib/mysql
      - .conf:/etc/mysql/conf.d
    networks:
      mynet1:
        ipv4_address: 172.15.0.2
      mynet2:

  adminer:
    image: adminer
    restart: always
    environment:
      TZ: Asia/Shanghai
    ports:
      - 18080:8080
    networks:
      mynet1:
        ipv4_address: 172.15.0.3

networks:
  mynet1:
    ipam:
      config:
      - subnet: 172.15.0.0/16
  mynet2:
    external: true

先建外部网络,再给容器分配IP

先定义一个外部网络,再分别在每个 docker-compose 中用 ipv4_address 固定IP。

创建外部网络

1
2
#创建proxy网络
docker network create --driver bridge --subnet=172.18.0.0/24 mynet2

为容器指定 ip

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
version: '3.1'

services:

  db:
    image: mariadb:5.5.60
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ROOT_HOST: "%"
      TZ: Asia/Shanghai
    ports:
      - 3306:3306
    volumes:
      - .data:/var/lib/mysql
      - .conf:/etc/mysql/conf.d
    networks:
      mynet2:
        ipv4_address: 172.20.0.2

  adminer:
    image: adminer
    restart: always
    environment:
      TZ: Asia/Shanghai
    ports:
      - 18080:8080
    networks:
      mynet2:
        ipv4_address: 172.20.0.3

networks:
  mynet2:
    external: true

问题

docker-compose up 首先会创建network 注意之前如果已经运行过多个不同工程的docker-compose 可能已经自动创建了很多network

这样如果IP网段已经分配过了,就会失败:

1
ERROR: Pool overlaps with other one on this address space

类似地,此外如果已经创建了network mynet1的网段 为 172.28.0.0,但是想改成172.19.0.1,也会失败

这样都需要清理一下无效的network

1
docker network prune

清除各种不用的docker相关东西 参考 https://blog.csdn.net/wennuanddianbo/article/details/78453325

操作记录

network 定义在 docker-compose.yml 文件内

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ cat docker-compose.yml 
version: '3.1'

services:

  db:
    image: mariadb:5.5.60
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ROOT_HOST: "%"
      TZ: Asia/Shanghai
    ports:
      - 3306:3306
    volumes:
      - .data:/var/lib/mysql
      - .conf:/etc/mysql/conf.d
    networks:
      mynet1:
        ipv4_address: 172.15.0.2

  adminer:
    image: adminer
    restart: always
    environment:
      TZ: Asia/Shanghai
    ports:
      - 18080:8080
    networks:
      mynet1:
        ipv4_address: 172.15.0.3

networks:
  mynet1:
    ipam:
      config:
      - subnet: 172.15.0.0/16
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker network ls
NETWORK ID     NAME                                   DRIVER    SCOPE
7350be8b3ad2   bridge                                 bridge    local
0d7795b17742   docker-centos7-slurm-cluster_default   bridge    local
666586e51a5b   host                                   host      local
97ca9cb8d2ea   none                                   null      local
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker compose up -d
[+] Building 0.0s (0/0)                                                                                              
[+] Running 3/3
 ✔ Network mariadb_mynet1       Created                                                                         0.1s 
 ✔ Container mariadb-adminer-1  Started                                                                         1.7s 
 ✔ Container mariadb-db-1       Started                                                                         0.8s 
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker network ls
NETWORK ID     NAME                                   DRIVER    SCOPE
7350be8b3ad2   bridge                                 bridge    local
0d7795b17742   docker-centos7-slurm-cluster_default   bridge    local
666586e51a5b   host                                   host      local
40ffa94e1ab4   mariadb_mynet1                         bridge    local
97ca9cb8d2ea   none                                   null      local
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker ps
CONTAINER ID   IMAGE                     COMMAND                   CREATED              STATUS              PORTS                                                                                                               NAMES
49caff9a1d15   mariadb:5.5.60            "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp                                                                           mariadb-db-1
127e6317a80a   adminer                   "entrypoint.sh php -…"   About a minute ago   Up About a minute   0.0.0.0:18080->8080/tcp, :::18080->8080/tcp                                                                         mariadb-adminer-1
64a701a17667   hekai/centos7.9-slurm22   "/tini -- /usr/local…"   9 hours ago     Up 9 hours     22/tcp, 3306/tcp, 6817-6820/tcp                                                                                     docker-centos7-slurm-cluster-slurm-compute-1-1
e9762ead7456   hekai/centos7.9-slurm22   "/tini -- /usr/local…"   9 hours ago     Up 9 hours     22/tcp, 3306/tcp, 6817-6820/tcp                                                                                     docker-centos7-slurm-cluster-slurm-compute-2-1
1fc423ffcf00   hekai/centos7.9-slurm22   "/tini -- /usr/local…"   9 hours ago     Up 9 hours     22/tcp, 3306/tcp, 0.0.0.0:389->389/tcp, :::389->389/tcp, 6817-6819/tcp, 0.0.0.0:6820->6820/tcp, :::6820->6820/tcp   docker-centos7-slurm-cluster-slurm-master-1
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker inspect 49caff9a1d15 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.15.0.2",
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker inspect 127e6317a80a | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.15.0.3",
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker compose down
[+] Running 3/3
 ✔ Container mariadb-adminer-1  Removed                                                                         0.4s 
 ✔ Container mariadb-db-1       Removed                                                                         5.3s 
 ✔ Network mariadb_mynet1       Removed                                                                         0.2s 
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker network ls
NETWORK ID     NAME                                   DRIVER    SCOPE
7350be8b3ad2   bridge                                 bridge    local
0d7795b17742   docker-centos7-slurm-cluster_default   bridge    local
666586e51a5b   host                                   host      local
97ca9cb8d2ea   none                                   null      local
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker ps
CONTAINER ID   IMAGE                     COMMAND                   CREATED         STATUS         PORTS                                                                                                               NAMES
66a097a109ef   mariadb:5.5.60            "docker-entrypoint.s…"   8 seconds ago   Up 5 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp                                                                           mariadb-db-1
b9188a6e2cf6   adminer                   "entrypoint.sh php -…"   8 seconds ago   Up 6 seconds   0.0.0.0:18080->8080/tcp, :::18080->8080/tcp                                                                         mariadb-adminer-1
64a701a17667   hekai/centos7.9-slurm22   "/tini -- /usr/local…"   9 hours ago     Up 9 hours     22/tcp, 3306/tcp, 6817-6820/tcp                                                                                     docker-centos7-slurm-cluster-slurm-compute-1-1
e9762ead7456   hekai/centos7.9-slurm22   "/tini -- /usr/local…"   9 hours ago     Up 9 hours     22/tcp, 3306/tcp, 6817-6820/tcp                                                                                     docker-centos7-slurm-cluster-slurm-compute-2-1
1fc423ffcf00   hekai/centos7.9-slurm22   "/tini -- /usr/local…"   9 hours ago     Up 9 hours     22/tcp, 3306/tcp, 0.0.0.0:389->389/tcp, :::389->389/tcp, 6817-6819/tcp, 0.0.0.0:6820->6820/tcp, :::6820->6820/tcp   docker-centos7-slurm-cluster-slurm-master-1
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker inspect 1fc423ffcf00 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.2",
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker exec -ti 66a097a109ef bash
root@66a097a109ef:/# ping 172.19.0.2
PING 172.19.0.2 (172.19.0.2) 56(84) bytes of data.


^C
--- 172.19.0.2 ping statistics ---
7 packets transmitted, 0 received, 100% packet loss, time 6129ms

root@66a097a109ef:/# ping www.baidu.com
PING www.a.shifen.com (220.181.38.149) 56(84) bytes of data.
64 bytes from 220.181.38.149: icmp_seq=1 ttl=48 time=10.6 ms
64 bytes from 220.181.38.149: icmp_seq=2 ttl=48 time=10.6 ms
^C
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 10.639/10.646/10.654/0.103 ms
root@66a097a109ef:/# exit
exit
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$

network 定义在 docker-compose.yml 文件外

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker network ls
NETWORK ID     NAME                                   DRIVER    SCOPE
7350be8b3ad2   bridge                                 bridge    local
0d7795b17742   docker-centos7-slurm-cluster_default   bridge    local
666586e51a5b   host                                   host      local
97ca9cb8d2ea   none                                   null      local
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker network create --driver bridge --subnet=172.20.0.0/24 mynet2
2bc1739b9484c6f7b640f84b711c5618cc80d2f98fcb794c037abcf299bf7be1
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ cat docker-compose.yml 
version: '3.1'

services:

  db:
    image: mariadb:5.5.60
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ROOT_HOST: "%"
      TZ: Asia/Shanghai
    ports:
      - 3306:3306
    volumes:
      - .data:/var/lib/mysql
      - .conf:/etc/mysql/conf.d
    networks:
      mynet2:
        ipv4_address: 172.20.0.2

  adminer:
    image: adminer
    restart: always
    environment:
      TZ: Asia/Shanghai
    ports:
      - 18080:8080
    networks:
      mynet2:
        ipv4_address: 172.20.0.3

networks:
  mynet2:
    external: true
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker compose up -d
[+] Building 0.0s (0/0)                                                                                              
[+] Running 2/2
 ✔ Container mariadb-adminer-1  Started                                                                         0.8s 
 ✔ Container mariadb-db-1       Started                                                                         1.8s 
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker network ls
NETWORK ID     NAME                                   DRIVER    SCOPE
7350be8b3ad2   bridge                                 bridge    local
0d7795b17742   docker-centos7-slurm-cluster_default   bridge    local
666586e51a5b   host                                   host      local
2bc1739b9484   mynet2                                 bridge    local
97ca9cb8d2ea   none                                   null      local
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker ps -a
CONTAINER ID   IMAGE                     COMMAND                   CREATED         STATUS         PORTS                                                                                                               NAMES
04c55ef43d94   mariadb:5.5.60            "docker-entrypoint.s…"   9 seconds ago   Up 7 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp                                                                           mariadb-db-1
36af8aae907c   adminer                   "entrypoint.sh php -…"   9 seconds ago   Up 8 seconds   0.0.0.0:18080->8080/tcp, :::18080->8080/tcp                                                                         mariadb-adminer-1
64a701a17667   hekai/centos7.9-slurm22   "/tini -- /usr/local…"   9 hours ago     Up 9 hours     22/tcp, 3306/tcp, 6817-6820/tcp                                                                                     docker-centos7-slurm-cluster-slurm-compute-1-1
e9762ead7456   hekai/centos7.9-slurm22   "/tini -- /usr/local…"   9 hours ago     Up 9 hours     22/tcp, 3306/tcp, 6817-6820/tcp                                                                                     docker-centos7-slurm-cluster-slurm-compute-2-1
1fc423ffcf00   hekai/centos7.9-slurm22   "/tini -- /usr/local…"   9 hours ago     Up 9 hours     22/tcp, 3306/tcp, 0.0.0.0:389->389/tcp, :::389->389/tcp, 6817-6819/tcp, 0.0.0.0:6820->6820/tcp, :::6820->6820/tcp   docker-centos7-slurm-cluster-slurm-master-1
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker inspect 04c55ef43d94 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.20.0.2",
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker inspect 36af8aae907c | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.20.0.3",
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker inspect 1fc423ffcf00 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.2",
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker exec -ti 04c55ef43d94 bsah
OCI runtime exec failed: exec failed: unable to start container process: exec: "bsah": executable file not found in $PATH: unknown
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker exec -ti 04c55ef43d94 bash
root@04c55ef43d94:/# ping 172.20.0.3
PING 172.20.0.3 (172.20.0.3) 56(84) bytes of data.
64 bytes from 172.20.0.3: icmp_seq=1 ttl=64 time=0.232 ms
64 bytes from 172.20.0.3: icmp_seq=2 ttl=64 time=0.115 ms
^C
--- 172.20.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1027ms
rtt min/avg/max/mdev = 0.115/0.173/0.232/0.059 ms
root@04c55ef43d94:/# ping 172.19.0.2
PING 172.19.0.2 (172.19.0.2) 56(84) bytes of data.
^C
--- 172.19.0.2 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1029ms

root@04c55ef43d94:/# ping www.baidu.com
PING www.a.shifen.com (220.181.38.149) 56(84) bytes of data.
64 bytes from 220.181.38.149: icmp_seq=1 ttl=48 time=18.5 ms
^C
--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 18.512/18.512/18.512/0.000 ms
root@04c55ef43d94:/# exit
exit
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker compose down
[+] Running 2/2
 ✔ Container mariadb-db-1       Removed                                                                         2.2s 
 ✔ Container mariadb-adminer-1  Removed                                                                         0.4s 
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker network ls
NETWORK ID     NAME                                   DRIVER    SCOPE
7350be8b3ad2   bridge                                 bridge    local
0d7795b17742   docker-centos7-slurm-cluster_default   bridge    local
666586e51a5b   host                                   host      local
2bc1739b9484   mynet2                                 bridge    local
97ca9cb8d2ea   none                                   null      local
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ docker network rm mynet2
mynet2
hekai@00bafcjc-dUrwEMo9N5:/opt/workspace/msdemt/docker-collection/docker-compose/mariadb$ 
Built with Hugo
主题 StackJimmy 设计