[Docker compose] Docker compose

Younghwan Cha·2022년 12월 16일
0

Docker

목록 보기
16/18
post-thumbnail

Docker compose

compose 란, "구성하다" 라는 사전적 의미를 갖고있다.
docker compose 란, 여러 개의 컨테이너를 실행시켜 하나의 apllication 을 구성하는 것을 말한다.

  1. Dockerfile 정의
  2. docker-compose.yml 에서 서비스 정의
commanddescription
docker compose pullservice 에 정의된 image pull
docker compose buildservice 에 정의된 image pull
docker compose up -d --buildmake sure to rebuild all local images
docker compose downmake sure to rebuild all local images
docker compose down --rmi allremove all local images

docker-compose.yml


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/

postgresql

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

profile

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 vs up 뭐가 다를까?

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/

profile
개발 기록

0개의 댓글