【问题标题】:docker-compose assign lan ip to servicedocker-compose 将 lan ip 分配给服务
【发布时间】:2017-03-04 17:33:28
【问题描述】:

我有三个与 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

此配置可以构建和运行容器,并且可以从 localhost 访问所有内容,但我无法对所需的 ip (192.168.220.220) 执行 ping 操作。也不是由主机,也不是在主机之外。

PING 192.168.220.220 (192.168.220.220):56 个数据字节
icmp_seq 0 的请求超时
ping: sendto: 没有到主机的路由
icmp_seq 1 的请求超时
ping: sendto: 没有到主机的路由
icmp_seq 2 的请求超时
ping: sendto: 没有到主机的路由
icmp_seq 3 的请求超时
ping: sendto: 没有到主机的路由

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

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

也许我必须使用 macvlanipvlan

提前感谢您的每一个回复!

【问题讨论】:

    标签: networking docker-compose lan


    【解决方案1】:

    这是一个完整的工作 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。

    【讨论】:

    • 感谢您的回复尼古拉斯!我认为当主机和容器具有不同的IP时,这个设置是正确的,我的意思是,它们不共享192.168.220.X。在我的情况下,我希望主机和容器在网络中处于同一级别,而不是主机子网中的容器。
    【解决方案2】:

    我终于找到了适合我的解决方案。

    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 容器。

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 2015-04-19
      相关资源
      最近更新 更多