도커를 사용하다 보면 상당히 많은 컨테이너를 관리하여야 하는 경우가 발생합니다. 또한 여러 도커 컨테이너로 이루어진 애플리케이션을 정의하고 실행하여야 하는 경우도 있습니다. 이러한 경우에 컨테이너들을 관리하고 실행할 수 있게 해주는 도커 컴포즈에 대하여 기록하겠습니다.
목차
도커 컴포즈란?
도커 컴포즈 파일 생성 (YAML)
도커 컴포즈 명령어
도커 컴포즈 사용 예시
도커 컴포즈란?
도커 컴포즈는 도커 컨테이너를 관리하고 실행하는 도구로, 다중 컨테이너 애플리케이션을 정의하고 실행하기 위한 도커의 확장 기능입니다. 도커 컴포즈를 사용하면 복잡한 멀티 컨테이너 애플리케이션을 간단하게 정의하고 실행할 수 있습니다. 이번 글에서 예시로 보이는 도커 컴포즈는 Go 언어로 작성한 웹 서버 컨테이너와 mysql 컨테이너를 도커 컴포즈를 사용하여 실행하는 YAML파일이 되겠습니다.
Go의 웹서버가 mysql과 통신하는 방법에 대한 코드 설명은 아래의 주소에 기록해 두었습니다.
도커 컴포즈 파일 생성 (YAML)
주의사항
1. 도커 컴포즈를 위한 YAML파일 작성을 하기 전에 파일이름과 확장자를 'docker-compose.yml'로 하여야 합니다. 이름이 고정되어 있기 때문에 한 폴더에 하나만 존재할 수 있습니다.
2. 여러 개의 정의 파일을 사용하려면 폴더를 생성하여 따로 보관하여야 합니다.
3. 도커는 공백에 따라 의미가 달라지므로 공백 두 개로 들여 쓰기를 했다면 그 뒤로도 공백 두 개가 한 단이 되도록 작성하여야 합니다.
YAML파일 작성 규칙
version
맨 위에 version을 작성합니다. 도커 컴포즈의 파일 버전을 작성해 주시면 됩니다.
version: "1"
services
두 번째로 services를 작성합니다. services는 컨테이너와 관련된 정보를 입력합니다.
servieces:
web:
#서비스 구성
db:
#서비스 구성
여기서부터는 서비스 구성에 대한 키워드입니다.
image
컨테이너가 실행될 때 사용할 이미지의 이름과 태그를 지정합니다.
web:
image: golang:alpine
container_name
컨테이너의 이름을 지정합니다. docker의 --name 역할을 합니다.
web:
container_name: go-web-server
ports
호스트와 컨테이너 간의 포트를 매핑합니다. docker의 -p 플래그 역할을 합니다.
web:
ports:
- "8080:8080"
volumes
컨테이너와 호스트 간의 데이터 공유를 하기 위한 볼륨을 설정합니다. docker의 -v 플래그 역할을 합니다.
web:
volumes:
- ./test:/app/data
environment 또는 env_file
'environment'는 직접 환경변수를 지정하고, 'env_file'은 환경 변수를 파일로부터 읽어옵니다.
web:
environment:
- ID=root
- PW=1q2w3e4r!
env_file:
- ./envfile.env
depends_on
YAML파일 내의 다른 서비스에 종속적인 경우 사용합니다. 종속성을 가진 서비스는 해당 서비스가 실행될 때까지 대기합니다.
web:
depends_on:
- db
networks
컨테이너가 속하는 네트워크를 지정합니다. 여러 서비스가 동일한 네트워크에 속하면 서로 통신할 수 있습니다.
web:
networks:
- test-network
restart
컨테이너가 종료될 때 다시 시작할지 여부를 설정합니다.
web:
restart: always
build
컨테이너 이미지를 빌드하기 위한 도커파일 경로를 지정합니다.
web:
build:
context: ./myapp
dockerfile: Dockerfile.prod
도커 컴포즈 명령어
도커 컴포즈를 사용하기 위한 몇 가지 명령어를 소개해드리겠습니다.
docker-compose up : 도커 컴포즈 파일을 사용하여 애플리케이션을 시작합니다.
docker-compose down : 애플리케이션을 중지하고 모든 컨테이너와 네트워크를 정리합니다.
docker-compose ps : 실행 중인 서비스와 컨테이너 목록을 표시합니다.
docker-compose exec : 컨테이너 내부로 들어가 명령을 실행합니다.
도커 컴포즈 사용 예시
처음에 말씀드렸던 Go로 작성한 웹 서버 컨테이너와 mysql 컨테이너가 통신하는 애플리케이션을 도커 컴포즈의 YAML 파일로 작성하여 실행하는 예시를 보여드리겠습니다.
예시에 대한 코드는 아래의 github 주소에 올려두었습니다.
https://github.com/rainbow96bear/golang_practice/tree/master/docker/docker_compose
version: "1"
services:
mysql:
build:
context: ./mysql
dockerfile: mysqlDockerfile
ports:
- "3333:3306"
container_name: mysqlDB
environment:
MYSQL_ROOT_PASSWORD: 1q2w3e4r!
MYSQL_DATABASE: Books
restart: always
go-web:
build:
context: ./webServer
dockerfile: webServerDockerfile
ports:
- "8080:8080"
depends_on:
- mysql
container_name: GoWebServer
restart: always
YAML파일을 작성하면 위와 같습니다. 웹 서버와 DB를 동시에 생성하기 위하여 'services'의 값으로 'mysql'과 'go-web' 두 가지를 선언하였습니다.
'mysql'의 경우 build 할 이미지를 Dockerfile로 작성해 두었습니다. 도커파일에 대한 내용은 위의 github 주소에서 확인할 수 있습니다.
'ports'는 host는 3333 포트를 컨테이너는 3306 포트를 사용하도록 지정하였고 'environment'를 사용하여 mysql의 root계정 비밀번호를 설정하였습니다.
'mysql'의 설명과 마찬가지로 'go-web' 또한 'build'를 이용하여 Dockerfile의 내용을 토대로 이미지를 생성하도록 하였고 'depends_on'을 사용하여 'mysql'에 의존성을 부여하여 mysql이 실행되기를 기다리도록 하였습니다. 이유는 서버가 생성될 때 DB연결을 확인하기 때문에 DB가 생성되어 있어야 연결확인에 문제가 없어 의존성을 부여하였습니다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] commit 명령어를 이용한 이미지 생성 (0) | 2023.09.16 |
---|---|
[Docker] 도커파일과 이미지생성 (0) | 2023.09.16 |
[Docker] Docker 포트 설정과 브릿지 네트워크 생성, 연결 (0) | 2023.09.09 |
[Docker] Docker 볼륨 이해하기 (데이터 공유, 관련 명령) (0) | 2023.09.08 |
[Docker] Docker(도커) 시작하기 (설치, 기본 명령어, Docker desktop) (0) | 2023.09.08 |