#docker
도커 컴포즈 개념과 사용 방법을 간단하게 살펴보자!
여러 개의 Docker 컨테이너들을 하나의 서비스로 정의하고 구성해 하나의 묶음으로 관리할 수 있게 도와주는 툴
여러 개의 컨테이너를 관리하는 데 용이
여러 개의 컨테이너로 이루어진 복잡한 애플리케이션을 한 번에 관리할 수 있게 해준다. 여러 컨테이너를 하나의 환경에서 실행하고 관리하는 데 도움이 된다.
복잡한 명령어로 실행시킨 과정을 간소화 할 수 있다.
Docker Compose를 사용하면 컨테이너를 실행시킬 때마다 복잡한 명령어를 입력하지 않아도 된다. 단순히 docker compose up 명령어만 실행시키면 된다.
services:
webserver:
container_name: webserver
image: nginx
ports:
- 80:80
service라고 부른다. services : service를 나열하기 전 입력하는 명령어webserver : services 바로 밑에 위치한 이름은 service의 이름을 나타낸다. 임의로 작성하면 된다.container_name : 서비스가 컨테이너가 될 때 가지게될 이름을 의미한다.image : 서비스의 기반이될 이미지를 의미한다.ports : 서비스가 컨테이너가 됐을 때 사용할 호스트:컨테이너 포트를 의미한다.docker compose up # 포그라운드에서 실행
docker compose up -d # 백그라운드에서 실행
# compose.yml에 정의된 컨테이너 중 실행 중인 컨테이너만 보여준다.
docker compose ps
# compose.yml에 정의된 모든 컨테이너를 보여준다.
docker compose ps -a
# compose.yml에 정의된 모든 컨테이너의 로그를 모아서 출력한다.
docker compose logs
docker compose up --build # 포그라운드에서 실행
docker compose up -d --build # 백그라운드에서 실행
compose.yml에서 정의한 이미지 파일에서 코드가 변경 됐을 경우, 이미지를 다시 빌드해서 컨테이너를 실행시켜야 변경된 부분이 적용된다. 그러므로 --build 옵션을 추가해서 사용해야 한다.docker compose up : 이미지가 없을 때만 빌드해서 컨테이너를 실행시킨다. 이미지가 존재하는 경우 컨테이너만 실행시킨다.docker compose up --build : 이미지가 있더라도 빌드를 다시해서 컨테이너를 실행시킨다.docker compose pull
compose.yml에서 정의된 이미지를 다운 받거나 업데이트 한다.docker compose down
services:
my-cache-server:
image: redis
ports:
- 6379:6379
docker compose up -d
docker compose ps
docker ps
docker compose down
services:
my-db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: password123
volumes:
- ./mysql_data:/var/lib/mysql # docker compose는 상대경로 허용
ports:
- 3306:3306
services:
my-server:
build: . # Dockerfile 과 같은 경로에 있다고 가정 (상대경로)
ports:
- 8080:8080
docker compose up -d --build
--build 옵션을 추가한다. --build 명령어로 해당 내역을 반영한다.services:
my-db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: password123
volumes:
- ./mysql_data:/var/lib/mysql
ports:
- 3306:3306
my-cache-server:
image: redis
ports:
- 6379:6379
compose.yml (스프링 프로젝트에 포함)
services:
my-server:
build: .
ports:
- 8080:8080
depends_on:
my-db:
condition: service_healthy
my-db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: password123
MYSQL_DATABASE: mydb # db 이름
volumes:
- ./mysql_data:/var/lib/mysql
ports:
- 3306:3306
healthckeck:
test: [ "CMD", "mysqladmin", "ping" ]
interval: 5s
retries: 10
depends_on : 스프링 애플리케이션은 MySQL에 의존한다. MySQL 컨테이너가 아직 실행 전이라면 스프링 서버도 실행될 수 없다. 따라서 컨테이너 실행 순서를 지정해야한다. 이때 사용하는 명령어이다.services:
my-server:
build: .
ports:
- 8080:8080
depends_on:
my-db:
condition: service_healthy
my-cache-server:
condition: service_health
my-db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: password123
MYSQL_DATABASE: mydb # db 이름
volumes:
- ./mysql_data:/var/lib/mysql
ports:
- 3306:3306
healthckeck:
test: [ "CMD", "mysqladmin", "ping" ]
interval: 5s
retries: 10
my-cache-server:
image: redis
ports:
- 6379:6379
healthcheck:
test: [ "CMD", "redist-cli", "ping" ]
interval: 5s
retries: 10