【问题标题】:How to get container's ip on bridge network如何在桥接网络上获取容器的 ip
【发布时间】:2018-09-12 15:34:06
【问题描述】:

我正在部署这样的 mariadb 集群。

(host) $ cat docker-compose.yaml
version:        '3.6'
services:
  parent:
    image:      erkules/galera
    command:    ["--wsrep-cluster-name=local-test", "--wsrep-cluster-address=gcomm://"]
    hostname:   parent
  child:
    image:      erkules/galera
    command:    ["--wsrep-cluster-name=local-test", "--wsrep-cluster-address=gcomm://parent"]
    depends_on:
      - parent
    deploy:
      replicas: 5
(host) $ sudo docker stack deploy --compose-file docker-compose.yaml mariadb

现在我正在尝试在桥接网络中查找容器的 ip,以便我可以尝试从主机连接到数据库服务器。我可以找到这样的,

(host) $ docker exec $(docker ps -q | head -n 1) /sbin/ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
176: eth0@if177: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default 
    link/ether 02:42:0a:00:01:07 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.1.7/24 brd 10.0.1.255 scope global eth0
       valid_lft forever preferred_lft forever
182: eth1@if183: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:13:00:08 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet 172.19.0.8/16 brd 172.19.255.255 scope global eth1
       valid_lft forever preferred_lft forever
(host) $ mysql -h 172.19.0.8 -u root
Welcome to the MariaDB monitor. ...

但我必须做一些肮脏的解析。所以我想知道是否有一种优雅的方法可以仅使用 docker 提供的命令来获得它。例如,对于overlay网络中的ips,我们可以使用inspect命令得到json的输出。

(host) $ docker ps -q | xargs docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Id }}' 
10.0.1.7 c8e3dfc13c60c6925e55dff1c8dad5fb8e9bbb2335743671e45cd2f4d47fabab
10.0.1.8 7fbede8ffa63e007544c28efcc2ec2418ad44b2012e849489c25536a8408e9f6
10.0.1.6 fe0b7dcdd26fa3edecc025a5b6be0bfab04bce4d448587e5488e414dba595758
10.0.1.10 2fe03472255577db0b2d54f40422be15915121fedf3873d9e09082d5caad7f2f
10.0.1.9 0b34241582be3218d022cc58c95ce21a8be0c46dcd2ff7bca64a02a11427953a
10.0.1.4 5acc231db33b494a83010f0d6397b11365d14ca264f52bc477c642a9eda0be3f

Edit1:我想让部署部分尽可能通用。我不想发布端口。然后我必须为每个容器分配一个不同的端口。

Edit2:显然,对于多主机 swarm 覆盖网络,Docker 使用docker_gwbridge 接口。 所以我可以通过docker network inspect docker_gwbridge 获取每个容器的 ips。

【问题讨论】:

标签: docker mariadb docker-swarm


【解决方案1】:

一般我们在使用compose的时候,我们的docker-compose.yml容器id的顺序,取.2....3....等

所以,尝试创建一个网络(docker create network...)并放在你的 docker-compose.yml por 示例的最后:

rabbitmq:
ports:
   - "8201:8080"
volumes:
   - /share:/share
container_name: rabbitmq-int1
hostname: rabbitmq-int1
cpu_shares: 10
mem_limit: 2000000000
networks:
   compose_net:
         ipv4_address: 172.12.0.3
networks:
  compose_net:
     external:
        name: network_compose

其中“network_compose”是之前在Host/Server中创建的网络(docker create network...)

【讨论】:

    【解决方案2】:

    此命令显示您的网络详细信息,包含列表容器加入您的网络及其 IP。希望这有帮助

    docker network ls // To get list network running -> get network id
    docker network inspect network_id // Now you can get container IP
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多