programing

도커 합성을 통해 도커 컨테이너에 정적 IP 제공

mailnote 2023. 8. 24. 22:23
반응형

도커 합성을 통해 도커 컨테이너에 정적 IP 제공

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

다음은 제 도커 구성입니다.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을 받습니다.

외부에서 컨테이너 네트워크 내부로 라우팅할 수 있는 작업(예: 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

사용자 지정 이름(KAPACIOR_BASE_URL 및 KAPACIOR_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"(하이픈 포함)을 사용하면 할당된 정적 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'

저는 그것을 알아내느라 많은 시간을 낭비했습니다. :(

더 편리하고 의미 있는 방법은 컨테이너 이름을 붙이는 것이라는 것을 깨달았습니다.동일한 도커 네트워크에 있는 이름을 소스로 사용할 수 있습니다.도커 컨테이너에 변경된 IP가 있기 때문에 구성 파일에서 사용할 수 있는 정적 이름을 가진 다른 컨테이너와 통신할 수 있습니다.

도커의 정적 IP 주소는 특히 역방향 프록시 서버와 함께 사용할 때 매우 유용합니다.경험의 법칙은 첫 번째 도커 작성 파일(컨테이너)이 향후 컨테이너에서 사용할 네트워크 서브넷을 정의하는 것입니다.

간단한 사용 사례는 SSL 인증서를 컨테이너에 할당할 뿐만 아니라 트래픽을 컨테이너로 유도하는 프록시 관리자를 사용하는 경우입니다.출처:정적/고정 IP용 도커 합성(유튜브 비디오 열기)

언급URL : https://stackoverflow.com/questions/39493490/provide-static-ip-to-docker-containers-via-docker-compose

반응형