version: '3'
services:
  rabbitmq:
    image: rabbitmq:3-management-alpine
    container_name: rabbitmq-stream
    volumes:
      - ./.docker/rabbitmq/etc/:/etc/rabbitmq/
      - ./.docker/rabbitmq/data/:/var/lib/rabbitmq/
      - ./.docker/rabbitmq/logs/:/var/log/rabbitmq/
    ports:
      - "5672:5672"
      - "15672:15672"
    environment:
      RABBITMQ_ERLANG_COOKIE: "RabbitMQ-My-Cookies"
      RABBITMQ_DEFAULT_USER: "admin"
      RABBITMQ_DEFAULT_PASS: "rabbitpassword"

docker-compose.yml 파일은 위와 같다. 옵션별로 무엇을 의미하는지 알아보자


image: rabbitmq:3-management-alpine

rabbitmq 이미지중에 3-management-alpine 버전을 선택하겠다는 의미이다. 3-management-alpine 버전은 두가지 특징이 있다

  • management : 관리자 UI를 사용할 수 있게 해주는 management plugin이 설치되어 있는 이미지이다. 기본 관리자 username/passwdguest/guest 이다
  • alpine : 경량 리눅스 배포판 이미지, 사용하는 이유는 링크에 자세히 설명되어 있다.

volumes:
  - ./.docker/rabbitmq/etc/:/etc/rabbitmq/
  - ./.docker/rabbitmq/data/:/var/lib/rabbitmq/
  - ./.docker/rabbitmq/logs/:/var/log/rabbitmq/

volumes 는 도커 컨테이너는 실행 후 컨테이너를 삭제하면 존재하던 데이터가 모두 사라지게 되기 때문에 마운트를 해주는데, 이에 필요한 옵션이다.

만약 ./.docker/rabbitmq/etc/:/etc/rabbitmq/ 이라면 로컬의 ./.docker/rabbitmq/etc/디렉토리를 컨테이너의 /etc/rabbitmq/ 디렉토리와 마운트 하겠다는 의미이다.

한줄 한줄 마운트한 이유를 설명하자면

  • ./.docker/rabbitmq/etc/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf : RabbitMQ configuration 파일을 설정하기 위함
  • ./.docker/rabbitmq/data/:/var/lib/rabbitmq/ : RabbitMQ 데이터에 접근하기 위함
  • ./.docker/rabbitmq/logs/:/var/log/rabbitmq/ : RabbitMQ 로그에 접근하기 위함

environment:
  RABBITMQ_ERLANG_COOKIE: "RabbitMQ-My-Cookies"
  RABBITMQ_DEFAULT_USER: "admin"
  RABBITMQ_DEFAULT_PASS: "rabbitpassword"

컨테이너 내부의 환경 변수를 설정하는 옵션이다.

  • RABBITMQ_ERLANG_COOKIE : RabbitMQ 클러스터를 구성할 때 노드끼리 동일하게 맞춰줘야 하는 값
  • RABBITMQ_DEFAULT_USER : management UI 에서 로그인 username
  • RABBITMQ_DEFAULT_PASS : management UI 에서 로그인 password

ref.

https://zgadzaj.com/development/docker/docker-compose/containers/rabbitmq

docker-compose로 개발환경을 구축하기 위해 아래와 같이 docker-compose.dev.yml 파일을 작성했었다.

version: "2"

services:
  db:
    image: mysql:5.7.34
    container_name: dorandoran_db

    ports:
      - "7001:3306"
    environment:
      - MYSQL_DATABASE=dorandoran_dev_db
      - MYSQL_USER=devuser
      - MYSQL_PASSWORD=password
      - MYSQL_ROOT_PASSWORD=password
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 20s
      retries: 10

  web:
    build:
      context: .
      dockerfile: ./compose/develop/Dockerfile-dev
    volumes:
      - ./:/app/
    command:
      - bash
      - -c
      - |
        python dorandoran/manage.py migrate
        python dorandoran/manage.py runserver 0.0.0.0:8000
    container_name: dorandoran_web
    env_file:
      - dev.env
    depends_on:
      db:
        condition: service_healthy
    restart: always
    ports:
      - "8000:8000"

분명 webdb에 의존하고 있음을 명시하고 healthcheck까지 붙여줬는데 왜 안되는지 이해가 안됐다.

문제는 dev.env 파일에 있었다.

DJANGO_DB_HOST=db
DJANGO_DB_PORT=7001  # 이곳
DJANGO_DB_NAME=dorandoran_dev_db
DJANGO_DB_USERNAME=root
DJANGO_DB_PASSWORD=password

web 컨테이너가 db 컨테이너에 접근 할 때의 포트를 외부 포트(7001)로 지정해 줬던 것이다.
내부 포트인 3306으로 바꾸니 제대로 동작하였다.

DJANGO_DB_HOST=db
DJANGO_DB_PORT=3306  # 잘 된다!
DJANGO_DB_NAME=dorandoran_dev_db
DJANGO_DB_USERNAME=root
DJANGO_DB_PASSWORD=password

depends_on

Express dependency between services. Service dependencies cause the following behaviors:

  • docker-compose upstarts services in dependency order. In the following example,dbandredisare started beforeweb.
  • docker-compose up SERVICEautomatically includesSERVICE’s dependencies. In the example below,docker-compose up webalso creates and startsdbandredis.
  • docker-compose stopstops services in dependency order. In the following example,webis stopped beforedbandredis.

docker-compose up 은 순서대로 서비스를 실행하는데, depends_on이 여기에 영향을 미친다.

version: "3.7"

services:
  web:
    build: .
    depends_on:
      - db

  db:
    image: mysql:8.0.22
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci

예를 들어 위와 같은 docker-compose 파일이 있다면, db 서비스가 먼저 실행되고, web 서비스가 그 다음으로 실행된다.

출처

Docker doDocker docscs

+ Recent posts