Docker Compose

  • μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆλ₯Ό μΌκ΄„μ μœΌλ‘œ μ •μ˜ν•˜κ³  μ‹€ν–‰ν•  수 μžˆλŠ” 툴
  • ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€λ₯Ό μš΄μ˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ—¬λŸ¬ 개의 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ™μž‘ν•΄μ•Ό 함
  • μ»¨ν…Œμ΄λ„ˆν™” 된 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 듀을 톡합 관리 κ°€λŠ₯

Dockerfile κ³Ό Docker-Compose

  • Dockerfile : μ»¨ν…Œμ΄λ„ˆ 이미지λ₯Ό μƒμ„±ν•˜λ©΄μ„œ νŠΉμ • μž‘μ—…κΉŒμ§€ 같이 μ²˜λ¦¬ν•˜κ²Œ ν•΄μ£ΌλŠ” 도ꡬ
  • Docker-Compose : λ‹€μˆ˜μ˜ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‰½κ²Œ μ‹€ν–‰ν•  수 있게 λ„μ™€μ£ΌλŠ” 도ꡬ

png

μ‹€ν–‰

  • docker composeκ°€ λ‚˜λ₯Ό λŒ€μ‹ ν•΄ μ—¬λŸ¬ μ»¨λ„€μ΄λ„ˆλ“€μ„ μ§€μ •ν•œ λ°©μ‹μœΌλ‘œ μ‹€ν–‰
  • μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•  λ•Œ 좔가적인 λͺ¨λ“  μ˜΅μ…˜λ“€ yaml 파일 ν˜•νƒœλ‘œ λ§Œλ“¬

command 와 비ꡐ

  • command
    $ docker run --name db -v db_data:/var/lib/mysql --restart=always -e MYSQL_ROOT_PASSWORD=somewordpress mysql:5.7
    
  • docker-compose.yml
    db:
      image: mysql5.7
      volumes:
          - db_data:/var/lib/mysql
      restart: always
      environment:
          MYSQL_ROOT_PASSWORD=somewordpress
    

κΈ°λ³Έ 문법

version: "3.9"

services:
	db:
		image: mysql:5.7
		volumes:
			- db_data:/var/lib/mysql
		restart: always
		environment:
			MYSQL_ROOT_PASSWORD: somewordpress
			MYSQL_DATABASE: wordpress
			MYSQL_USER: wordpress
			MYSQL_PASSWORD: wordpress
			
	wordpress:
		depends_on:
			- db
		image: wordpress:latest
		volumes:
			- wordpress_data:/var/www/html
		ports:
			- "8000:80"
		restart: always
		environment:
			WORDPRESS_DB_HOST: db:3306
			WORDPRESS_DB_USER: wordpress
			WORDPRESS_DB_PASSWORD: wordpress
			WORDPRESS_DB_NAME: wordpress
volumes:
	db_data: {}
	wordpress_data: {}

좜처: https://docs.docker.com/samples/wordpress/

  • Docker Composeλ₯Ό μ‚¬μš©ν•˜μ—¬ Docker μ»¨ν…Œμ΄λ„ˆλ‘œ κ΅¬μΆ•λœ 격리된 ν™˜κ²½μ—μ„œ WordPress μ‹€ν–‰ν•˜λŠ” docker-compose.yml

1) image

  • μ‹€ν–‰ν•  이미지 지정

2) command

  • μ»¨ν…Œμ΄λ„ˆμ—μ„œ 싀행될 λͺ…λ Ήμ–΄ 지정
  • ex
app:
	image: node:12-alpine
	command: sh -c "yarn install && yarn run dev"
  • λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆμ™€ 연계할 λ•Œ 연계할 μ»¨ν…Œμ΄λ„ˆ 지정
webserver: 
	image: wordpress:latest
	link:
		db:mysql

4) ports

  • μ»¨ν…Œμ΄λ„ˆκ°€ 외뢀에 κ³΅κ°œν•˜λŠ” 포트 지정
  • β€œν˜ΈμŠ€νŠΈλ¨Έμ‹ μ˜ 포트번호:μ»¨ν…Œμ΄λ„ˆμ˜ ν¬νŠΈλ²ˆν˜Έβ€λ₯Ό μ§€μ •ν•˜κ±°λ‚˜ μ»¨ν…Œμ΄λ„ˆμ˜ 포트번호만 지정
  • μ»¨ν…Œμ΄λ„ˆμ˜ 포트번호만 μ§€μ •ν•œ 경우 호슀트 λ¨Έμ‹ μ˜ ν¬νŠΈλŠ” λžœλ€ν•œ κ°’μœΌλ‘œ μ„€μ • 됨
ports:
	- "80"
	- "8443:443"

5) expose

  • 링크 κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ μ—°κ²°ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆμ—κ²Œλ§Œ 포트λ₯Ό κ³΅κ°œν•  λ•Œ expose 지정
  • 호슀트 λ¨Έμ‹ μ—μ„œ 직접 μ•‘μ„ΈμŠ€ ν•˜μ§€ μ•Šκ³  μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„ κΈ°λŠ₯을 κ°–κ³  μžˆλŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό κ²½μœ ν•΄μ„œλ§Œ μ•‘μ„ΈμŠ€ ν•˜κ³  싢은 경우 등에 μ‚¬μš©
