도커 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
docker compose 기본 사용법
docker compose의 기본 작성법과 주요 명령들을 이해하고자 한다.
docker compose 란?
docker compose는 여러 개의 docker container를 모아서 관리하기 위한 툴이다.
웹 서비스는 일반적으로 프론트엔드 서버, 벡엔드 서버, 데이터베이스 서버로 구성되기 때문에 각 서버를 docker container로 연결하여 동작시키고 docker compose를 사용하여 해당 컨테이너들을 관리하는 것이다.
docker compose의 기본 작성법
docker compose는 docker-compose.yml 파일을 작성하여 실행할 수 있다.
docker-compose.yml 파일은 YAML(야멜) 형식으로 작성해야 한다.
*참고(YAML 문법)
YAML 문법은 들여쓰기와 함께 key와 value를 중심으로 작성된다.
해당 문법은 기본적으로 숫자형, 문자형, Boolean 자료형을 지원한다.
기본 문법
- # : 해당 라인을 주석처리
- --- : 문서의 시작을 알림(옵션)
- ... : 문서의 끝을 알림(옵션)
- key : 딕셔너리 자료형의 키 값과 동일 개념
- value : 딕셔너리 자료형의 벨류 값과 동일 개념
*예시
참고로, " | "는 마지막 줄바꿈을 포함하겠다는 의미의 줄바꿈 표시이다.
참고로, " |- "는 마지막 줄바꿈을 포함하지 않겠다는 의미의 줄바꿈 표시이다.
참고로, " > "는 중간에 있는 줄바꿈을 무시하는 의미의 줄바꿈 표시이다.
예제를 통한 docker compose 사용법 이해하기
docker-compose.yml 예제 코드를 통해 docker compose 사용법을 이해하고자 한다.
*docker-compose.yml 예시(1)
version: "3"
service:
db:
image: mysql:5.7
restart: always
volumes:
- ./mysqldata:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=dgkcoding
- MYSQL_DATABASE=dgkdb
ports:
- "3306:3306"
기본적으로 docker-compose.yml은 version, services, volumes, networks의 카테고리로 작성된다.
하지만, 주로 version과 services가 많이 사용된다.
- version
docker compose의 파일 포맷 버전을 지정한다.
기본적으로 버전 3을 사용하는 것이 일반적이다.
- services
한개 또는 여러 개의 docker container를 설정한다.
- image
docker container의 이름을 정의한다.
Docker Hub에 있는 이미지를 사용하여 docker container를 작성할 경우 image를 설정할 수 있다.
- restart
docker container가 다운되었을 경우, 항상 재시작하라는 설정이다.
- volumes
docker run 명령의 -v 옵션과 동일한 역할을 한다.
여러 개의 volume을 지정할 수 있으며 리스트처럼 작성하면 된다.
- environment
dockerfile의 ENV 옵션과 동일한 역할을 한다.
참고로, env_file 옵션으로 환경변수 값이 들어있는 파일을 읽을 수도 있다. (패스워드 등의 보안을 위한 방법)
(참고)
env_file 포맷
$ cat mysql.env
MYSQL_ROOT_PASSWORD=dgkcoding
MYSQL_DATABASE=dgkdb
- ports
docker run 명령의 -p 옵션과 동일한 역할을 한다.
참고로, 포트번호를 입력할 때에는 반드시 쌍따옴표 안에 작성해야 한다. (YAML 문법에서 숫자:숫자 는 시간으로 해석하기 때문)
- networks
docker container 간의 네트워크 분리를 위해 추가로 설정을 한다. (옵션)
*docker-compose.yml 예시(2)
version: "3"
services:
app:
build:
context: ./01_FLASK_DOCKER
dockerfile: Dockerfile
links:
- "db:mysqldb"
ports:
- "80:8080"
container_name: appcontainer
depends_on:
- db
db:
image: mysql:5.7
restart: always
volumes:
- ./mysqldata:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=dgkcoding
- MYSQL_DATABASE=dgkdb
ports:
- "3306:3306"
container_name: dbcontainer
- build
docker image를 Dockerfile 기반으로 작성 시 사용한다.
참고로, context는 Dockerfile이 있는 디렉토리를 의미하며 dockerfile은 Dockerfile의 파일명을 의미한다.
- links (docker run 명령의 -link 옵션과 유사한 기능)
특정 docker container 내부에서 다른 docker container에 접속하고 싶을 때 사용한다.
위의 YAML 파일의 예시는 app 컨테이너에서 db 컨테이너로 접속하려는 경우를 보여주는 것이다.
참고로, "db : mysqldb"는 app 컨테이너가 db 컨테이너로 접속할 때 'mysqldb' 라는 이름을 사용하겠다는 의미이다.
- container_name
docker-compose.yml 파일로 docker container를 만들 때, 해당 컨테이너 이름을 설정할 수 있다.
(ex. container_name : appcontainer)
- depends_on
여러 개의 docker container를 Docker Compose로 실행할 경우, 각 컨테이너가 실행되는 시점이 다르기 때문에 특정 컨테이너가 시작하자마자 바로 다른 컨테이너에 접속하면 경우에 따라서는 접속할 수 없는 상황이 발생한다.
(ex. 다른 컨테이너가 아직 실행되지 않은 경우)
따라서, depend_on을 사용하여 컨테이너가 실행되는 순서를 제어할 수 있다.
위의 예시에서는 " depend_on : - db " 이므로 우선적으로 db 컨테이너가 먼저 실행되고 그 후에 app컨테이너가 실행되어 app 컨테이너가 db 컨테이너로 접속을 시도하도록 컨테이너 실행 순서를 제어하는 것이다.
하지만, depend_on도 컨테이너가 실행되는 순서만 제어할 뿐 해당 컨테이너들이 완전히 실행되기까지의 준비상태가 되는 것은 제어할 수 없다.
docker compose 명령 이해하기
docker-compose 실행 명령
docker-compose up -d
*결과 :
우선, "mkdir 01_DockerCompose" 명령으로 01_DockerCompose 폴더를 만든다.
그 후에 해당 작업폴더로 들어가서 vi docker-compose.yml 명령으로 docker-compose.yml 파일을 만든다.
일반적으로 docker-compose 실행 명령을 사용할 때에는 -d 옵션을 함께 포함해서 백그라운드로 실행한다.
*참고
만약, image 재빌드가 필요하면 docker-compose 실행 명령에 --build 옵션을 추가해야 한다.
해당 옵션없이 docker-compose 실행 명령을 사용하면 이미 작성된 image를 사용한다.
docker-compose 중지 명령
docker-compose stop
*결과 :
docker-compose up으로 생성된 docker container를 중지시키는 명령이다. (삭제X)
docker-comopse 삭제 명령
docker-compose down
*결과 :
docker-compose up으로 생성된 docker container를 삭제시키는 명령이다.
*참고
- docker-compose logs : docker container의 모든 로그(출력 결과) 확인
- docker-compose config : 실행 중인 Docker Compose의 docker-compose.yml 파일 설정 확인
- docker-compose exec 컨테이너명 명령 : 실행 중인 docker container에 명령어를 실행
'Docker' 카테고리의 다른 글
Docker - reverse proxy와 nginx 웹서버의 주요 설정 (1) | 2021.12.25 |
---|---|
Docker - 도커로 nginx 웹서버 구축하기 (1) | 2021.12.23 |
Docker - 컨테이너와 컨테이너를 연결하기 (0) | 2021.12.19 |
Docker - 도커로 주피터 노트북 서버 만들기 (0) | 2021.12.19 |
Docker - docker 기타 명령 (0) | 2021.12.18 |
댓글