Docker 컨테이너를 생성하다보니, 프로젝트 팀원과 함께 사용할 공용 공간이 있으면 좋겠다고 생각했다.
즉, NAS나 Cloud처럼 구성해서 외부에서 파일 시스템 관리가 쉽게 하고, Docker 컨테이너에서 해당 디렉토리를 공용 디렉토리로 마운트해 사용하면 편하겠다 싶었다.
그래서 현재 존재하는 컨테이너에 공용 디렉토리를 마운트하는 방법, 관리하는 방법을 찾다보니 Docker의 규모가 복잡해지고 관리할 컨테이너가 많아질수록 Docker-compose를 사용하는 것이 편리한 방법임을 알게 되었다.
그래서 일단 Docker compose를 구축하고 공용 디렉토리를 구축한 뒤 이어서 컨테이너를 다시 구축해보겠다.
Docker Compose는 여러 Docker 컨테이너를 정의하고 관리하는 도구이다. 주로 docker-compose.yml이라는 파일을 통해 컨테이너의 설정(이미지, 볼륨, 네트웤, 환경 변수 등)을 선언적으로 작성하고, 이를 기반으로 컨테이너를 일괄적으로 생성, 시작, 중지, 삭제할 수 있다.
다음 명령어로 Docker를 설치한다.
sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -Po '"tag_name": "\K.*?(?=")')/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose 패키지를 가져와 패키지 매니저로 설치하는 과정이 아니라, 바로 실행할 수 있는 bin 파일을 다운로드한 뒤 bin 폴더에 배치시켜 사용하는 방식인 것 같다.
아래 명령어로 설치를 확인한다.
docker-compose --version
docker-compose.yml 파일은 프로젝트 루트 디렉토리에 생성한다. 예를 들어 3개의 컨테이너(백엔드, 프론트엔드, 데이터베이스)를 구성한다고 하면 다음과 같다.
version: '3.8'
services:
backend:
image: openjdk:17-alpine
container_name: backend
ports:
- "8080:8080"
volumes:
- ./bacnend/target:/app
command: ["java", "-jar", "/app/app.jar"]
frontend:
image: nginx:alpine
container_name: frontend
ports:
- "80:80"
volumes:
- ./frontend/build:/usr/share/nginx/html
database:
image: mysql:8.0
container_name: database
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
volumes:
- ./db_data:/var/lib/mysql
자주 사용되는 명령어는 다음과 같다.
#컨테이너 실행
docker-compose up -d
#컨테이너 중지
docker-compose down
#실행 중인 서비스 확인
docker-compose ps
#로그 확인
docker-compose logs
#특정 서비스만 실행
docker-compose up -d backend