7์ฅ ๋์ปค ์ปดํฌ์ฆ๋ก ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์คํํ๊ธฐ
7.1 ๋์ปค ์ปดํฌ์ฆ ํ์ผ์ ๊ตฌ์กฐ
- ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ์ค์ผ๋ก ๋ณด๋ฉด Dockerfile ์คํฌ๋ฆฝํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ๋ถ๋ถ์ ํจํค์งํ๋ ์๋จ์ด๋ค.
- ์ฆ, ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ Dokerfile ์ ํจํค์งํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด์๋ Docker Compose ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- Docker Compose ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ์คํ ์ค์ผ ๋ ์ด๋ค ์ํ๊ฐ ๋์ด์ผ ํ๋์ง๋ฅผ ๊ธฐ์ ํ๋ ํ์ผ์ด๋ค.
- ๋์ปค ์ปดํฌ์ฆ๋ ์ฌ๋๋ ์ฝ๊ฒ ์ฝ๊ณ ์ดํดํ ์ ์์ผ๋ฉฐ, YAML ๋ฌธ๋ฒ์ผ๋ก ๊ธฐ์ ํ๋ค.
Docker Compose ์์
version : '3.7'
services:
todo-web:
image: diamol/ch06-todo-list
ports:
- "8020:80"
networks:
- app-net
networks:
app-net:
external:
name: nat
- version
- ๋์ปค ์ปดํฌ์ฆ ํ์ผ์ ๋ฒ์ .
- ๋ฒ์ ์ ๋ช ์ํ์ง ์์ ๊ฒฝ์ฐ 1๋ก ๊ฐ์ค๋๋ฉฐ, ๋ฒ์ ์ ๊ผญ ๋ช ์ํ๋๊ฒ์ด ์ข๋ค.
- services
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๋ ๋ถ๋ถ
- ๋์ปค ์ปดํฌ์ฆ์์๋ ์๋น์ค๋ผ๋ ์ถ์์ ์ธ ๊ฐ๋ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ด๋ฆฌํ๋ค.
- ํ๋์ ์๋น์ค๋ ์ฌ๋ฌ ๊ฐ์ ์ปจํ ์ด๋๋ก ๊ตฌ์ฑ๋ ์ ์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ํ๋์ ์๋น์ค๋ ํ๋์ ์ปจํ ์ด๋๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
- networks
- ์๋น์ค ์ปจํ ์ด๋๊ฐ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋์ปค ๋คํธ์ํฌ๋ฅผ ์ ์ํ๋ ๋ถ๋ถ
$ docker network create nat
$ docker-compose up
๋์ปค ์ปดํฌ์ฆ ํ์ผ์ ์ฅ์
- Dockerfile ์คํฌ๋ฆฝํธ์ ํจ๊ป ํ์ ๊ด๋ฆฌ ๋๊ตฌ๋ก ๊ด๋ฆฌ๋๋ค.
- ๋์ปค ์ปดํฌ์ฆ ํ์ผ์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์คํ ์ต์ ์ด ๊ธฐ์ ๋๋ค.
- ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ค์ ํ๋ฒ์ ๊ด๋ฆฌํ ์ ์๋ค.
7.2 ๋์ปค ์ปดํฌ์ฆ๋ฅผ ์ฌ์ฉํด ์ฌ๋ฌ ์ปจํ ์ด๋๋ก ๊ตฌ์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํํ๊ธฐ
version: '3.7'
services:
accesslog:
image: diamol/ch04-access-log
networks:
- app-net
iotd:
image: diamol/ch04-image-of-the-day
ports:
- "80"
networks:
- app-net
image-gallery:
image: diamol/ch04-image-gallery
ports:
- "8010:80"
depends_on:
- accesslog
- iotd
networks:
- app-net
networks:
app-net:
external:
name: nat
$ docker-compose up --detach
Creating image-of-the-day_iotd_1 ... done
Creating image-of-the-day_accesslog_1 ... done
Creating image-of-the-day_image-gallery_1 ... done
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39ef61eae5c6 diamol/ch04-image-gallery "/web/server" 5 seconds ago Up 4 seconds 0.0.0.0:8010->80/tcp, [::]:8010->80/tcp image-of-the-day_image-gallery_1
544f2593c12c diamol/ch04-access-log "docker-entrypoint.s…" 5 seconds ago Up 5 seconds 80/tcp image-of-the-day_accesslog_1
05641c97548c diamol/ch04-image-of-the-day "java -jar /app/iotd…" 5 seconds ago Up 5 seconds 0.0.0.0:32769->80/tcp, [::]:32769->80/tcp image-of-the-day_iotd_1
- docker-compose up ๋ช ๋ น์ด๋ฅผ ํตํด docker-compose.yml ํ์ผ์ ์คํ์์ผ, ์ ์๋ ๋ด์ฉ๋๋ก ์ปจํ ์ด๋๋ฅผ ์์ฑํ๋ค.
$ docker-compose up -d --scale iotd=3
image-of-the-day_accesslog_1 is up-to-date
Creating image-of-the-day_iotd_2 ... done
Creating image-of-the-day_iotd_3 ... done
image-of-the-day_image-gallery_1 is up-to-date
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ff8efd0c8531 diamol/ch04-image-of-the-day "java -jar /app/iotd…" 5 seconds ago Up 4 seconds 0.0.0.0:32771->80/tcp, [::]:32771->80/tcp image-of-the-day_iotd_3
b85299ef4a19 diamol/ch04-image-of-the-day "java -jar /app/iotd…" 5 seconds ago Up 4 seconds 0.0.0.0:32770->80/tcp, [::]:32770->80/tcp image-of-the-day_iotd_2
39ef61eae5c6 diamol/ch04-image-gallery "/web/server" 41 seconds ago Up 40 seconds 0.0.0.0:8010->80/tcp, [::]:8010->80/tcp image-of-the-day_image-gallery_1
544f2593c12c diamol/ch04-access-log "docker-entrypoint.s…" 41 seconds ago Up 40 seconds 80/tcp image-of-the-day_accesslog_1
05641c97548c diamol/ch04-image-of-the-day "java -jar /app/iotd…" 41 seconds ago Up 40 seconds 0.0.0.0:32769->80/tcp, [::]:32769->80/tcp image-of-the-day_iotd_1
- docker-compose ๋ก ์์ฑ๋ ์ปจํ ์ด๋๋ ๋๊ฐ์ ๋์ปค ์ปจ๋ค์ด๋๋ค.
- ๋ฐ๋ผ์, Docker API ๋ฅผ ํตํด ์์ ๊ฐ์ด ์กฐ์์ด ๊ฐ๋ฅํ๋ค.
$ docker-compose stop
Stopping image-of-the-day_iotd_3 ... done
Stopping image-of-the-day_iotd_2 ... done
Stopping image-of-the-day_image-gallery_1 ... done
Stopping image-of-the-day_accesslog_1 ... done
Stopping image-of-the-day_iotd_1 ... done
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ff8efd0c8531 diamol/ch04-image-of-the-day "java -jar /app/iotd…" 5 minutes ago Exited (143) 13 seconds ago image-of-the-day_iotd_3
b85299ef4a19 diamol/ch04-image-of-the-day "java -jar /app/iotd…" 5 minutes ago Exited (143) 13 seconds ago image-of-the-day_iotd_2
39ef61eae5c6 diamol/ch04-image-gallery "/web/server" 6 minutes ago Exited (2) 13 seconds ago image-of-the-day_image-gallery_1
544f2593c12c diamol/ch04-access-log "docker-entrypoint.s…" 6 minutes ago Exited (137) 3 seconds ago image-of-the-day_accesslog_1
05641c97548c diamol/ch04-image-of-the-day "java -jar /app/iotd…" 6 minutes ago Exited (143) 13 seconds ago image-of-the-day_iotd_1
- docker-compose stop ๋ช ๋ น์ด๋ฅผ ํตํด ์ปจํ ์ด๋๋ฅผ ํ๋ฒ์ ์ข ๋ฃํ๋ค.
- ๊ทธ๋ฌ๋, ์ปจํ ๋๊ฐ ์ญ์ ๋์ง๋ ์๋๋ค.
- cpu๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ์ง ์์ง๋ง ํ์ผ ์์คํ ๊ทธ๋๋ก ์ ์ง๋๋ฉฐ, ๋ค์ ์์ํ๋ฉด ๊ธฐ์กด ์ปจํ ์ด๋๋ก ์คํ๋๋ค.
$ docker-compose down
Removing image-of-the-day_iotd_3 ... done
Removing image-of-the-day_iotd_2 ... done
Removing image-of-the-day_image-gallery_1 ... done
Removing image-of-the-day_accesslog_1 ... done
Removing image-of-the-day_iotd_1 ... done
Network nat is external, skipping
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- docker-compose down ๋ช ๋ น์ด๋ฅผ ์คํ ์ ์ปจํ ์ด๋ ์ข ๋ฃ ๋ฐ ์ญ์ ๊ฐ ์ด๋ค์ง๋ค.
- ๋ํ, external ์ปค๋งจ๋๊ฐ ์์๊ฒฝ์ฐ ๋คํธ์ํฌ์ ๋ณผ๋ฅจ๋ ํจ๊ป ์ญ์ ๋๋ค.
๋์ปค ์ปดํฌ์ฆ๋ ํด๋ผ์ธํธ ์ธก์์ ๋์ํ๋ ๋๊ตฌ์ด๋ค.
docker-compose ๋ช ๋ น์ docker-compose.yml ํ์ผ์ ๋ด์ฉ์ ๋ฐ๋ผ Docker API ๊ฐ ํธ์ถ๋๋ค.
๋ฐ๋ผ์, ๋์ปค ์์ง์ ๋ช ๋ น์ ์คํ๋ง ํ ๋ฟ, depends-on ๊ณผ ๊ฐ์ ์ปจํ ์ด๋์ ์์กด์ฑ์ ์ค๋ก์ง docker-compose.yml ํ์ผ์ ๊ธฐ์ ๋ ๋ด์ฉ์ ์์กดํ๋ค.
7.3 ๋์ปค ์ปจํ ์ด๋ ๊ฐ์ ํต์
์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ ๊ธฐ๋ฅ
์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ๋? ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ์ฌ๋ฌ ์๋น์ค๋ค์ด ์๋ก์ ์์น(IP, ํฌํธ ๋ฑ)๋ฅผ ๋์ ์ผ๋ก ์ฐพ์ ์ฐ๊ฒฐํ๋ ๋ฉ์ปค๋์ฆ์ด๋ค.
์๋น์ค ๋ฑ๋ก, ์กฐํ, ์ ๋ฐ์ดํธ ๋ฑ์ ๊ธฐ๋ฅ์ ํตํด ์๋น์ค ๊ฐ์ ์ฐ๊ฒฐ์ฑ์ ์ ์งํ๊ณ ๊ด๋ฆฌํ๋ค.
์์คํ ์ ํ์ฅ์ฑ๊ณผ ๊ฐ์ฉ์ฑ์ ๋์ด๋ ๋ฐ ์ค์ํ๋ค.
- ์ปจํ ์ด๋๋ ๋์ปค ์์ง์ผ๋ก๋ถํฐ ๋ถ์ฌ๋ฐ์ ์์ ๋ง์ ๊ฐ์ IP ์ฃผ์๋ฅผ ๊ฐ์ง๋ค.
- ๊ทธ๋ฌ๋, ์ปจํ ์ด๋๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ด๋ถ ๊ฐ์ IP ๋ํ ๋ณ๊ฒฝ๋๋ค.
- ์ด๋, ๋ด๋ถ ์ปจํ ์ด๋ ๋ผ๋ฆฌ ํต์ ์ ์ํด ๋์ปค๋ DNS ์๋น์ค๊ฐ ๋ด์ฅ๋์ด ์๋ค.
- ์ปจํ ์ด๋์์ ์คํ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ค๋ฅธ ๊ตฌ์ฑ ์์์ ์ ๊ทผํ๊ธฐ ์ํด ์ด DNS ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ค.
- ์ปจํ ์ด๋ ์ด๋ฆ์ ๋๋ฉ์ธ ์ผ์ ์ปจํ ์ด๋์ IP ์ฃผ์๋ฅผ ์ฐพ์ ์ค๋ค.
- ๋ง์ฝ ๋๋ฉ์ธ์ด ๊ฐ๋ฅดํค๋ ๋์์ด ์ปจํ ์ด๋๊ฐ ์๋๋ผ๋ฉด, ํธ์คํธ ์ปดํจํฐ๊ฐ ์ํ ๋คํธ์ํฌ๋ ์ธํฐ๋ท์ IP ์ฃผ์๋ฅผ ์กฐํํ๋ค.
$ docker exec -it 17775e3af908 sh
$ nslookup accesslog
nslookup: can't resolve '(null)': Name does not resolve
Name: accesslog
Address 1: 172.18.0.2 image-of-the-day-accesslog-1.nat
๋ก๋ ๋ฐธ๋ฐ์ฑ
๋ก๋ ๋ฐธ๋ฐ์ฑ์ด๋? ์ฌ๋ฌ ์๋ฒ์ ๋ค์ด์ค๋ ํธ๋ํฝ์ ๋ถ์ฐ์์ผ ํน์ ์๋ฒ์ ๋ถํ๋ฅผ ์ค์ด๊ณ ์์คํ ์ ์ฒด์ ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ๋์ด๋ ๊ธฐ์
๋ค์ด์ค๋ ์์ฒญ์ ์ฌ๋ฌ ์๋ฒ์ ๊ณ ๋ฅด๊ฒ ๋ถ๋ฐฐ
- ๋์ปค์ ๊ฒฝ์ฐ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ง์ํ๋ค.
- ํน์ ์ปจํ ์ด๋๊ฐ ์ค์ผ์ผ ์์๋์ด ์์๊ฒฝ์ฐ, ํธ๋ํฝ ๋ถ์ฐ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
$ docker exec -it image-of-the-day-image-gallery-1 sh
/web $ nslookup iotd
nslookup: can't resolve '(null)': Name does not resolve
Name: iotd
Address 1: 172.18.0.6 image-of-the-day-iotd-3.nat
Address 2: 172.18.0.5 image-of-the-day-iotd-2.nat
Address 3: 172.18.0.3 image-of-the-day-iotd-1.nat
7.4 ๋์ปค ์ปดํฌ์ฆ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ค์ ๊ฐ ์ง์ ํ๊ธฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด์ฉํ ์น์๋น์ค ์คํํ๊ธฐ
version: "3.7"
services:
todo-db:
image: diamol/postgres:11.5
ports:
- "5433:5432"
networks:
- app-net
todo-web:
image: diamol/ch06-todo-list
ports:
- "8020:80"
environment:
- Database:Provider=postgres
depends_on:
- todo-db
networks:
- app-net
secrets:
- source: postgres-connection
target: /app/config/secrets.json
networks:
app-net:
external:
name: nat
secrets:
postgres-connection:
file: ./config/secrets.json
environment
- ์ปจํ ์ด๋ ์์์ ์ฌ์ฉํ ํ๊ฒฝ ๋ณ์ ๊ฐ ์ ์
secrets
- ์คํ ์ ์ปจํ ์ด๋ ๋ด๋ถ์ ํ์ผ์ ๊ธฐ๋ก๋ ๋น๋ฐ๊ฐ ์ ์
- ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ ์ปจํ ์ด๋์ /app/config/secrets.json ํ์ผ ์์ฑ
- ์ ํ์ผ์๋ postgres-connection ์ด๋ฆ์ ๋น๋ฐํค๊ฐ ์ ์ฅ
secrets
- Docker Secrets๋ ์ปจํ ์ด๋ ํ๊ฒฝ์์ ์ํธํ๋ ๋น๋ฐ ์ ๋ณด(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋น๋ฐ๋ฒํธ, API ํค, ์ธ์ฆ ํ ํฐ ๋ฑ)๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ๊ณ , ํ์ํ ์ปจํ ์ด๋์๋ง ์ ๊ณตํ๋ ๊ธฐ๋ฅ
- ๋ง์ฝ, ๋จ์ผ ๋น๋ฐ๊ฐ์ ๋ณด๊ดํ ํด๋ฌ์คํฐ๊ฐ ์์ ๊ฒฝ์ฐ ํด๋น ๊ธฐ๋ฅ์ ์ด์ฉํด๋ ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ค์ ๊ฐ์ ์ปดํฌ์ฆ ํ์ผ์ ์ค์ ํ์ ๋ ์ด์
- ๊ฐ์ ์ด๋ฏธ์ง์ ๋ค์ํ ํ์ฉ.
- ๊ฐ ํ๊ฒฝ์ ๋ํ ๋ช ์์ ์ค์ .
- ํ๊ฒฝ(๊ฐ๋ฐ, ์ด์, ํ ์คํธ) ์ ๋ํ ์ปดํฌ์ฆ ํ์ผ ๋ถ๋ฆฌ๋ฅผ ํตํ ํ๊ฒฝ ๊ตฌ๋ถ ๊ฐ๋ฅ
7.5 ๋์ปค ์ปดํฌ์ฆ๋ ๋ง๋ฅ์ ์๋๋ค
๋์ปค ์ปดํฌ์ฆ์ ์ฅ์ - ๋ฌธ์ํ
- ๋์ปค ์ปดํฌ์ฆ๋ ๋ณต์กํ ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ์งง๊ณ ๋ช ๋ฃํ ํฌ๋งท์ ํ์ผ๋ก ๋ํ๋ผ ์ ์๋ค.
- ์์ ๋ฐฐํฌ ๊ณผ์ ์ ์๋ ๋ฌธ์์ ๋นํด ์ปดํฌ์ฆ ํ์ผ์ ํจ์ฌ ๊ฐ๋จํ๊ณ ๊ทธ ์์ฒด๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ๊ณผ์ ์ด๋ฏ๋ก ๋ฌธ์ํ์ ๋น์ฉ์ ์ค์ผ ์ ์๋ค.
๋์ปค ์ปดํฌ์ฆ์ ๋์
- docker-compose up ๋ช ๋ น์ ์คํํ๋ฉด ์ ์ํ ์ํ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ ํ ์ ์๋ค.
- ๋จ์ผ ์ปดํจํฐ์ ์ ์๋๋ก ๋์ผํ ํ๊ฒฝ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ์ํฌ ์ ์๋ค๋ ๊ฒ์ด ํฐ ์ฅ์ ์ด๋ค.
๋์ปค ์ปดํผ์ฆ๋ ์์ ํ ์ปจํ ์ด๋ ํ๋ซํผ์ด ์๋๋ค.
- ๋์ปค ์ค์์ด๋ ์ฟ ๋ฒ๋คํฐ์ค ๊ฐ์ ์์ ํ ์ปจํ ์ด๋ ํ๋ซํผ์ด ์๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ง์์ ์ผ๋ก ์ํ๋ฅผ ์ ์งํ๋๋ก ํ๋ ๊ธฐ๋ฅ์ด ์๋ค.
- ์ผ๋ถ ์ปจํ ์ด๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด, docker compose up ๋ช ๋ น์ ๋ค์ ์คํํ์ง ์๋ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ์๋๋ก ๋๋๋ฆด ์ ์๋ค.
7.6 ์ฐ์ต๋ฌธ์
- ํธ์คํธ ์ปดํจํฐ๊ฐ ์ฌ๋ถํ ๋๊ฑฐ๋ ๋์ปค ์์ง์ด ์ฌ์์๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋๋ ์ฌ์์๋๋๋ก ํ๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปจํ ์ด๋๋ ๋ฐ์ธ๋ ๋ง์ดํธ์ ํ์ผ์ ์ ์ฅํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์์ํ๋๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ ์ ์๋๋ก ํ๋ค.
- ํ ์คํธ๋ฅผ ์ํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ 80๋ฒ ํฌํธ๋ฅผ ์ฃผ์ํ๋๋ก ํ๋ค.
version: "3.7"
services:
todo-db:
image: diamol/postgres:11.5
restart: unless-stopped
environment:
- PGDATA=/var/lib/postgresql/data
volumes:
- type: bind
source: /data/postgres
target: /var/lib/postgresql/data
networks:
- app-net
todo-web:
image: diamol/ch06-todo-list
restart: unless-stopped
ports:
- "8050:80"
environment:
- Database:Provider=Postgres
depends_on:
- todo-db
secrets:
- source: postgres-connection
target: /app/config/secrets.json
secrets:
postgres-connection:
file: postgres-connection.json
networks:
app-net:
external:
name: nat