docker-compose将lan ip分配给服务

时间:2017-03-04 17:33:28

标签: networking docker-compose lan

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

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

我现在的问题是我收到了这个错误:

  

错误:对于gitlab无法启动服务gitlab:无效链接本地IP地址: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访问所有内容,但我无法ping到所需的ip(192.168.220.220)。主机也不在主机外面。

  

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开头

也许我必须使用 macvlan ipvlan

提前感谢您的回复!

2 个答案:

答案 0 :(得分:2)

这是您正在尝试实现的完整工作的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。

答案 1 :(得分:0)

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

搬运工-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容器。