Docker Compose를 익히자

Koo·2023년 7월 29일
1
post-thumbnail

Section01. Docker compose란?

  • 시스템 구축과 관련된 도커 명령어를 정의 파일에 기술해 실행하는 도구
  • 명령어 한 번에 시스템 전체를 실행하고 종료와 폐기까지 하도록 도와줌
  • YAML 포맷으로 기재한 정의 파일을 이용
  • 일괄 실행 또는 일괄 종료 및 삭제 가능
docker-comopse up # 정의 파일에 기재된 내용대로 container를 생성 및 실행
docker-compose down # container와 network 정지 및 삭제
docker-compose stop # container와 network 정지

Docker compose와 Dockerfile의 차이
Docker compose : 여러 개의 docker run 명령어를 묶어 놓은 것
Docker file : image를 만들기 위한 것으로 network나 volume 생성 불가

Section02. Docker compose 설치와 사용법

Docker compose 설치

  • Docker compose는 Docker와는 별개의 소프트웨어
  • Docker compose를 사용해 만든 container는 Docker engine으로 관리 가능
  • windows / macOS : Docker desktop을 설치할 때 Docker compose도 함께 설치
  • Linux : python3, python3-pip 필요, pip를 이용해 설치
sudo apt install -y python3 python3-pip
sudo pip3 install docker-compose

Docker compose 사용법

  • 미리 정해진 docker-compose.yml 파일을 사용
  • docker engine에 명령어를 하나씩 입력 x
  • docker compose가 명령어를 묶어 한 번에 docker engine에 전달
  • docker compose에 묶여 있는 container를 service라 부름

Docker compose 파일 작성

Apache container의 compose file

version: "3"
services:
  apa000ex2:
    image: httpd
    ports:
      - 8080:80
    restart: always
docker run --name apa000ex2 -d -p 8080:80 httpd

Wordpress의 compose file

version: "3"
services:
  wordpress000ex12:
    depends_on:
      - mysql000ex11
    image: wordpress
    networks:
      - wordpress000net1
    ports:
      - 8085:80
    restart: always
    environment:
      WORDPRESS_DB_HOST=mysql000ex11
      WORDPRESS_DB_NAME=wordpress000db
      WORDPRESS_DB_USER=wordpress000kun
      WORDPRESS_DB_PASSWORD=wkunpass
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex12 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress

Docker compose를 작성하는 방법

  • 파일 이름을 docker-compose.yml로 사용
  • -f 옵션을 사용해 파일 이름을 지정 가능
  • 탭을 사용할 수 없고 공백 개수를 동일하게 사용
  • 이름 뒤에 콜론을 붙이고, 이어서 설정을 기재하려면 공백 추가
  • 들여쓰기는 맞춰야 한다
  • # 뒤의 내용은 주석 처리
  • 문자열은 작은 따옴표 또는 큰 따옴표로 감싸 작성

  1. version: "3" # version 기재
  2. services: # container 관련 정보
  3. networks: # network 관련 정보
  4. volumes: # volume 관련 정보

compose 파일의 항목

주항목

  • services : container를 정의
  • networks : network를 정의
  • volumes : volume을 정의

정의 내용

항목 docker run command의 해당 옵션, 인자 내용
image image 인자 사용할 image 지정
networks --net 접속할 network 지정
volumes -v, --mount storage mount를 지정
ports -p port 설정
environment -e 환경변수 설정
depends_on 없음 다른 service에 대한 의존관계 정의
restart 없음 container 종료 시 재시작 여부 설정
command command 인자 container 시작 시 기존 command override
container_name --name 실행할 container의 이름을 명시적으로 지정
dns --dns DNS server를 명시적으로 지정
env_file 없음 환경설정 정보를 기재한 파일을 로드
entrypoint --entrypoint container 시작 시 ENTRYPOINT 설정을 override
external_links --link 외부 link를 지정
extra_hosts --add-host 외부 host의 IP주소를 명시적으로 지정
logging --log-driver log 출력 대상을 지정
network_mode --network network 모드를 지정
  • depends_on : 다른 서비스에 대한 의존 관계
    - depends_on에 정의된 service를 먼저 실행한 후 해당 service를 실행
  • restart의 설정값
    - no : 재시작하지 않음
    • always : 항상 재시작
    • on-failure : 프로세스가 0 외의 상태로 종료됐다면 재시작
    • unless-stopped : 종료 시 재시작하지 않음. 그 외에는 재시작

Wordpress docker-compose 파일 작성

version: "3"
services:
  mysql000ex11:
    image: mysql:5.7
    networks:
      - wordpress000net1
    volumes:
      - mysql000vol1:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: myrootpass
      MYSQL_DATABASE: wordpress000db
      MYSQL_USER: wordpress000kun
      MYSQL_PASSWORD: wkunpass
  wordpress000ex12:
    depends_on:
      - mysql000ex11
    image: wordpress
    networks:
      - wordpress000net1
    volumes:
      - wordpress000vol2:/var/www/html
    ports:
      - 8080:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: mysql000ex11
      WORDPRESS_DB_NAME: wordpress000db
      WORDPRESS_DB_USER: wordpress000kun
      WORDPRESS_DB_PASSWORD: wkunpass
networks:
  wordpress000net1:
volumes:
  mysql000vol1:
  wordpress000vol2:

Section04. Docker compose 실행

docker-compose up : Container와 주변 환경을 생성

docker-compose -f <composefile.yml 경로> up <option>
옵션 내용
-dback ground로 실행
--no-color화면 출력 내용을 흑백으로 함
--no-deps링크된 service를 실행하지 않음
--force-recreate설정 또는 image가 변경되지 않더라도 container를 재생성
--no-createcontainer가 이미 존재할 경우 생성하지 않음
--no-buildimage가 없어도 image를 build하지 않음
--buildcontainer를 실행하기 전에 image를 build
--abort-on-container-exitcontainer가 하나라도 종료되면 모든 container를 종료
-t, --timeoutcontainer를 종료할 때의 time out 설정, default는 10초
--remove-orphanscompose 파일에 정의되지 않은 service의 container 삭제
--scalecontainer 수를 변경
### docker-compose down: Container와 네트워크 삭제
docker-compose -f <composefile.yml 경로> down <option>
옵션 내용
--rmi 종류 삭제 시에 image도 삭제. 종류를 all로 지정하면 사용했던 모든 image를 삭제.
local로 지정하면 custom tag가 없는 image만 삭제
-v, --volumes volumes 항목에 기재된 volume을 삭제.
단, external로 지정된 volume은 삭제되지 않음
--remove-orphans compose 파일에 정의되지 않은 service의 container도 삭제

docker-compose stop: Container 종료

docker-compose -f <composefile.yml 경로> stop <option>
profile
스터디를 해보자

1개의 댓글

comment-user-thumbnail
2023년 7월 29일

좋은 글이네요. 공유해주셔서 감사합니다.

답글 달기