Skip to main content
 首页 » 编程设计

networking之docker-compose 将 lan ip 分配给服务

2025年01月19日14Renyi-Fan

我有三个与 docker-compose 连接的容器,它们都在一个 docker 内部网络中。但是我想通过为其分配一个 LAN IP 来公开其中一个容器。

所以,我有 IP 指向的主机:192.168.220.33,我想将 IP 分配给 gitlab 容器:192.168.220.220。

我现在的问题是我收到此错误:

ERROR: for gitlab Cannot start service gitlab: invalid link local IP address: 192.168.220.220



我正在使用 docker-compose 1.11.2 并且我有以下 docker-compose.yml 文件:

version: '2.1' 
 
networks: 
    front: 
        driver: bridge 
 
services: 
    redis: 
        image: sameersbn/redis:latest 
        volumes: 
            - /tmp/gitlab/redis:/var/lib/redis:Z 
        networks: 
            - default 
        ... 
    postgresql: 
        image: sameersbn/postgresql:latest 
        volumes: 
            - /tmp/gitlab/postgresql:/var/lib/postgresql:Z 
        networks: 
            - default 
        ... 
    gitlab: 
        image: sameersbn/gitlab:latest 
        depends_on: 
            - redis 
            - postgresql 
        ports: 
            - "22:22" 
            - "80:80" 
            - "443:443" 
        networks: 
            default: {} 
            outside: 
                link_local_ips: 
                    - 192.168.220.220 
        ... 

我也试过这个配置:

version: '2.1' 
 
networks: 
    front: 
        driver: bridge 
        ipam: 
            config: 
                - subnet: 192.168.220.0/24 
 
services: 
    redis: 
        networks: 
            - default 
        ... 
    postgresql: 
        networks: 
            - default 
        ... 
    gitlab: 
        ... 
        networks: 
            default: {} 
            outside: 
                ipv4_address: 192.168.220.220 

此配置可以构建和运行容器,并且所有内容都可以从本地主机访问,但我无法 ping 到所需的 ip (192.168.220.220)。既不受主机也不在主机之外。

PING 192.168.220.220 (192.168.220.220): 56 data bytes
Request timeout for icmp_seq 0
ping: sendto: No route to host
Request timeout for icmp_seq 1
ping: sendto: No route to host
Request timeout for icmp_seq 2
ping: sendto: No route to host
Request timeout for icmp_seq 3
ping: sendto: No route to host



我想知道如何为 gitlab 容器分配 IP 以便通过此 IP 而不是主机 IP 和暴露的端口访问。

更新 我希望容器和主机在网络中处于同一级别,因此两个 IP 都以:192.168.220.x 开头

也许我必须使用 macvlan 或 ipvlan?

预先感谢您的每一个回复!

请您参考如下方法:

这是您想要实现的完整工作 docker-compose.yml。

version: '2.1' 
 
networks: 
  outside: 
    driver: bridge 
    ipam: 
      driver: default 
      config: 
      - subnet: 192.168.220.0/24 
 
services: 
  redis: 
    image: sameersbn/redis:latest 
    restart: always 
    command: 
    - --loglevel warning 
    networks: 
      - default 
  postgresql: 
    restart: always 
    image: sameersbn/postgresql:latest 
    environment: 
    - DB_USER=gitlab 
    - DB_PASS=password 
    - DB_NAME=gitlabhq_production 
    - DB_EXTENSION=pg_trgm 
    networks: 
      - default 
  gitlab: 
    restart: always 
    image: sameersbn/gitlab:latest 
    depends_on: 
      - redis 
      - postgresql 
    networks: 
      default: 
      outside: 
        ipv4_address: 192.168.220.220 
    environment: 
    - DEBUG=false 
 
    - DB_ADAPTER=postgresql 
    - DB_HOST=postgresql 
    - DB_PORT=5432 
    - DB_USER=gitlab 
    - DB_PASS=password 
    - DB_NAME=gitlabhq_production 
 
    - REDIS_HOST=redis 
    - REDIS_PORT=6379 
 
    - GITLAB_HTTPS=false 
    - SSL_SELF_SIGNED=false 
 
    - GITLAB_HOST=192.168.220.220 
    - GITLAB_PORT=80 
    - GITLAB_SSH_PORT=22 
    - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string 
    - GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string 
    - GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string 
 
    - GITLAB_ROOT_PASSWORD=password 
    - GITLAB_ROOT_EMAIL= 

做完后 docker-compose up您将能够访问容器公开的端口。尽管如此,通过这些设置,您将无法从外部主机访问 gitlab docker。