compose 란, "구성하다" 라는 사전적 의미를 갖고있다.
docker compose 란, 여러 개의 컨테이너를 실행시켜 하나의 apllication 을 구성하는 것을 말한다.
command | description |
---|---|
docker compose pull | service 에 정의된 image pull |
docker compose build | service 에 정의된 image pull |
docker compose up -d --build | make sure to rebuild all local images |
docker compose down | make sure to rebuild all local images |
docker compose down --rmi all | remove all local images |
version: "3" # docker-compose version
services: # service 정의
redis-server: # service 이름
image: "redis" # container 가 사용하는 image
container_name: "redis-server" # container 이름
client-server: # container(service) 이름
build: . # Dockerfile 경로
===================================
(
build:
context: ./client 처럼 경로를 지정해줄 수 있다.
)
===================================
ports:
- "3000:3000" # port binding
restart: always # 항상 재시작
# custom Dockerfile 사용시
client-server:
context: ./client
depends_on:
- postgres # postgres 를 먼저 실행하고 client-server 실행
postgres:
image: postgres:11
volumes: # volume mount
- './data/postgres:/var/lib/postgresql/data'
restart: always
environment: # container 안에서 사용하는 환경 변수 정의
POSTGRES_PASSWORD: '...'
POSTGRES_USER: '...'
POSTGRES_DB: '...'
[docker compose context] https://docs.docker.com/compose/compose-file/build/#context-required
https://docs.docker.com/compose/compose-file/
https://compose-spec.io/
version: "1"
services:
postgres:
image: postgres:16
volumes:
- ./data/pgdata:/var/lib/postgresql/data
restart: always
# container 안에서 사용하는 환경 변수 정의
environment:
POSTGRES_PASSWORD: '...'
POSTGRES_USER: '...'
POSTGRES_DB: '...'
# container 안에서 사용하는 환경 변수를 파일로 정의
env_file:
- .env
이미지가 없을 경우 빌드 후에 컨테이너를 실행한다
docker compose up [-d] [--build]
-d
: detached mode, 컨테이너를 background 에서 실행
--build
: 이미지 유뮤와 관계 없이 docker-compose.yml 파일에 맞게 다시 빌드해서 실행시킨다.
동작중인 컨테이너들의 상태 확인
docker compose ps
docker compose run [serviceName] [command]
# docker compose run redis /bin/bash
docker compose
실행시에 profile
을 사용해서 서비스를 분리해 실행 시킬 수 있다.
# https://github.com/smartcontracts/simple-optimism-node/blob/sc/bedrock/docker-compose.yml 참조
version: "3.4"
services:
dtl:
...
profiles:
- legacy
l2geth:
...
profiles:
- legacy
healthcheck:
...
profiles:
- current
이후에 실행할 때엔 아래와 같이 실행시킬 수 있다.
docker compose --profile current up -d
docker compose --profile lecacy up -d
docker compose pull
이 최신 이미지를 가져오는 명령어라고 알고있다.
하지만, docker compose up
명령어를 실행하여도 이미지를 가져오는 것을 볼 수 있다.
그렇다면 docker compose up
만 사용하면 되는 것이 아닐까? 하는 의문이 들었다.
찾아보니, 역시 docker compose pull
이 존재하는 이유가 있었다.
docker compose up
의 경우, 이미지를 다운로드 받지만 만약 이미지 tag
가 존재하는 경우 repository 이미지에 새로운 업데이트 내용이 존재하더라도 이미지를 다운받지 않는다.
반면에 docker compose pull
의 경우 무조건 이미지를 다운로드 받고 업데이트를 진행한다. 그렇기 때문에 repo:latest
와 같이 latest tag 를 넣어두었을 경우 docker compose up
만으로는 최신 이미지임을 보장할 수 없게되므로 반드시 docker compose pull & docker compose up
으로 실행해주어야 한다.
모든 컨테이너 삭제
docker compose down
멈춘 컨테이너 모두 삭제
docker compose rm
[ref]
https://www.baeldung.com/ops/docker-compose-latest-image
https://docs.docker.com/compose/reference/