Docker Compose Version 2로 전환할 때 가장 적합한 점

15664 단어 Docker
Docker Compose의 설정 파일 형식을 Version1에서 Version2로 변경할 때 몇 군데가 일치하기 때문에 남깁니다.잘못된 점이나 더 좋은 방법이 있다면 알려주세요.

시스템 구성


이번에 이전된 시스템은 두 개의 Rails 응용 프로그램과 한 개의 역방향 에이전트로 구성되어 있다.Rails 애플리케이션은 모두 같은 인상을 바탕으로 하고 설정만 조금 다르다.사실 컨테이너가 좀 많은데 아무 상관이 없어서 생략했습니다.

또한 이전을 전후하여 Docker Engine, Docker Compose의 버전 업그레이드도 진행됩니다.
이전 전
마이그레이션 후
Docker Engine
1.10
1.12
Docker Compose
1.6
1.8

행 이동 전 설정


이전 프로그램의 docker-compose입니다.다음은 yml입니다.이미지는 공식적인 것이 아니라 직접 만든 것이기 때문에 이름이 적당히 바뀐다.
리버스 프록시와 Rails 응용 프로그램은 통신할 수 있지만 Docker Compose의 externalLINks를 사용하지 않았습니다.이걸 사용하면 리버스 프록시 밑에 있는 앱이 멈췄을 때 리버스 프록시 서버도 멈췄고 다른 앱과 연결할 수 없습니다.약 1년 전 구축할 때의 정보이기 때문에 지금은 다를 수 있습니다...
  • 리버스 에이전트(부분 발췌문)
  • docker-compose.yml
    nginx:
      image: hoge/nginx:latest
      ports:
        - "80:80"
    
  • Rails 응용1(부분 발췌문)
  • docker-compose.yml
    redis:
      image: hoge/redis:latest
    rails:
      image: hoge/rails:latest
      links:
        - redis:redis
    
  • Rails 응용2(부분 발췌문)
  • docker-compose.yml
    redis:
      image: hoge/redis:latest
    rails:
      image: hoge/rails:latest
      links:
        - redis:redis
    

    변환 후 설정(첫 번째 실패)


    우선 간단하게 격식을 바꾸어 보았다.
  • 리버스 에이전트(부분 발췌문)
  • docker-compose.yml
    version: '2'
    services:
      nginx:
        image: hoge/nginx:latest
        ports:
          - "80:80"
    
  • Rails 응용1(부분 발췌문)
  • docker-compose.yml
    version: '2'
    services:
      redis:
        image: hoge/rails:latest
      rails:
        image: hoge/rails:latest
        depends_on:
          - redis
    
  • Rails 응용2(부분 발췌문)
  • docker-compose.yml
    version: '2'
    services:
      redis:
        image: hoge/redis:latest
      rails:
        image: hoge/rails:latest
        depends_on:
          - redis
    
    포맷만 간단하게 바꾸면 리버스 프록시 응용 프로그램에서 Rails 응용 프로그램 용기에 연결할 수 없습니다.Version1에서는 이 설정으로 모든 컨테이너가 동일한 서브넷에 속하므로 연결할 수 있습니다.따라서 모든 응용 프로그램이 같은 네트워크에 속하기 위해 우리는 전용 네트워크를 설치했다.

    변환 후 설정(2차 실패)

  • 리버스 에이전트(부분 발췌문)
  • docker-compose.yml
    version: '2'
    services:
      nginx:
        image: hoge/nginx:latest
        ports:
          - "80:80"
        networks:
          - proxy_network
    networks:
      proxy_network:
        external: true
    
  • Rails 응용1(부분 발췌문)
  • docker-compose.yml
    version: '2'
    services:
      redis:
        image: hoge/redis:latest
        networks:
          - proxy_network
      rails:
        image: hoge/rails:latest
        depends_on:
          - redis
        networks:
          - proxy_network
    networks:
      proxy_network:
        external: true
    
  • Rails 응용2(부분 발췌문)
  • docker-compose.yml
    version: '2'
    services:
      redis:
        image: hoge/redis:latest
        networks:
          - proxy_network
      rails:
        image: hoge/rails:latest
        depends_on:
          - redis
        networks:
          - proxy_network
    networks:
      proxy_network:
        external: true
    
    어플리케이션 공통 네트워킹proxy_network을 정의합니다.네트워크를 만들면 다음 명령이 실행됩니다.
    command
    $ docker network create --driver bridge proxy_network
    
    공통된 네트워크에 속하기 때문에 역 에이전트에서 각 응용 프로그램에 연결할 수 있다.

    새로운 문제의 발생


    이렇게 하면 해결될 줄 알았는데 이번에 라일스 앱 중 하나가 리디스에 연결되지 않는 현상이 발생했다.Rails1 응용 프로그램의 Redis 용기의 IP 주소는 172.21.0.2입니다. Rails1 응용 프로그램의 rails 용기에서 Redis에게 핑을 치면 172.21.0.5입니다.이 172.21.0.5는 무엇을 조사했습니까Rails2アプリのredisコンテナ.Rails 응용 프로그램에서는 Redis 용기에 연결하는 목적지 호스트 이름을 Docker Compose를 통해 설정한 서비스 이름redis으로 설정하지만 모든 응용 프로그램이 공공 네트워크에 속하기 때문에 서비스 이름redis은 Rails1과 Rails2 두 응용 프로그램에 포함된다.서비스 이름이 중복되어 내장 컨테이너의 DNS가 다른 IP 주소를 반환합니다.이 현상 조사에서는 라일스 앱을 하나씩 가동하면 제대로 연결이 되기 때문에 원인을 찾기 전까지 시간이 오래 걸렸다.
    그래서 나는 이 문제를 해결하기 위해 두 가지 방법을 고려했다.
  • 중복 없이 서비스 이름으로 변경
  • 외부 응용 프로그램에서 접근할 필요가 없는 용기는 공동 네트워크가 아닌 다른 네트워크에 속한다
  • 앱이 늘어날 때마다 새로운 네트워크를 추가하는 구성이 복잡해질 것 같아 이번에는 첫 번째 방법으로 대응하기로 했다.지금 생각해보면 인터넷을 분리하는 것이 더 솔직하고 편할 수도 있다.

    변환 후 설정(세 번째 실패)


    docker-compose.yml
    version: '2'
    services:
      nginx:
        image: hoge/nginx:latest
        ports:
          - "80:80"
        networks:
          - proxy_network
    networks:
      proxy_network:
        external: true
    
  • Rails 응용1(부분 발췌문)
  • docker-compose.yml
    version: '2'
    services:
      rails1_redis:
        image: hoge/redis:latest
        networks:
          - proxy_network
      rails1:
        image: hoge/rails:latest
        depends_on:
          - rails1_redis
        networks:
          - proxy_network
    networks:
      proxy_network:
        external: true
    
  • Rails 응용2(부분 발췌문)
  • docker-compose.yml
    version: '2'
    services:
      rails2_redis:
        image: hoge/redis:latest
        networks:
          - proxy_network
      rails2:
        image: hoge/rails:latest
        depends_on:
          - rails2_redis
        networks:
          - proxy_network
    networks:
      proxy_network:
        external: true
    
    이제 rails1 용기부터 rails1레드스 용기, rails2 용기에서 rails2까지레드스 용기의 IP 주소를 정확하게 식별할 수 있습니다.

    문제가 재발하다


    이번엔 꼭 해결될 줄 알았는데 이번에는 Rails 애플리케이션 rails1리디스에 접근하려고 시도했을 때 InvalidURIError 발생했습니다.호스트 이름_이 포함되어 있기 때문인 것 같습니다.이에 따라 서비스명의_-로 변경했다.Docker Compose와 직접적인 관련이 없는 문제지만 서비스명 변경에 따른 분쟁인 만큼 함께 적었다.

    전환 후 설정(최종 형식)


    docker-compose.yml
    version: '2'
    services:
      nginx:
        image: hoge/nginx:latest
        ports:
          - "80:80"
        networks:
          - proxy_network
    networks:
      proxy_network:
        external: true
    
  • Rails 응용1(부분 발췌문)
  • docker-compose.yml
    version: '2'
    services:
      rails1-redis:
        image: hoge/redis:latest
        networks:
          - proxy_network
      rails1:
        image: hoge/rails:latest
        depends_on:
          - rails1-redis
        networks:
          - proxy_network
    networks:
      proxy_network:
        external: true
    
  • Rails 응용2(부분 발췌문)
  • docker-compose.yml
    version: '2'
    services:
      rails2-redis:
        image: hoge/redis:latest
        networks:
          - proxy_network
      rails2:
        image: hoge/rails:latest
        depends_on:
          - rails2-redis
        networks:
          - proxy_network
    networks:
      proxy_network:
        external: true
    
    이렇게 해서 마침내 모두 정상적으로 운행되었다.
    Docker Compose는 매우 편리하지만 업데이트 속도가 매우 빨라서 따라잡기 어렵다.반드시 자세하게 검사해야 한다.

    좋은 웹페이지 즐겨찾기