Docker - newlife-js/Wiki GitHub Wiki
์ฐธ๊ณ : ๊ทธ๋ฆผ๊ณผ ์ค์ต์ผ๋ก ๋ฐฐ์ฐ๋ ๋์ปค & ์ฟ ๋ฒ๋คํฐ์ค
๋์ปค๋?
๋ฐ์ดํฐ ๋๋ ํ๋ก๊ทธ๋จ์ ๊ฒฉ๋ฆฌ์ํค๋ ๊ธฐ๋ฅ
๊ฐ๋ฐํ๊ฒฝ, ์คํํ๊ฒฝ ๋ฑ ํ๋ก๊ทธ๋จ์ ์คํํ๋ pc/์๋ฒ ํ๊ฒฝ๊ณผ ์ด์ ๋ฐ๋ฅด๋ ๋ฐ์ดํฐ๋ค์ ๊ฒฉ๋ฆฌ
ํ๋ก๊ทธ๋จ๋ณ๋ก ์ฌ์ฉํ๋ ์ํํธ์จ์ด ๋ฒ์ , ์ข
๋ฅ(์น์๋ฒ, DB ๋ฑ), Config๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ ํ ์๋ฒ์์ ๋ชจ๋ ์ปค๋ฒํ๊ธฐ ์ํด,
๊ฐ๋ฐํ ๋ ํต์ผ๋ ๊ฐ๋ฐํ๊ฒฝ์ ์ฌ๋ฟ์ด ๊ณต์ ํ๊ธฐ ์ํด ์ฌ์ฉ
VM vs ๋์ปค
VM์ ํธ์คํธ OS ์์ ๋ณ๋์ OS๋ฅผ ์ค์น
๋์ปค๋ OS(์ปค๋)๋ฅผ ํธ์คํธ์ ๊ณต์
๋์ปค๋ ๋ฌผ๋ฆฌ์ ์๋ฒ - ๋ฆฌ๋
์ค OS - ๋์ปค ์์ง - ์ปจํ
์ด๋s๋ก ๊ตฌ์ฑ
์ถ์ฒ: https://velog.io/@miintto/docker-engine
โป ๋์ปค๋ ๋ฆฌ๋ ์ค ์์์๋ง ๋์๊ฐ๋ฉฐ, ์๋์ฐ์ฉ ๋์ปค๋ linux ๋จธ์ ์์์ ๊ตฌ๋๋๋ ๊ตฌ์กฐ. ์ปจํ ์ด๋๋ค์ ํธ์คํธ OS์ ์ปค๋์ ๊ณต์ ํ๋ฉฐ, OS์ ์ฃผ๋ณ๋ถ๋ง ๊ฐ์ ๊ฐ์ง๊ณ ๋์
์ด๋ฏธ์ง(image)
์ปจํ
์ด๋๋ฅผ ๋ง๋๋ ๋นตํ, ์ค๊ณ๋ ์ญํ
๋์ปค ํ๋ธ(https://hub.docker.com)์์ ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ์ ์ ์๊ณ , ๊ฐ์กฐํ ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฆด ์ ์์
๋น๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ๋ ์ฌ์ฉํ ์ ์์
๋ช ๋ น์ด
docker image ํ์_์ปค๋งจ๋ [์ต์
]
pull ์ด๋ฏธ์ง_์ด๋ฆ: ์ด๋ฏธ์ง ๋ด๋ ค๋ฐ๊ธฐ
rm ์ด๋ฏธ์ง_์ด๋ฆ: ์ด๋ฏธ์ง ์ญ์
ls: ์ด๋ฏธ์ง ๋ชฉ๋ก
build ์ด๋ฏธ์ง_์ด๋ฆ: ์ด๋ฏธ์ง ์์ฑ
์ด๋ฏธ์ง ์์ฑ ๋ฐฉ๋ฒ
- ์ปจํ ์ด๋๋ก ๋ง๋ค๊ธฐ
docker commit ์ปจํ
์ด๋_์ด๋ฆ ์ด๋ฏธ์ง_์ด๋ฆ
- Dockerfile ์คํฌ๋ฆฝํธ๋ก ๋ง๋ค๊ธฐ
์ฌ๋ฃํด๋ ์์ Dockerfile์ด๋ผ๋ ์ด๋ฆ์ ํ์ผ์ด ํ์
์ถ๊ฐ์ ์ผ๋ก ํจ๊ป ๋ฃ๊ณ ์ถ์ ํ์ผ๋ค์ ์ฌ๋ฃํด๋ ์์ ์์น
Dockerfile์์์ ํ์ผ์ ์ด๋์ ๋ฐ์ธ๋ฉ์ํฌ์ง ์ง์ ํจ
docker build -t ์ด๋ฏธ์ง_์ด๋ฆ ์ฌ๋ฃํด๋_๊ฒฝ๋ก
@Dockerfile
FROM ์ด๋ฏธ์ง์ด๋ฆ
COPY ํ์ผ์ด๋ฆ ๋ฐ์ธ๋ฉ_๊ฒฝ๋ก
์ด๋ฏธ์ง ์ ๋ก๋
์ด๋ฏธ์ง๋ฅผ ๋์ปค ๋ ์ง์คํธ๋ฆฌ์ ์ ๋ก๋ํ๊ธฐ ์ํด์๋ ํ๊ทธ๋ฅผ ์์ฑํด์ค์ผ ํจ
docker tag ์ด๋ฏธ์ง_์ด๋ฆ ๋ ์ง์คํธ๋ฆฌ_์ฃผ์/๋ฆฌํฌ์งํ ๋ฆฌ_์ด๋ฆ:๋ฒ์
docker push ๋ ์ง์คํธ๋ฆฌ_์ฃผ์/๋ฆฌํฌ์งํ ๋ฆฌ_์ด๋ฆ:๋ฒ์
์ปจํ ์ด๋(container)
์ด๋ฏธ์ง๋ก ๋ณต์ ํด๋ธ ๊ฒฉ๋ฆฌ๋ ํ๋ก๊ทธ๋จ ํ๊ฒฝ
๋ช ๋ น์ด
docker (container) ํ์_์ปค๋งจ๋ [์ต์
]
run ์ด๋ฏธ์ง_์ด๋ฆ: ์ปจํ
์ด๋๋ฅผ ์์ฑํ์ฌ ์คํ(pull + create + start)
create ์ด๋ฏธ์ง_์ด๋ฆ [--name ์ปจํ
์ด๋_์ด๋ฆ]: ์ด๋ฏธ์ง๋ก ์ปจํ
์ด๋ ์์ฑ
start ID(or ์ปจํ
์ด๋_์ด๋ฆ): ์ปจํ
์ด๋ ์คํ
stop ID(or ์ปจํ
์ด๋_์ด๋ฆ): ์ปจํ
์ด๋ ์ ์ง
rm ID(or ์ปจํ
์ด๋_์ด๋ฆ): ์ ์ง๋ ์ปจํ
์ด๋ ์ญ์
exec ID(or ์ปจํ
์ด๋_์ด๋ฆ) ์ปค๋งจ๋: ์คํ ์ค์ธ ์ปจํ
์ด๋ ์์์ ํ๋ก๊ทธ๋จ ์คํ
ls: ์ปจํ
์ด๋ ๋ชฉ๋ก(container ์๋ต ์ docker ps)
cp ํธ์คํธ_๊ฒฝ๋ก ์ปจํ
์ด๋_์ด๋ฆ:์ปจํ
์ด๋_๊ฒฝ๋ก: ์ปจํ
์ด๋์ ํธ์คํธ ๊ฐ ํ์ผ ๋ณต์ฌ(์์ ๋ฐ๋๋ก ํ๋ฉด ๋ฐ๋๋ก ๋ณต์ฌ)
commit ์ปจํ
์ด๋_์ด๋ฆ ์ด๋ฏธ์ง_์ด๋ฆ: ์ปจํ
์ด๋๋ฅผ ์ด๋ฏธ์ง๋ก ๋ณํ
run ์ต์
--name ์ปจํ
์ด๋_์ด๋ฆ: ์ปจํ
์ด๋ ์ด๋ฆ ์ง์
-p ํธ์คํธ_ํฌํธ๋ฒํธ:์ปจํ
์ด๋_ํฌํธ๋ฒํธ: ํฌํธ๋ฒํธ ์ง์
-v ํธ์คํธ_๊ฒฝ๋ก:์ปจํ
์ด๋_๊ฒฝ๋ก: ๋ณผ๋ฅจ ๋ง์ดํธ
--net=๋คํธ์ํฌ_์ด๋ฆ: ๋คํธ์ํฌ ์ฐ๊ฒฐ
-e ํ๊ฒฝ๋ณ์_์ด๋ฆ=๊ฐ: ํ๊ฒฝ๋ณ์ ์ค์
-d(detach): ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ
-i(interactive) : ์ปจํ
์ด๋์ ํฐ๋ฏธ๋ ์ฐ๊ฒฐ
-t(tty): ํน์ ํค ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก
๋คํธ์ํฌ(network)
์ปจํ ์ด๋ ๊ฐ ์ฐ๊ฒฐ์ ์ํด์๋ ๋คํธ์ํฌ๋ฅผ ๋ง๋ค์ด์ ์ฐ๊ฒฐํด์ค์ผ ํจ
๋ช ๋ น์ด
docker network ํ์_์ปค๋งจ๋ [์ต์
]
create ๋คํธ์ํฌ_์ด๋ฆ: ๋คํธ์ํฌ ์์ฑ
inspect ๋คํธ์ํฌ_์ด๋ฆ: ๋คํธ์ํฌ ์์ธ ์ ๋ณด ํ์ธ
connect ์ปจํ
์ด๋_์ด๋ฆ: ๋คํธ์ํฌ๋ฅผ ์ปจํ
์ด๋์ ์ฐ๊ฒฐ
disconnect ์ปจํ
์ด๋_์ด๋ฆ: ๋คํธ์ํฌ์ ์ปจํ
์ด๋ ์ฐ๊ฒฐ ๋์
ls, prune, rm
โป docker run ์ ์ปจํ ์ด๋์ ์ฐ๊ฒฐ ๋ฐฉ๋ฒ(MySQL ์์)
docker run --name ์ปจํ
์ด๋_์ด๋ฆ -dit --net=๋คํธ์ํฌ_์ด๋ฆ -e MYSQL_ROOT_PASSWORD=MySQL_๋ฃจํธ_ํจ์ค์๋ -e MYSQL_DATABASE=๋ฐ์ดํฐ๋ฒ ์ด์ค_์ด๋ฆ -e MYSQL_USER=MySQL_์ฌ์ฉ์์ด๋ฆ -e MYSQL_PASSWORD=MySQL_ํจ์ค์๋ mysql
๋ณผ๋ฅจ(volume)
์คํ ๋ฆฌ์ง์ ํ ์์ญ์ ๋ถํ ํ ๊ฒ
์ปจํ
์ด๋ ๋ด์ ๋ฐ์ดํฐ๋ ์ปจํ
์ด๋๊ฐ ์ญ์ ๋๋ฉด ์ฌ๋ผ์ง, ์์์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ์ํด์ ๋ณผ๋ฅจ์ ์ฌ์ฉํ ์ ์์
๋ณผ๋ฅจ ๋ง์ดํธ vs ๋ฐ์ธ๋ ๋ง์ดํธ
- ๋ณผ๋ฅจ ๋ง์ดํธ: ๋์ปค ์์ง ์์ ๋ณผ๋ฅจ์ ์์ฑํ์ฌ ์ปจํ
์ด๋์ ์ฐ๊ฒฐ
์ปจํ ์ด๋๋ฅผ ๊ฒฝ์ ํ์ง ์๊ณ ๋ ๋ณผ๋ฅจ์ ์ง์ ์ ๊ทผํ ์ ์์
docker run ~~~ -v ๋ณผ๋ฅจ_์ด๋ฆ:์ปจํ
์ด๋_๋ง์ดํธ_๊ฒฝ๋ก
- ๋ฐ์ธ๋ ๋ง์ดํธ: ํธ์คํธ OS์ ์๋ ๋๋ ํฐ๋ฆฌ์ ์ปจํ
์ด๋๋ฅผ ์ฐ๊ฒฐ
์ปจํ ์ด๋ ๋ฐ์์๋ ์ง์ ์ ๊ทผ ๊ฐ๋ฅ
docker run ~~~ -v ์คํ ๋ฆฌ์ง_์ค์ _๊ฒฝ๋ก:์ปจํ
์ด๋_๋ง์ดํธ_๊ฒฝ๋ก
๋ช ๋ น์ด
docker volume ํ์_๋ช
๋ น์ด [์ต์
]
create, inspect, ls, prune, rm
โป ๋ณผ๋ฅจ ๋ฐฑ์ ๋ฐฉ๋ฒ
docker run --rm -v ๋ณผ๋ฅจ๋ช
:/source -v ๋ฐฑ์
_์ ์ฅ_ํด๋๋ช
:/target busybox(๋ฆฌ๋
์ค os ์ด๋ฏธ์ง) tar cvzf /sake/๋ฐฑ์
ํ์ผ์ด๋ฆ.tar.gz -C /source
๋์ปค ์ปดํฌ์ฆ(compose)
์์คํ
๊ตฌ์ถ๊ณผ ๊ด๋ จ๋ ๋ช
๋ น์ด๋ฅผ ํ๋์ ํ
์คํธ ํ์ผ๋ก ๋ง๋ค์ด, ํ๋ฒ์ ์์คํ
์ ์ฒด๋ฅผ ์คํํ๊ณ ์ข
๋ฃ์ ํ๊ธฐ๊น์ง ํ ์ ์๋ ๋๊ตฌ
๋คํธ์ํฌ์ ๋ณผ๋ฅจ๊น์ง ๋ง๋ค ์ ์์
์ค์น
ํ์ด์ฌ์ผ๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ด๊ธฐ ๋๋ฌธ์ ํ์ด์ฌ ๋ฐํ์์ด ํ์
apt install -y python3 python3-pip
pip install docker-compose
์ฌ์ฉ
์ํ๋ ํด๋์ docker-compose.yml ํ์ผ์ ๋ง๋ค์ด ์ฌ์ฉ(ํด๋ ๋น ํ๋๋ง ๊ฐ๋ฅ)
docker-compose -f compose_ํ์ผ๊ฒฝ๋ก up ์ต์
: ์์ฑ ๋ฐ ์คํ
docker-compose -f compose_ํ์ผ๊ฒฝ๋ก down ์ต์
: ์ข
๋ฃ ๋ฐ ์ญ์
stop, start, ps ๋ฑ๋ฑ
@ docker-compose.yml
version: ๋ฒ์
services: ์ปจํ
์ด๋ ๊ด๋ จ ์ ๋ณด
networks: ๋คํธ์ํฌ ๊ด๋ จ ์ ๋ณด
volumnes: ๋ณผ๋ฅจ ๊ด๋ จ ์ ๋ณด
์์
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
์ฟ ๋ฒ๋คํฐ์ค
์ปจํ
์ด๋ ์ค์ผ์คํธ๋ ์ด์
๋๊ตฌ(์์คํ
์ ์ฒด๋ฅผ ํต๊ดํ๊ณ ์ฌ๋ฌ ๊ฐ์ ์ปจํ
์ด๋๋ฅผ ๊ด๋ฆฌ)
์ฌ๋ฌ ๋์ ๋ฌผ๋ฆฌ์ ์๋ฒ์ ๊ฑธ์ณ ์์คํ
๊ตฌ์ฑ ๊ฐ๋ฅ
YAML ํ์ผ์ ์ ์ํ ๋ฐ๋์งํ ์ํ๋ฅผ ์์ฑํ๊ณ ์ ์งํ๋๋ก ๊ด๋ฆฌ
์ง์ ์ ์ผ๋ก ๋์ปค ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด์ ์ปจํ
์ด๋๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์์ฑํ ์ ์์
ํด๋ฌ์คํฐ ๊ตฌ์กฐ(๋ง์คํฐ ๋
ธ๋ - ์์ปค ๋
ธ๋)
์ถ์ฒ: https://arisu1000.tistory.com/27827
etcd: ๋ฐ์ดํฐ๋ฒ ์ด์ค
์ฉ์ด
- pod: ์ปจํ ์ด๋์ ๋ณผ๋ฅจ์ ํจ๊ป ๋ฌถ์ ๊ฒ(์ปจํ ์ด๋๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ์ ์์)
- service: ์ฌ๋ฌ ๊ฐ์ pod(๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ ๊ตฌ์ฑ์ ๊ฐ๋)์๊ฒ ์์ฒญ์ ๋ฐฐ๋ถ, ๋ก๋ ๋ฐธ๋ฐ์ ์ญํ
์๋์ ์ผ๋ก ๊ณ ์ ๋ IP ์ฃผ์๋ฅผ ๋ถ์ฌ ๋ฐ์(๊ฐ ํ๋์๋ ๋ด๋ถ IP ๋ถ์ฌ) - ReplicaSet: pod์ ์๋ฅผ ๊ด๋ฆฌ
- Replica: ReplicaSet๊ฐ ๊ด๋ฆฌํ๋ ๋์ผํ ๊ตฌ์ฑ์ pod
- Deloyment: pod์ ๋ฐฐํฌ(์์ฑ, ์
๋ฐ์ดํธ, ์ญ์ )๋ฅผ ๊ด๋ฆฌ, yaml ํ์ผ ์ค์ ์ ์ด์ฉํ์ฌ ๊ด๋ฆฌ ์๋ํ
Manifest file
yaml, jsonํ์์ ๋ฆฌ์์ค์ ๋ํ ์ค์ ํ์ผ
๋ณดํต ๋ฆฌ์์ค ๋จ์๋ก ์์ฑํ์ง๋ง ํ ํ์ผ์ ---๋ก ๊ตฌ๋ถํ์ฌ ์์ฑ๋ ๊ฐ๋ฅ
apiVersion: API ๊ทธ๋ฃน ๋ฐ ๋ฒ์
kind: ๋ฆฌ์์ค ์ ํ(pod, service ๋ฑ)
metadata: ๋ฉํ๋ฐ์ดํฐ(์ด๋ฆ, ๋ ์ด๋ธ, ์์ฑ ์๊ฐ ๋ฑ)
spec: ๋ฆฌ์์ค ๋ด์ฉ(์ปจํ
์ด๋ ๊ตฌ์ฑ, ๋ ํ๋ฆฌ์นด ๊ตฌ์ฑ ๋ฑ)
๋ช ๋ น์ด
kubectl ์ปค๋งจ๋ ์ต์
apply -f yml_ํ์ผ๊ฒฝ๋ก: ๋ฆฌ์์ค ๋ณ๊ฒฝ์ฌํญ ๋ฐ์
get ๋ฆฌ์์ค_์ด๋ฆ: ๋ฆฌ์์ค ์ํ ์ถ๋ ฅ
create, delete, scale, logs ๋ฑ