Docker Compose
docker-compose
개요
- yaml 포맷으로 기술된 설정 파일을 이용해서 여러 Container 간의 실행이나 관계를 설정
- 시스템을 일괄 실행 또는 일괄 종료 및 삭제 할 수 있는 도구
- 컨테이너나 볼륨을 어떠한 설정으로 만들지에 대한 항목이 기재돼 있는데 작성 내용은 docker 명령어와 비슷하지만 docker 명령어는 아님
up 커맨드는 docker run 커맨드와 유사해서 정의 파일에 기재된 내용대로 이미지를 내려받고 컨테이너를 생성 및 실행하는데 정의 파일에는 네트워크나 볼륨에 대한 정의도 기재할 수 있어서 주변 환경을 한꺼번에 생성할 수 있음
down 커맨드는 컨테이너와 네트워크를 정지 및 삭제하는 것으로 볼륨과 이미지는 삭제하지 않고 컨테이너와 네트워크 삭제없이 종료만 하고 싶다면 stop 커맨드를 사용
Docker Compose와 Dockerfile
- docker compose 는 docker run 명령어를 여러 개 모아놓은 것과 같은데 컨테이너와 주변 환경을 생성하며 네트워크와 볼륨까지 함께 만들 수 있음
- Dockerfile 스크립트는 이미지를 만들기 위한 것으로 네트워크나 볼륨은 만들 수 없음
docker compose 작성 및 실행
docker run --name apa000ex1 -d -p 8080:80 httpd
version: "3"
services:
apa000ex2:
image: httpd
ports:
-8081:80
restart: always
docker-compose up -d
docker ps
Maria DB 테스트
version: '3.8'
services:
mariadb:
image: mariadb:10.4.6
container_name: mariadb-server
restart: always
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: my_database
MYSQL_USER: my_user
MYSQL_PASSWORD: my_user_password
ports:
- "3306:3306"
volumes:
- ./data:/var/lib/mysql
- ./init:/docker-entrypoint-initdb.d
docker-compose up -d
docker network ls
- 네트워크
docker-compose up 명령을 수행하면 자체 기본 네트워크가 생성되는데 up 과 동시에 가장 먼저 기본 네트워크를 디렉터리명_default 이름으로 생성
- 이후 도커 컴포즈에 포함된 다중 컨테이너를 구동하고 이 네트워크에 컨테이너 서비스를 연결하게 되며 이 기본 네트워크를 통해 IP가 아닌 서비스명(컨테이너명)으로 서비스 간 통신을 할 수 있음
작성 방법
- 파일 이름
docker-compose.yaml / docker-compose.yml / compose.yaml / compose.yml 등
- 주 항목
version
services
networks
volumes
- 정의 내용
image
networks: --net
volumes: -v
ports: -p
environment: -e
depends_on: 다른 서비스에 대한 의존 관계
restart: 컨테이너 종료 시 재시작 여부(no, always, on-failure, unless-stopped)
버전 정의
- yaml 코드 첫 줄은 버전 명시
- 버전 선택은 docker 엔진 릴리스에 적합한 버전을 선택하는데 만일 버전이 맞지 않으면 에러 메시지를 출력
- docker 버전 및 docker compose 버전 업데이트 속도가 잦은 편이니 종종 docker 도큐먼트를 참고하여 버전 변화를 참고
- 에러 발생 원인
- 작성한 버전과 현재 docker compose 또는 docker 엔진 릴리스가 적합하지 않은 경우
- docker compose 도구가 오래된 경우 - 새로운 버전으로 업데이트 필요
- 버전 문제가 아닌 들여쓰기의 공백 수가 하위 레벨과 맞지 않은 경우
서비스 정의
- docker compose 를 통해 실행할 서비스를 정의
- docker compose 는 컨테이너 대신 서비스 개념을 사용
- 상위의 version 명령과 동일 레벨로 작성되며 다중 컨테이너 서비스 실행을 목적으로 하기 때문에 복수형으로 작성되는 것에 유의
- docker compose 로 함께 실행된 모든 서비스는 docker compose 명령을 통해 통합 관리
- services 하위에는 실행될 컨테이너 서비스를 작성하고 하위 레벨에 docker 명령 실행과 유사하게 컨테이너 실행에 필요한 옵션을 작성
- 프로젝트에 필요한 애플리케이션 개발을 위해 Dockerfile 을 작성하여 컨테이너를 실행하는 경우에는 미리 빌드해서 이미지명 태그를 명시해도 되지만 build 옵션을 사용하면 docker compose 실행과 함께 이미지를 빌드
- build 옵션은 이미지 빌드에 필요한 Dockerfile의 경로를 지정하고 docker-compose.yaml 파일과 동일 경로에 위치한 경우에는
. 을 이용해 Dockerfile 이 같은 경로에 있음을 명시
서비스 정의 - 하위 옵션
container_name
- docker run 의 --name 옵션과 동일하며 생략 시 자동으로 부여됨
- 디렉토리명_서비스명_n
ports
- docker run 의 -p 옵션과 동일하며 서비스 내부 포트와 외부 호스트 포트를 지정하여 바인드
expose
- 호스트 운영체제와 직접 연결하는 포트를 구성하지 않고 포트를 노출하는데 필요 시 링크로 연결된 서비스와 서비스 간의 통신만 사용
networks
- docker run 의 --net(--network) 옵션과 동일하며 최상위 레벨의 networks에 정의된 네트워크 이름을 작성
volumes
- docker run 의 -v(--volume) 옵션과 동일한데 서비스 내부 디렉토리와 호스트 디렉토리를 연결하여 데이터 지속성 설정
environment
- docker run의 -e 옵션과 동일한데 서비스 내부 환경 변수 설정에 이용하며 환경 변수가 많은 경우에는 파일(*.env)로 만들어 env_file 옵션에 파일명을 지정(envfile: ./envfile.env)
command
- docker run의 마지막에 작성되는 명령어로 서비스가 구동 이후 실행
할 명령어 작성
restart
- docker run의 --restart 옵션과 동일하며 서비스 재시작 옵션 지정
- no: 수동 재시작
- always: 컨테이너 수동 제어를 제외하고 항상 재시작
- on-failure: 오류가 있을 시 재시작
depends_on
- 서비스 간의 종속성을 의미하며 먼저 실행해야 하는 서비스를 지정하여 순서를 정한느데 이 옵션에 지정된 서비스가 먼저 시작됨
네트워크 정의
- 다중 컨테이너들이 사용할 최상위 네트워크 키를 정의하고 이하 하위 서비스 단위로 이 네트워크를 선택할 수 있음
- networks 옵션을 지정하지 않으면 자체 기본 네트워크가 생성되고 대역은 172.x.x.x 로 자동 할당되며 기본 드라이버는 브리지로 지정됨
- docker에서 생성한 기존 네트워크를 지정하는 경우에는 externel 옵션에 네트워크 이름을 작성
볼륨 정의
- 데이터의 지속성을 유지하기 위해 최상위 레벨에 볼륨을 정의하고 서비스 레벨에서 볼륨명과 서비스 내부의 디렉토리를 바인드
- docker volume create 와 동일하게 docker 가 관리하는 가상 영역(/var/lib/docker/volume)에 자동 배치
docker volume ls 명령을 통해서 확인 가능하고, docker volume inspect 볼륨명 으로 세부 디렉토리 경로까지 알 수 있음
- 최상위 레벨에 volumes를 정의하지 않고 서비스 하위 레벨에 호스트의 절대 경로와 컨테이너의 디렉토리 경로를 직접 사용하는 바인드 마운트 방식도 가능
컨테이너 간의 통신
- 외부에서 도커 내부의 컨테이너에 접근하고자 하는 경우에는 도커 컨테이너를 생성할 때 포트포워딩을 수행해서 접근
- 하나의 도커 엔진에 만들어진 컨테이너 간에는 도커 엔진에서 부여한 IP를 이용해서 접근 가능 -
docker inspect network bridge