提供静态 IP 的码头容器通过码头组成

我试图提供静态 IP 地址的容器。我明白,我必须创建一个自定义网络。我创建了它,然后在主机(Ubuntu 16.x)上打开了桥接界面。容器从这个子网获得 IP,但是不能获得我提供的静态 IP。

这是我的码头作品:

version: '2'


services:
mysql:
container_name: mysql
image: mysql:latest
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- "3306:3306"
networks:
- vpcbr


apigw-tomcat:
container_name: apigw-tomcat
build: tomcat/.
ports:
- "8080:8080"
- "8009:8009"
networks:
- vpcbr
depends_on:
- mysql


networks:
vpcbr:
driver: bridge
ipam:
config:
- subnet: 10.5.0.0/16
gateway: 10.5.0.1
aux_addresses:
mysql: 10.5.0.5
apigw-tomcat: 10.5.0.6

容器得到10.5.0.2和10.5.0.3,而不是5和6。

307630 次浏览

请注意,我不建议 Docker 中的容器使用固定的 IP,除非您正在做的事情允许从容器网络的外部路由到内部(例如 macvlan)。DNS 已经在容器网络中用于服务发现,并支持容器扩展。在容器网络之外,您应该使用主机上的公开端口。有了这个免责声明,下面是您想要的作文文件:

version: '2'


services:
mysql:
container_name: mysql
image: mysql:latest
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- "3306:3306"
networks:
vpcbr:
ipv4_address: 10.5.0.5


apigw-tomcat:
container_name: apigw-tomcat
build: tomcat/.
ports:
- "8080:8080"
- "8009:8009"
networks:
vpcbr:
ipv4_address: 10.5.0.6
depends_on:
- mysql


networks:
vpcbr:
driver: bridge
ipam:
config:
- subnet: 10.5.0.0/16
gateway: 10.5.0.1

我在使用自定义名称的环境变量时遇到了一些困难(对于 kAPACITOR _ BASE _ URL 和 kAPACITOR _ ALERTS _ ENDPOINT,没有使用容器名称/端口约定)。如果我们在这种情况下给出服务名称,它不会将 ip 解析为

KAPACITOR_BASE_URL:  http://kapacitor:9092

在以上的 http://[**kapacitor**]:9092不会解析为 http://172.20.0.2:9092

我使用子网配置解决了静态 IP 问题。

version: "3.3"


networks:
frontend:
ipam:
config:
- subnet: 172.20.0.0/24
services:
db:
image: postgres:9.4.4
networks:
frontend:
ipv4_address: 172.20.0.5
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data


redis:
image: redis:latest
networks:
frontend:
ipv4_address: 172.20.0.6
ports:
- "6379"


influxdb:
image: influxdb:latest
ports:
- "8086:8086"
- "8083:8083"
volumes:
- ../influxdb/influxdb.conf:/etc/influxdb/influxdb.conf
- ../influxdb/inxdb:/var/lib/influxdb
networks:
frontend:
ipv4_address: 172.20.0.4
environment:
INFLUXDB_HTTP_AUTH_ENABLED: "false"
INFLUXDB_ADMIN_ENABLED: "true"
INFLUXDB_USERNAME: "db_username"
INFLUXDB_PASSWORD: "12345678"
INFLUXDB_DB: db_customers


kapacitor:
image: kapacitor:latest
ports:
- "9092:9092"
networks:
frontend:
ipv4_address: 172.20.0.2
depends_on:
- influxdb
volumes:
- ../kapacitor/kapacitor.conf:/etc/kapacitor/kapacitor.conf
- ../kapacitor/kapdb:/var/lib/kapacitor
environment:
KAPACITOR_INFLUXDB_0_URLS_0: http://influxdb:8086


web:
build: .
environment:
RAILS_ENV: $RAILS_ENV
command: bundle exec rails s -b 0.0.0.0
ports:
- "3000:3000"
networks:
frontend:
ipv4_address: 172.20.0.3
links:
- db
- kapacitor
depends_on:
- db
volumes:
- .:/var/app/current
environment:
DATABASE_URL: postgres://postgres@db
DATABASE_USERNAME: postgres
DATABASE_PASSWORD: postgres
INFLUX_URL: http://influxdb:8086
INFLUX_USER: db_username
INFLUX_PWD: 12345678
KAPACITOR_BASE_URL:  http://172.20.0.2:9092
KAPACITOR_ALERTS_ENDPOINT: http://172.20.0.3:3000


volumes:
postgres_data:

如果您从来没有看到静态 IP 地址集,可能是因为您正在使用“ docker compose up”。尝试使用“ docker-compose up”。

当我使用“ docker-compose up”(连字符)时,我现在看到分配的静态 IP。

networks:
hfnet:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.55.0/24
gateway: 192.168.55.1


services:
web:
image: 'mycompany/webserver:latest'
hostname: www
domainname: mycompany.com
stdin_open: true # docker run -i
tty: true        # docker run -t
networks:
hfnet:
ipv4_address: 192.168.55.10
ports:
- '80:80'
- '443:443'
volumes:
- '../honeyfund:/var/www/html'


我浪费了很多时间才弄明白这一点

我意识到,更方便和有意义的方法是给容器起一个容器名。 您可以在与源代码相同的 docker 网络中使用该名称。 这对我很有帮助,因为 docker 容器的 IP 发生了变化,通过这种方式,我可以与另一个具有静态名称的容器进行通信,我可以在配置文件中使用这个名称。