docker-compose 将 lan ip 分配给服务

docker-compose assign lan ip to service

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

所以,我有 IP 指向的主机:192.168.220.33,我想为 gitlab 容器分配 IP: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 和公开端口进行访问。

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

也许我必须使用 macvlanipvlan?

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

这是您要实现的目标的完整工作 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。

最后我找到了适合我的解决方案。

docker-compose.yml

version: '2'

networks:
    front:
        driver: macvlan
        driver_opts:
            parent: eth0.10
        ipam:
            config:
                - subnet: 192.168.220.0/24
                  gateway: 192.168.220.1

services:
    redis:
        networks:
            - default
        ...
    postgresql:
        networks:
            - default
        ...
    gitlab:
        ...
        networks:
            default: {}
            outside:
                ipv4_address: 192.168.220.220

然后需要用ifconfig设置IP地址:

sudo ifconfig eht0.10 192.168.220.220 netmask 255.255.255.0 up

然后我可以通过调用分配的 IP 访问 docker 容器。