본문 바로가기

개발/Linux & DevOps

Docker Compose 사용 이유, 방법, 몇가지 꿀팁

서론

도커 실행엔 수많은 옵션이 붙는다.

docker run -it -p 8080:40001 -v ~./docker\_proj:/app/service/ 등등등  

이걸 일일히 다 기억할 수 있는가?

만약 상호 의존성이 있는 컨테이너라면 실행 순서도 문제가 된다.

이 모든걸 해결해줄 영웅이 나타났으니...!

그게 바로 도커 컴포즈 이다.

도커 실행옵션들을 yml 형태로 정리하여, 한번에 호출이 가능하다.

컴포즈 ㅎ


목차

  1. docker-compose.yml 예제
  2. docker-compose 명령어
  3. 실행중인 컨테이너에 터미널로 붙기
  4. 몇가지 팁

가장 간단한 예제 docker-compose.yml

먼저 docker-compose.yml 이 필요하다.
아래는 간단한 web서버 + db서버 이다.

#이 버전은 [도커 컴포즈] 버전이다!
version: '3.3'

#서비스 네이밍은 용도가 많다.
services:
  web:
    # docker build 옵션들
    build:
      context: .
      dockerfile: Dockerfile

    #여기서부터 run 옵션들이다.
    container_name: php73
    depends_on:
      - db #여기 변수는 밑에 db 컨테이너를 가리킨다!
    volumes:
      - .:/var/www/html/
    ports:
      - 8000:80
  db:
    container_name: mysql5
    image: mysql:5
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: tmddud333
      MYSQL_USER: tmddud333
      MYSQL_PASSWORD: abd123
    volumes:
      - "./init/:/docker-entrypoint-initdb.d/"
    ports:
      - 33060:3306

역시 yml, 가독성이 아주 훌륭하다.

서비스 네임 (web, db) 는 생각보다 아주 중요한데,

  1. 위에 설명되어있듯 depends_on 을 통해 컨테이너 실행 우선순위를 정할 때 쓰기도 하고
  2. 그 외 web 컨테이너에서 db 컨테이너를 호출할 때 localhost 마냥 "주소"를 대체해서 쓴다.

php 를 예로 $host = "db" 로 설정하고
mysqli_connect($host, $user, $password.....)

형태로 호출하는 것이다.


가장 필수적인 명령어

docker-compose 가 있는 경로에서

#실행
docker-compose up

#중지 (컨테이너 stop)
docker-compose stop

#중지-삭제 (networks와 컨테이너 stop, rm)
docker-compose down

실행중인 컨테이너 접근

물론 컨테이너에 접근할일 없게 만드는 것이 주된 목적이다만,

언제든지 예외는 있으니...

docker exec -it 컨테이너ID /bin/bash

#종료하려면
exit

exit 를 해도 컨테이너에 영향이 가지 않는다.
별도의 프로세스로 /bin/bash를 실행시켰기 때문.


몇가지 팁

  • docker-compose up 을 실행하기 전, 모든 컨테이너&이미지를 삭제해주고 하는 것이 좋다.
docker rm $(docker ps -a -q) 
docker rmi $(docker images -q)
  • db를 실행하기 전, 만약 초기 테이블을 생성하고 싶다면, sql 파일을 생성한 뒤속성을 컨테이너에 추가한다.
volumes: 
   - "./init/:/docker-entrypoint-initdb.d/"

실행 컴퓨터에 init 폴더 안에 sql 파일형태로 저장되어 있어야 한다. (파일 이름은 상관없다.)

컨테이너가 실행 시 /docker-entrypoint-initdb.d/ 를 참조하여 sql문을 실행시킨다.

반응형