[docker] 도커 컴포즈 By starseat 2023-01-26 17:13:51 server/oss Post Tags # 도커 컴포즈란? - 도커 명령어를 정의 파일에 기술해 실행하는 도구 - 시스템 구축과 관련된 명령어를 하나의 텍스트 파일(정의 파일, yaml)에 기재해 명령어 한번에 시스템 전체를 실행하고 종료와 폐기까지 한번에 하도록 도와주는 도구 - 시스템 구축에 필요한 설정을 `YAML`(YAML Ain't a Markup Language) 포맷으로 기재한 정의 파일을 이용해 전체 시스템을 일괄 실행(run) 또는 일괄 종료 및 삭제(down) emddmf gkf tn dlTsms ehrn - `up 커맨드` - `docker run` 커맨드와 비슷 - 정의 파일에 기재된 내용대로 이미지를 내려받고 컨테이너를 생성 및 실행 - 정의 파일에는 네트워크나 볼륨에 대한 정의도 기재할 수 있어 주변 환경을 한꺼번에 생성 가능 - `down 커맨드` - 컨테이너와 네트워크를 정지 및 삭제 - 볼륨과 이미지는 삭제하지 않음 - 컨테이너와 네트워크 삭제 없이 종료만 하고 싶다면 `stop` 커맨드 사용 ## 도커 컴포즈와 Dockerfile 차이점 - 도커 컴포즈 - `docker run` 명령어를 여러 개 모아 놓은 것 - 컨테이너 주변 환경 생성 - 네트워크와 볼륨까지 함께 생성 가능 - Dockerfile - 이미지를 만들기 위한 것 - 네트워크나 볼륨 생성 불가능 # 도커 컴포즈 설치 - 도커 컴포즈는 도커 엔진과 별개의 소프트웨어이기 때문에 설치가 필요함. - 정의 파일은 이미 정해진 이름인 `docker-compose.yml` 사용. - 기본 설정이 `docker-compose.yml` 이고 다른 이름도 사용 가능하나 인자로 이름 지정 필요 - 윈도우나 MacOS 에서 사용하는 도커 데스크톱은 도커 컴포즈가 함께 설치 됨. - 리눅스용 도커 컴포즈 설치 (책 내용) ```text sudo apt install -y python3 python3-pip sudo pip3 install docker-compose docker-compose -version ``` - 리눅스용 도커 컴포즈 설치(우분투) - [https://github.com/docker/compose/releases](https://github.com/docker/compose/releases) 에서 확인 ```text // 설치 sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose // 권한 설정 sudo chmod +x /usr/local/bin/docker-compose // 심볼릭 링크 설정 sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose // 버전 확인 (설치 확인) docker-compose -version ``` # 도커 컴포즈 파일 작성 1. 첫 줄에 컴포즈 버전 작성 2. 주 항목 services, networks, volumes 를 차례로 기재 2.1. services: 컨테이너에 대한 내용 2.2. 컨테이너의 집합체를 서비스 라고 칭함. 2.3. 주 항목 > 이름 추가 > 설정 순으로 작성 3. 항목 간의 상하 관계는 공백을 사용한 들여쓰기로 구분 3.1. 공백의 개수는 몇 개여도 상관 없지만 **공백 두 칸**을 많이 사용함. 3.2. 탭(tab, \t)은 사용할 수 없음. 4. 이름은 주 항목 아래에 들여쓰기 한 다음 기재 5. 컨테이너 설정 내용은 이름 아래에 들여쓰기 한 다음 기재 6. 여러 항목을 기재하려면 줄 앞에 '-' 를 붙임. 6.1. '-' 를 붙이면 그 만큼 공백을 맞춰주어야 함. 7. 이름 뒤에는 콜론(:) 을 붙임 8. 콜론 뒤에는 반드시 공백이 와야 함.(바로 줄바꿈 하는 경우는 예외) 9. # 뒤 내용은 주석으로 간주 10. 문자열은 작은 따옴표(') 또는 큰 따옴표(")로 감싸 작성 - 주 항목 작성 예 ```text version: "3" // 버전 기재 services: // 컨테이너 관련 정보 networks: // 네트워크 관련 정보 volumes: // 볼륨 관련 정보 ``` - 이름 추가 예 ```text version: "3" services: 컨테이너_이름1: 컨테이너_이름2: networks: 네트워크_이름1: volumes: 볼륨_이름1: 볼륨_이름2: ``` - 설정 기재 예 ```text version: "3" services: # 컨테이너 설정 내용 컨테이너_이름1: # 컨테이너1의 설정 내용 image: 이미지_이름 networks: - 네트워크_이름 ports: - 포트_설정 ... 컨테이너_이름2: # 컨테이너2의 설정 내용 image: 이미지_이름 ... networks: # 네트워크 서정 내용 네트워크_이름: ... volumes: # 볼륨 설정 내용 볼륨_이름1: 볼륨_이름2: ... ``` - 자주 나오는 정의 내용 - 규격으ㅐ 벚ㄴ업과 함꼐 정의 항목에도 변화가 있을 수 있으므로 공식 참조문서 확인 필요 | 항목 | docker run 커맨드의 해당 옵션 or 인자 | 내용 | | -- | -- | -- | | image | 이미지 인자 | 사용할 이미지 지정 | | networks | --net | 접속할 네트워크 지정 | | volumes | -v, --mount | 스토리지 마운트 설정 | | ports | -p | 포트 설정 | | environment | -e | 환경 변수 설정 | | depends_on | 없음 | 다른 서비스에 대한 의존관계 정의 | | **restart** | 없음 | 컨테이너 종료 시 재시작 여부 설정 | | command | 커맨드 인자 | 컨테이너 시작 시 기존 컨테이너 오버라이드 | | container_name | --name | 실행할 컨테이너의 이름을 명시적으로 지정 | | dns | --dns | DNS 서버를 명시적으로 지정 | | env_file | 없음 | 환경설정 정보를 기재한 파일 로드 | | entrypoint | --entrypoint | 컨테이너 시작 시 ENTRYPOINT 설정을 오버라이드 | | external_links | --link | 외부 링크 설정 | | extra_hosts | --add-host | 외부 호스트의 IP 주소를 명시적으로 지정 | | logging | --log-driver | 로그 출력 대상 설정 | | network_mode | --network | 네트워크 모드 설정 | - **restart** 설정 값 | 설정 값 | 내용 | | -- | -- | | no | 재시작 X | | always | 항항 재시작 | | on-failure | 프로세스가 0 이외의 상태로 종료됐다면 재시작 | | unless-stopped | 종료 시 재시작하지 않음. 그 외에는 재시작 | ## 도커 컴포즈 파일 (정의 파일) 작성 예 - httpd 컨테이너 컴포즈 예제 - 컨테이너 실행 명령어와 내용이 같음 - `docker run --name apa000ex01 -d -p 8080:80 httpd` ```yaml version: "3" services: apa000ex01: image: httpd ports: - 8080:80 restart: always ``` - 워드프레스 컨테이너 컴포즈 예제 (MySQL, 네트워크 등 생략) ```text // 컨테이너 실행 명령어 docker run --name wordpress000ex01 -dit --net=wordpress000net01 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex01 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000user -e WORDPRESS_DB_PASSWORD=wordpress000pass wordpress ``` ```yaml # 워드프레스 컨테이너 version: "3" services: wordpress000ex01: depends_on: - mysql000ex01 image: wordpress networks: - wordpress000net01 ports: - 8085:80 restart: always environment: WORDPRESS_DB_HOST=mysql000ex01 WORDPRESS_DB_NAME=wordpress000db WORDPRESS_DB_USER=wordpress000user WORDPRESS_DB_PASSWORD=wordpress000pass ``` # 출처 - [그림과 실습으로 배우는 도커 & 쿠버네티스](https://wikibook.co.kr/dkkb/) - [[Docker-Compose] 도커 컴포즈 설치 및 사용](https://soyoung-new-challenge.tistory.com/73) Previous Post [docker] 컨테이너 응용 - 컨테이너 개조 Next Post [docker] 도커 컴포즈 실습