docker-compose를 통해 Docker 컨테이너에 고정 IP 제공


95

컨테이너에 고정 IP 주소를 제공하려고합니다. 사용자 지정 네트워크를 만들어야한다는 것을 이해합니다. 그것을 만들고 브리지 인터페이스가 호스트 컴퓨터 (Ubuntu 16.x)에 있습니다. 컨테이너는이 서브넷에서 IP를 가져 오지만 내가 제공 한 정적은 가져 오지 않습니다.

다음은 내 docker-compose.yml입니다.

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

컨테이너는 5와 6 대신 10.5.0.2 및 10.5.0.3을 얻습니다.


aux-address는 네트워크에서 이미 사용중인 IP 주소에 대해 ipam-driver에 수동으로 알리는 데 사용됩니다
Hamza

서비스에 정적 IP를 할당 한 경우 'docker compose up -d --scale container-name = 3'을 사용하여 이러한 컨테이너 중 하나를 어떻게 확장 할 수 있습니까?
yash

답변:


121

컨테이너 네트워크 (예 : macvlan) 외부에서 내부로 라우팅 할 수있는 작업을 수행하지 않는 한 Docker의 컨테이너에 고정 IP를 사용하지 않는 것이 좋습니다. 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

2
사용자 구성 서브넷이 정의 된 작성 파일의 하단 절반을 놓 쳤어 야합니다.
BMitch

11
버전 3에서 어떻게 할 수 있습니까?
Atr_Max

4
@Atr_Max 현재로서는 다음을 수행 할 수 없습니다. "참고 : 게이트웨이와 같은 추가 IPAM 구성은 현재 버전 2에만 적용됩니다." docs.docker.com/compose/compose-file/#ipam
BMitch

2
@Ryan 고정 IP는 보안을 향상시키지 않으며 여전히 동일한 연결을 열어야하며 컨테이너는 필요한 것만 노출하는 네임 스페이스 네트워크 내부에서 계속 실행됩니다. 고정 IP는 스웜 모드에서 작동하지 않고 애플리케이션의 롤링 업데이트를 수행하는 기능을 포함하여 유연성을 감소시키고 컨테이너의 구성을 환경 또는 유사한 컨테이너간에 복사하기 어렵게 만듭니다. 연결된 문제의 경우 컨테이너 내부에서 0.0.0.0을 수신하면됩니다.
BMitch

1
@alvery 저도 같은 문제가, 당신은 고정 표시기-작성 이미 생성 네트워크 (아마도 버그)에 설정을 적용하지 않기 때문에 --force-재 작성 옵션을 사용할 필요가
HugoPoi

21

사용자 지정 이름 (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:
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.