【问题标题】:docker-compose run with specified network namedocker-compose 使用指定的网络名称运行
【发布时间】:2023-03-07 22:47:01
【问题描述】:

我有一个包含三个服务(Solr、PostgreSQL 和 pgAdmin)的 docker-compose 文件,它们都共享一个 Docker 网络。

version: '2'
services:
  solr:
    image: solr:7.7.2
    ports:
      - '8983:8983'
    networks:
      primus-dev:
        ipv4_address: 10.105.1.101
    volumes:
      - data:/opt/solr/server/solr/mycores
    entrypoint:
      - docker-entrypoint.sh
      - solr-precreate
      - primus
      - /opt/solr/server/solr/configsets/sample_techproducts_configs
    environment:
      - SOLR_HEAP=2048m
    logging:
      options:
        max-size: 5m

  db:
    image: "postgres:11.5"
    container_name: "primus_postgres"
    ports:
      - "5432:5432"
    networks:
      primus-dev:
        ipv4_address: 10.105.1.102
    volumes:
      - primus_dbdata:/var/lib/postgres/data
    environment:
      - POSTGRES_DB=primus75
      - POSTGRES_USER=primus
      - POSTGRES_PASSWORD=primstav

  pgadm4:
    image: "dpage/pgadmin4"
    networks:
      primus-dev:
        ipv4_address: 10.105.1.103
    ports:
      - "3050:80"
    volumes:
      - /home/nils/docker-home:/var/docker-home
    environment:
      - PGADMIN_DEFAULT_EMAIL=nils.weinander@kulturit.se
      - PGADMIN_DEFAULT_PASSWORD=dev

networks:
  primus-dev:
    driver: bridge
    ipam:
      config:
        - subnet: 10.105.1.0/24

volumes:
  data:
  primus_dbdata:

这在 docker-compose up 之后工作得很好(至少 pgAdmin 可以与 PostgreSQL 对话)。

但是,然后我有一个脚本(实际上是一个 make 目标,但这不是这里的重点),它使用 docker-compose run 构建、运行和删除一个容器:

docker-compose run -e HOME=/app -e PYTHONPATH=/app/server -u 0 --rm backend \
    bash -c 'cd /app/server && python tools/reindex_mp.py -s -n'

这不起作用,因为 reindex_mp.py 无法到达 10.105.1.101 上的 Solr,因为一次性容器不在同一个 Docker 网络上。那么,有没有办法通过 docker-compose run 告诉 docker-compose 使用命名网络? docker run 有一个选项 --network 但不适用于 docker-compose。

【问题讨论】:

  • 你不能编辑backend服务的docker-compose文件,让它使用primus-dev网络吗?
  • backend 在另一个 docker-compose 文件中定义,但如果我在其中复制网络定义,它就可以工作。还有其他问题需要解决,但似乎这是可能的。

标签: docker networking docker-compose


【解决方案1】:

您可以在 docker-compose 之外创建一个 docker 网络,并在 docker-compose 中运行服务时使用该网络。

docker network create my-custom-created-network

现在在你的 docker-compose 中,像这样使用这个网络:

services:
  serv1:
    image: img
    networks:
      my-custom-created-network

networks:
  my-custom-created-network:
    external: true

网络创建示例创建了一个桥接网络。 要跨主机访问容器,请使用覆盖网络。

您还可以使用在 docker-compose 中创建的网络并将容器连接到该网络。

Docker 为 docker-compose 创建一个默认网络,并且没有指定任何网络配置的服务将使用 docker 为该 compose 文件创建的默认网络。

您可以通过执行以下命令找到网络名称:

docker network ls

在启动容器时使用网络适当的名称,像这样

docker run [options] --network <network-name> <image-name>

注意:同一网络中的容器可以使用容器名称访问,您可以利用它而不是使用 ips

【讨论】:

  • 谢谢!这听起来不错。我遇到了其他问题并暂时放弃了设置,但会记住这一点以备将来使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2017-08-02
  • 2022-06-15
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多