expose:
	- "3000"
	- "8000"

6) depends_on

  • μ—¬λŸ¬ μ„œλΉ„μŠ€μ˜ μ˜μ‘΄κ΄€κ³„ μ •μ˜
  • Webserver μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ μ „ db μ»¨ν…Œμ΄λ„ˆμ™€ redis μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹œμž‘ν•˜κ³  싢을 λ•Œ μ•„λž˜μ™€ 같이 μ •μ˜
services: 
	webserver:
		build:
		depends_on:
			- db
			- redis
	redis:
		image: redis
	db:
		image: postgres
  • 주의 : μ»¨ν…Œμ΄λ„ˆμ˜ μ‹œμž‘ μˆœμ„œλ§Œ μ œμ–΄ν•  뿐 μ»¨ν…Œμ΄λ„ˆ μƒμ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 이용 κ°€λŠ₯ν•΄ 질 λ•ŒκΉŒμ§€ 기닀리고 μ œμ–΄ν•˜μ§€λŠ” μ•ŠμŒ

7) volumes

  • μ»¨ν…Œμ΄λ„ˆμ— λ³Όλ₯¨μ„ 마운트
services:
	db:
		image: mysql:5.7
		volumes: 
			- db_data:/var/lib/mysql
volumes:
	db_data: {}

8) environment

  • μ»¨ν…Œμ΄λ„ˆμ— μ μš©ν•  ν™˜κ²½λ³€μˆ˜ μ •μ˜
database:
	image: mysql:5.7
	environment:
		MYSQL_ROOT_PASSWORD: pass

9) restart

  • μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ  λ•Œ μ μš©ν•  restart μ •μ±…
  • no: μž¬μ‹œμž‘ λ˜μ§€ μ•ŠμŒ
  • always: μ»¨ν…Œμ΄λ„ˆλ₯Ό μˆ˜λ™μœΌλ‘œ 끄기 μ „κΉŒμ§€ 항상 μž¬μ‹œμž‘
  • On-failure: 였λ₯˜κ°€ μžˆμ„ μ‹œμ— μž¬μ‹œμž‘
database:
	image: mysql:5.7
	restart: always

docker compose둜 μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰

  1. μ„œλΉ„μŠ€ 디렉토리 생성
  2. docker-compose.yml 생성
  3. docker-compose λͺ…λ Ήμ–΄

docker-compose λͺ…λ Ήμ–΄

1) up

  • μ»¨ν…Œμ΄λ„ˆ 생성 / μ‹œμž‘

  • docker-compose.yml 을 κΈ°μ€€μœΌλ‘œ μ‹€ν–‰μ‹œμΌœ 쀘
  • -d : detachλͺ¨λ“œ (background λͺ¨λ“œ) 둜
  • λ‹€λ₯Έ μ˜΅μ…˜ 없을 경우 ν˜„μž¬ μžˆλŠ” 디렉토리에 μžˆλŠ” yml 파일 κΈ°μ€€μœΌλ‘œ μ‹€ν–‰
$ docker-compose up -d
$ docker-compose -f /other-dir/docker-compose.yml

2) ps

  • μ»¨ν…Œμ΄λ„ˆ λͺ©λ‘ ν‘œμ‹œ

  • ν˜„μž¬ docker-compose μ—μ„œ λ™μž‘λ˜κ³  μžˆλŠ” μ»¨ν…Œμ΄λ„ˆ μƒνƒœμ •λ³΄λ₯Ό λ³΄μ—¬μ€˜
  • ν˜„μž¬ λ””λ ‰ν† λ¦¬μ—μ„œ λ™μž‘ 쀑인 μ»¨ν…Œμ΄λ„ˆλ§Œ 확인 κ°€λŠ₯
$ docker-compose ps

3) scale

  • νŠΉμ • μ»¨ν…Œμ΄λ„ˆμ˜ 개수 쑰절
  • mysql μ»¨ν…Œμ΄λ„ˆ 2개
$ docker-compose scale mysql=2

4) down

  • ν˜„μž¬ λ””λ ‰ν† λ¦¬μ—μ„œ λ™μž‘ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆ μ’…λ£Œ
$ docker-compose down

5) rm

  • μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ

6) config

  • λ‚΄κ°€ λ§Œλ“  docker-compose.yml νŒŒμΌμ— 였λ₯˜μ—†λ‚˜ 확인
$ docker-compose config

7) logs

  • μ»¨ν…Œμ΄λ„ˆ 둜그 좜λ ₯
$ docker-compose logs webserver

λΉŒλ“œμ—μ„œ μš΄μ˜κΉŒμ§€

  1. μ„œλΉ„μŠ€ 디렉토리 생성
  2. λΉŒλ“œλ₯Ό μœ„ν•œ dockerfile 생성
  3. Docker-compose.yml 생성
  4. docker-compose λͺ…λ Ήμ–΄κ°€ μ‹€ν–‰

​ -> docker-compose λͺ…λ Ήμ–΄κ°€ 싀행될 λ•Œ docker-compose.yml 에 μžˆλŠ” μ»¨ν…Œμ΄λ„ˆκ°€ dockerfile에 μ˜ν•΄ build