
๐ก 12์ฃผ์ฐจ ์ด์ ๋ฆฌ
Linux์ Docker์ ๋ํด์ ์ด๋ก ์ ํ์ ํ๊ณ , ๊ด๋ จ ์ค์ต์ ์งํํด๋ณผ ์ ์์๋ค. ๊ทธ ๋์ ์ด๋ฏธ์ง Build์ ์ฌ์ฉ๋ฐฉ๋ฒ๋ง ์์๋ค๋ฉด, Docker ๋ด๋ถ ๋์ ๋ฐฉ์๊ณผ ๋คํธ์ํฌ ๋ฑ์ ๋ํด์ ์์ธํ๊ฒ ์์๋ณด๋ ๊ธฐํ๋ฅผ ๊ฐ์ ธ์ ์ข์๋ค.
Docker๋ Go ์ธ์ด ๊ธฐ๋ฐ์ ๊ฐ์ํ ํ๋ซํผ์ด๋ค. ๊ธฐ์กด์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ ๊ธฐ์ ๋ค์ ๋ณ๋์ ํ๊ฒฝ ์ค์ ์์ด ์ฌ์ฉ๊ฐ๋ฅํ๊ฒ๋ ํด์ฃผ๊ธฐ ๋๋ฌธ์, ๊ธฐ์กด ๋ฐฉ์๋ณด๋ค ๊ฒฝ๋ํ๋์๊ณ ๋น ๋ฅด๋ค๋ ์ฅ์ ์ด ์๋ค. ๋ฐ๋ผ์ ์ธํ๋ผ ๊ด๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ํ๊ธฐ์ ์ฉ์ดํ๋ฉฐ, ์์ ์ฑ์ด ๋๋ค.
Container๊ฐ ๊ฐ์๋จธ์ ๊ณผ ๋ค๋ฅธ ์ ์ Guest OS๊ฐ ๋ถํ์ํ๊ณ , Host OS๋ฅผ ์๋ก ๊ณต์ ํด์ ์ฌ์ฉํ๋ค๋ ์ ์ด๋ค.
๋ฐ๋ฉด์, Docker๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ๋ฅผ ์ ์งํ์ง ์๋ Stateless ์์ฑ์ ๊ฐ์ง๊ณค ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋ง์ดํธ๋ฅผ ํด๋์ง ์์ผ๋ฉด ์๋ฒ์ ๋ฐ์ดํฐ๊ฐ ์์ค๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ํ, ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฒฝ๋ํ๋์์ง๋ง CPU๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ์ ์ด ์๋ค.
๊ทธ๋ผ์๋ VM์ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ฐ๋ก ๊ตฌ์ฑํด์ฃผ์ง ์์๋ ์์ฝ๊ฒ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ ์์, Docker๋ ์์ฃผ ์ฌ์ฉ๋๊ณ ํ์์ ์ธ ๊ฐ์ ํ๋ซํผ ์ค ํ๋์ด๋ค.
์๋๋ Docker์์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ช ๋ น์ด ๊ตฌ์ฑ์ผ๋ก, Docker ๊ด๋ จ ์ค์ต์ ์ํ ์ ์ธ์๋๋ฉด ์ข๋ค.
# ์คํ ์ค์ธ ์ปจํ
์ด๋ ๋ชฉ๋ก ๋ณด๊ธฐ, -a ๋ถ์ด๋ฉด ๋ชจ๋ ์ปจํ
์ด๋ ์กฐํ ๊ฐ๋ฅ
$docker ps
# ์ปจํ
์ด๋ ์ ๋ณด ๋ณด๊ธฐ
$docker inspect <container_id>
# ์ปจํ
์ด๋ ๋ก๊ทธ ๋ณด๊ธฐ
$docker logs -f <container_id>
# ์ปจํ
์ด๋ ์คํ์ํค๊ธฐ
$docker exec -it <container_id> <cmd>
Container ๋ก ๋ง๋ค์ด์ ๊ฐ๋ฐ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ฃผ๋ก ์ด๋ฏธ์ง๋ฅผ pull ํด์ ๋ง์ด ์ฌ์ฉํ์ง๋ง, ๊ฐ๋ฐํ ์์ค๋ฅผ ์ง์ Docker hub์ ์ฌ๋ฆด ์ ์๋ค.
VSC์์ remote ssh extension ๋ค์ด๋ก๋ ๋ฐ๊ธฐ
remotes ๋ฉ๋ด์์ config ํ์ผ ์์ ํ๊ธฐ (C:/Users/2-34/.ssh/config)
$docker login --u [์ฌ์ฉ์ ์ด๋ฆ]
$docker build --tag [์ฌ์ฉ์ ์ด๋ฆ]/[Container Name]:[Version]
$docker push [์ฌ์ฉ์ ์ด๋ฆ]/[Container Name]:[Version]
Stateless ์์ฑ์ ๊ฐ์ง Docker๋ฅผ ๋ณด์ํด์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง์ดํธ๋ฅผ ์ฌ์ฉํ๋ค. ๋ง์ดํธํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์๋ค.
๋ฐ์ธ๋ ๋ง์ดํธ (Bind Mount)
โ Docker Host ํด๋๋ฅผ ์ปจํ
์ด๋ ๋ด๋ถ๋ก ๋ง์ดํธ
โ Container๊ฐ ์ญ์ ๋์ด๋ host์ ๋ฐ์ดํฐ๊ฐ ๋จ์
๋ณผ๋ฅจ ๋ง์ดํธ (Volume Mount)
โ Docker๊ฐ ์ง์ ๊ด๋ฆฌํ๋ Storage ๋ฐฉ์
โ Container๊ฐ ์ญ์ ๋์ด๋ Volume์ ์ ์ง๋จ
| ํน์ง | Bind Mount | Volume Mount |
|---|---|---|
| ์ ์ | ํธ์คํธ ์์คํ ์ ํ์ผ ์์คํ ๊ฒฝ๋ก๋ฅผ ์ปจํ ์ด๋์ ๋ง์ดํธ | Docker ๊ด๋ฆฌ ํ์ ๋ ๋ฆฝ์ ์ธ ์คํ ๋ฆฌ์ง ์์ญ์ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋์ ๋ง์ดํธ |
| ๋ฐ์ดํฐ ๋๊ธฐํ | ์ค์๊ฐ์ผ๋ก ๋๊ธฐํ๋๋ฉฐ ํธ์คํธ์ ์ปจํ ์ด๋ ๊ฐ ๋ณ๊ฒฝ์ด ์ฆ์ ๋ฐ์, ์ฐ์ ์์๊ฐ host ๋๋ ํ ๋ฆฌ | Docker๊ฐ ๊ด๋ฆฌํ๋ฏ๋ก ํธ์คํธ์ ์ปจํ ์ด๋ ๊ฐ ๋ฐ์ดํฐ ๋๊ธฐํ๋ ๋๋ฆด ์ ์์ |
| ์ฌ์ฉ ์์ | ๊ฐ๋ฐ ์ค ์์ค ์ฝ๋๋ ์ค์ ํ์ผ์ ์ปจํ ์ด๋์์ ์ฌ์ฉ | ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ก๊ทธ ํ์ผ ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ ์ ์ฅ |
| ์ฅ์ | - ์ค์๊ฐ ๋๊ธฐํ ๊ฐ๋ฅ - ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ ์ฉ | - Docker๊ฐ ๊ด๋ฆฌํ์ฌ ์ฝ๊ฒ ๋ฐฑ์ /๋ณต์ ๊ฐ๋ฅ - ํธ์คํธ์ ๋ ๋ฆฝ์ ์ด์ด์ ์ ์ฐํ๊ฒ ๊ด๋ฆฌ ๊ฐ๋ฅ |
| ๋จ์ | - ํธ์คํธ์ ํ์ผ ์์คํ ์ ์์กด์ - ํธ์คํธ ์์คํ ์ ๊ฒฝ๋ก๋ฅผ ์์์ผ ํจ | - ์ปจํ ์ด๋์ ํธ์คํธ ๊ฐ ๋ฐ์ดํฐ ๋๊ธฐํ์ ๋๋ฆผ - ๊ธฐ๋ณธ์ ์ผ๋ก๋ ํธ์คํธ์ ์ง์ ์ ๊ทผํ ์ ์์ |
| ๋ณด์ | ํธ์คํธ ์์คํ ๊ณผ ๋ฐ์ ํ๊ฒ ์ฐ๊ฒฐ๋์ด ์์ด ๋ณด์ ์ํ์ด ์์ ์ ์์ | Docker๊ฐ ๊ด๋ฆฌํ๋ฏ๋ก ์๋์ ์ผ๋ก ๋ณด์์ด ๊ฐํ๋จ |
์ปจํ ์ด๋๊ฐ 2๊ฐ ์ด์์ผ ๋, ๋ฐ์ธ๋ ๋ง์ดํธ๋ฅผ ํ๋ฉด ๋์ผํ๊ฒ ํด๋๋ฅผ ๊ณต์ ํ ์ ์์์ง ํ์ธํด๋ณธ๋ค.
# ์ปจํ
์ด๋ ์์ฑ ๋ฐ ์คํ
$docker run --name mynginx01 -d -p 3001:80 -v $(pwd):/usr/share/nginx/html nginx
$docker run --name mynginx02 -d -p 3002:80 -v $(pwd):/usr/share/nginx/html nginx
# ์ปจํ
์ด๋ bind ๋ง์ดํธ (๊ณต์ ํด๋ ์ง์ )
$docker exec -it 34d8d9ce635b sh -c 'ls /usr/share/nginx/html'
$docker exec -it 233df78330de sh -c 'ls /usr/share/nginx/html'
# bash๋ก ์ ์ํด์ ๊ณต์ ํด๋ ํ์ธ
$docker exec -it 34d8d9ce635b bash
$docker exec -it 233df78330de bash
๊ทธ ๊ฒฐ๊ณผ, ๋์ผํ๊ฒ ํด๋๋ฅผ ๊ณต์ ํ๊ณ ์๋ ๊ฒ์ ํ์ธํ์๋ค. ์ถ๊ฐ๋ก ํ๋์ ์ปจํ ์ด๋๋ฅผ ์ญ์ ํ์ ๊ฒฝ์ฐ์๋ ํด๋น ํด๋๊ฐ ์ฌ์ ํ ๋จ์์์ผ๋ฉฐ, ๊ณต์ ํ ์ ์๋ ๊ฒ์ ํ์ธํ์๋ค.
Docker ์ปจํ ์ด๋๋ฅผ ์ฌ๋ฆด ๋, ์ฃผ๋ก ํธ์คํธ์ ํฌํธ์ ์ปจํ ์ด๋์ ํฌํธ๋ฅผ ํฌํธ ๋ฐ์ธ๋ฉํด์ฃผ์ด ์ฌ์ฉํ๊ฒ ๋๋ค.
$docker run -p 8088:80 nginx
์์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ํธ์คํธ์ 8088 ํฌํธ์ nginx ์ปจํ ์ด๋์ 80 ํฌํธ๋ฅผ ์ฐ๊ฒฐํด์ฃผ์ด์, ํธ์คํธ์์ nginx ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
ํธ์คํธ์ ๋คํธ์ํฌ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๊ฒ ํด์ค ์ ์๋๋ฐ, Docker์ ๋ฐ๋ก ์ด๋ ํ ์ค์ ๋ ํด์ฃผ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก host์ ๊ฐ์ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ bridge๋ก ํธ์คํธ์ ํต์ ํ๊ฒ ๋๋ค. ๋ช
์์ ์ผ๋ก๋ ์๋์ ๊ฐ์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ํธ์คํธ์ ๋ชจ๋ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ค.
$docker run --network host nginx
๋ํ, ์ฌ๋ฌ ๊ฐ์ Container๋ฅผ ์คํํ ๋, ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด์๋ ๊ฐ์ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํด์ผํ๋ค. ์ด๋ ๊ฒ ๋คํธ์ํฌ๋ฅผ ๋ฐ๋ก ์ฌ์ฉํด์ฃผ๊ฒ ๋๋ฉด ์ปจํ ์ด๋ ๊ฐ ํต์ ์ ์ ์ดํ์ฌ ํน์ ์ปจํ ์ด๋๋ผ๋ฆฌ๋ง ์ฐ๊ฒฐํ ์ ์์ด์ ๋ณด์์ฑ์ ๋์ผ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
๋คํธ์ํฌ๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ค ๋๋ ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ค.
# ๋คํธ์ํฌ ๋ง๋ค๊ธฐ
$docker network create mynetwork
# ๋คํธ์ํฌ ํ๊ฒฝ ์ค์ ํ์ธํ๊ธฐ
$docker inspect mynetwork
์๋์ ๊ฐ์ด ifconfig ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ docker network ls ๋ฅผ ์ฌ์ฉํ์ ๋ ์๋ก ์๊ธด ๋คํธ์ํฌ๋ฅผ ํ์ธํ ์ ์๋ค.
๊ฐ์ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ์๋ก Docker Name ์ ๊ณต์ ํ๊ณ ์ํต๊ฐ๋ฅํ ์ํ๊ฐ ๋๋ค.
์๋ฅผ ๋ค์ด, Spring Application์์ DB๋ฅผ ์ฐ๊ฒฐํ ๋ ์๋์ ๊ฐ์ด ip ์ฃผ์๋ ๋๋ฉ์ธ ๋์ , MySQL์ Container Name์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
spring.datasource.url=jdbc:mysql://mysqldb:3306/mydb?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
์ฌ๋ฌ ๊ฐ์ Container๋ฅผ ํ ํ๋ก๊ทธ๋จ์ผ๋ก ๋ฌถ์ด์ ์ฌ์ฉํ ๋, ์ผ์ผ์ด yml ํ์ผ๊ณผ Dockerfile์ ๋ง๋ค์ด์ ๊ด๋ฆฌ๋ฅผ ํด์ผํ๋ค๋ฉด ์ด์ํ๊ธฐ ๊ต์ฅํ ๊น๋ค๋ก์์ง ๊ฒ์ด๋ค. ๋ฐ๋ผ์, ์ฌ๋ฌ ๊ฐ์ Container๋ฅผ ํ ๋ฒ์ ์คํ/์ค์ง/์ญ์ ๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ๊ธฐ์ ์ด ๋ฑ์ฅํ๊ณ , ๊ทธ๊ฒ์ด Docker Compose ์ด๋ค.
Docker Compose ๋ฅผ ์ฌ์ฉํ๋ฉด docker-compose up -d ๋ช
๋ น์ด ํ ๋ฒ์ Container๋ฅผ ์ฌ๋ฌ ๊ฐ ์ฌ๋ฆด ์ ์๊ณ , ๊ฐํธํ๊ฒ ์ดํ๋ฆฌ์ผ์ด์
๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
๊ทธ๋ ๋ค๋ฉด Docker Compose๋ฅผ ์ ํํ๋ฉด ์ข์ ์ ๋ง ์์๊น? Docker Compose๋ฅผ ์ฌ์ฉํ๋ฉด ๊ผญ ์ ์ํด์ health check๋ฅผ ํด์ฃผ๊ณ ์์กด์ฑ ๊ด๊ณ์ ์ ๊ฒฝ์ ์จ์ฃผ์ด์ผ ํ๋ค.
๊ทธ ์ด์ ๋ Spring ์ดํ๋ฆฌ์ผ์ด์ ๊ณผ mySQL์ Docker Compose๋ก ๊ตฌ๋์ํจ๋ค๊ณ ํ ๋, ๋จผ์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๊ณ mySQL์ด ์คํ๋๋ค๋ฉด ๊ตฌ๋ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ Depends on๊ณผ health check๋ฅผ ์ฌ์ฉํด์ DB๊ฐ ์ค๋น๋ ์ดํ์๋ง ์คํ๋๋๋ก ์ค์ ์ ํด๋๋ ๊ฒ์ด ํ์์ ์ด๋ค.
services:
db:
image: mysql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U mysql"]
interval: 10s
retries: 5
app:
depends_on:
db:
condition: service_healthy
๋ํ, ๋ณผ๋ฅจ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋ ์ ์๋๋ก ์ค์ ์ ํด์ฃผ์ด์ผ ํ๋๋ฐ, NFS๋ฅผ ์ฌ์ฉํด๋ ๋๊ณ Volume ๋ง์ดํธ๋ฅผ ์งํํด์ฃผ์ด๋ ์ข๋ค.
services:
db:
image: mysql
volumes:
- db-data:/var/lib/mysql/data
volumes:
db-data:
์์ ๊ฐ์ด ์ค์ ํด์ฃผ์ด์ผ db-data๋ผ๋ ๋ณผ๋ฅจ์ด ์ ์ง๋๋ฉด์ ๋ฐ์ดํฐ์ ์์ค์ ๋ฐฉ์งํ ์ ์๋ค.