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= 开头]
也许我必须使用 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。
最后我找到了适合我的解决方案。
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 容器。
我用 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= 开头]
也许我必须使用 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。
最后我找到了适合我的解决方案。
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 容器。