๐ย ๊ณต๋ถ ๋ด์ฉ
Docker Volume
Container์ Host ์์คํ
์ด ํน์ ํด๋๋ฅผ ๊ณต์ ํจ์ผ๋ก์จ, Container๊ฐ ์ฌ๋ผ์ง๋๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํ๋ ๊ธฐ๋ฅ
Container์ ๋ฐ์ดํฐ
- Container๊ฐ ์คํ๋์๋ค๊ฐ ์ค๋จ๋๋ฉด ๋ฐ์ดํฐ๊ฐ ์ ์ค๋จ
- ์ผํ์ฑ์ผ๋ก ๋์ํ๋๊ฒ ์๋๋ผ๋ฉด, ๋ฐ์ดํฐ๊ฐ ์๊ตฌ์ ์ผ๋ก ๋ณด๊ด๋์ด์ผ ํจ
- ex: MySQL ๋ฑ๊ณผ ๊ฐ์ DB๊ฐ container์์ ๋์ํ๋ ๊ฒ
- ๋ฐ์ดํฐ ๋ณด์กด์ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก
Docker Volume
Docker Volume ์ ์
mount in file system
- mount & unmount
- disk๊ฐ์ ๋ฌผ๋ฆฌ์ ์ธ ์ฅ์น๋ฅผ ํ์ผ ์์คํ
์ ํน์ ์์น์ ์ฐ๊ฒฐํด์ฃผ๋ ๊ธฐ๋ฅ
- ex: ์ธ์ฅํ๋๋ฅผ ์ฐ๊ฒฐํ ๊ฒฝ์ฐ
:E
์ฒ๋ผ ์ด ์ฅ์น์ ์ฐ๊ฒฐ๋ ์๋ก์ด ํด๋๊ฐ ์๊น
Docker Volume Type
1. Host Volumes
1
| docker run -v {host_file_system_path}:{container_file_system_path}
|
2. Anonymous Volumes
- ๋์ปค๊ฐ ์์์ ํธ์คํธ ์์คํ
ํด๋๋ฅผ ๋ง๋ค๊ณ ์ฐ๊ฒฐ
1
| docker run -v {container_file_system_path}
|
3. Named Volumes
- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๊ณ ์ ํธ๋๋ ๋ฐฉ์
- ํ๋์ Volume์ ๋ค์์ Container์์ ๊ณต์ ํ๋ ๊ฒ๋ ๊ฐ๋ฅ
- ๋์ปค๊ฐ ๋ง๋ค์ด ๋ง์ดํธํ๋ ํธ์คํธ ์์คํ
ํด๋์
์ด๋ฆ์ ์ง์
ํ ์ ์์
1
2
3
| docker run -v {name}:{container_file_system_path}
# readonly volume ์ค์ ์ต์
, default๋ ์ฝ๊ธฐ&์ฐ๊ธฐ ๊ฐ๋ฅ
docker run -v {name}:{container_file_system_path}:ro
|
Image ์์ฑ ์ Docker Volume์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
1. Dockerfile
- VOLUME command๋ฅผ ์ฌ์ฉํ๋ฉฐ, anonymous volume๋ง ์ง์ ๊ฐ๋ฅ
2. docker-compose
- Host Volume์ด๋ Named Volume์ ์ฌ์ฉ
Docker Volume ์ค์ต
nginx container without volume
1. nginx container๋ฅผ ๋ค์ด๋ฐ๊ณ ์๋ฒ๋ฅผ ์คํ
1
2
3
| # -d ์ต์
์ผ๋ก detachํ์ฌ ์๋ฒ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๊ฒ ํจ
# --p 8081:80 ์ผ๋ก ํฌํธํฌ์๋ฉ ํ์ฌ ํธ์คํธ์์ 8081 ํฌํธ๋ก ์ฐ๊ฒฐํ ์ ์๊ฒ ํจ
docker run -d --name=nginx -p 8081:80 nginx
|
- http://localhost:8081/์ ์ฐ๊ฒฐํ ์น ๋ธ๋ผ์ฐ์ ํ๋ฉด
2. ์๋ฒ์ ์ ์ํด์ html ํ์ผ ์์
1
2
3
4
5
6
7
8
9
10
11
12
13
| # exec์ผ๋ก ์คํ์ค์ธ nginx container์ ์ฐ๊ฒฐ
# --user=root -it ์ผ๋ก ์๋ฒ์ root์ ์ ๋ก ์ ์
# sh shell script ์คํ
docker exec --user=root -it nginx sh
# -----------------์๋ฒ ๋ด๋ถ----------------------
apt update
apt install nano
# ๋ด์ฉ์ Welcome to Docker Volume์ผ๋ก ์์
nano /usr/share/nginx/html/index.html
exit
# ----------------------------------------------
|
- ์น ๋ธ๋ผ์ฐ์ ์ฐ๊ฒฐ ํ๋ฉด
3. ์ฌ์คํ ํ ํ์ผ ํ์ธ
1
2
3
4
5
6
7
8
9
10
11
12
13
| # Container ์ฌ์คํ
docker stop nginx
docker run nginx
docker run -d --name=nginx -p 8081:80 nginx
docker exec --user=root -it nginx sh
# -----------------์๋ฒ ๋ด๋ถ----------------------
apt update
apt install nano
# ๋ด์ฉ์ด ์์ ์ ์ผ๋ก ๋์๊ฐ์์ ํ์ธํ ์ ์์
nano /usr/share/nginx/html/index.html
exit
# ----------------------------------------------
|
- ์น ๋ธ๋ผ์ฐ์ ์ฐ๊ฒฐ ํ๋ฉด
nginx container with volume
1. nginx container๋ฅผ ๋ค์ด๋ฐ๊ณ ์๋ฒ๋ฅผ ์คํ(๋ณผ๋ฅจ ์ฌ์ฉ ์ค์ )
1
2
| # -v ์ต์
์ ์ฌ์ฉํด์ Host Volumes ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐ
docker run -d --name nginx_demo -p 8081:80 -v /home/sarah/devcourse/nginx/html:/usr/share/nginx/html nginx
|
- http://localhost:8081/์ ์ฐ๊ฒฐํ ์น ๋ธ๋ผ์ฐ์ ํ๋ฉด
2. html ํ์ผ ์์
- host ์์คํ
์์์ ํ์ผ์ ์ง์ ์์
- ์น ๋ธ๋ผ์ฐ์ ์ฐ๊ฒฐ ํ๋ฉด
3. ์ฌ์คํ ํ ํ์ผ ํ์ธ
- host ์์คํ
์์์ ํ์ผ ํ์ธ
- ์น ๋ธ๋ผ์ฐ์ ์ฐ๊ฒฐ ํ๋ฉด
Docker ํ๊ฒฝ ํด๋ฆฐ์
์ปจํ
์ด๋ ์ค๋จ ํ ์ญ์ -> ์ด๋ฏธ์ง ์ญ์
CLI
- ์ปจํ
์ด๋ ์ญ์
1
2
3
4
| # -f : force, ์คํ์ค์ธ ์ปจํ
์ด๋๋ ๋ฐ๋ก ์ญ์
# ls -a : ์คํ์ค์ด ์๋ ์ปจํ
์ด๋ ๋ชฉ๋ก๋ ๊ฐ์ ธ์ด
# ls -aq : ๋ชจ๋ ์ปจํ
์ด๋์ container id๋ง ๋ฐ์์ด
docker container rm -f $(docker container ls -aq)
|
- ์ด๋ฏธ์ง ์ญ์
1
| docker image rm -f $(docker image ls -q)
|
Docker Desktop
- Troubleshoot > Clean/Purge data ๋ฅผ ํตํด ์ฝ๊ณ ์ง๊ด์ ์ด๊ฒ ์ญ์ ๊ฐ๋ฅ
Docker ์ค์ต : ์ฌ๋ฌ container๋ฅผ ๊ฐ์ง ์ํํธ์จ์ด
์ค๋ช
๋ฐ ๊ตฌ์กฐ
์ฌ๋ฌ Container๋ฅผ ๊ฐ์ง ์ํํธ์จ์ด๋ฅผ Docker์์ ๋น๋ํ๋ค.
Docker์์ ์ ๊ณตํด์ฃผ๋ ์์ ํ๋ก๊ทธ๋จ : example-voting-app
์ค์ต : ์ผ์ผ์ด ๋งค๋ด์ผํ๊ฒ ์คํ
1. Build
1
2
3
4
5
| docker build -t vote ./vote
docker build -t result ./result
docker build -t worker ./worker
docker images
|
2. Run
1
2
3
4
5
| docker run -d --name=redis redis
docker run -d -e POSTGRES_PASSWORD=postgres --name=db postgres
docker run -d --name=vote -p 5001:80 vote
docker run -d --name=result -p 5002:80 result
docker run -d --name=worker worker
|
- ์ด ๊ฒฝ์ฐ ๊ฐ ์ปดํฌํดํธ๋ค ๊ฐ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ๋์ง ์์
3. ๋คํธ์ํฌ ๊ด๋ จ ์ด์ ํ์ธ
- vote์ ๋ก๊ทธ์ธํ์ฌ iputils-ping ์ค์น ํ ping
1
2
3
4
| docker exec --user=root -it vote sh
apt update
apt install iputils-ping
ping redis
|
์ค์ต : ๋คํธ์ํฌ๋ฅผ ๋ง๋ค์ด ์ฐ๊ฒฐํ์ฌ ์คํ
๋คํธ์ํฌ ์ด์ ํด๊ฒฐ ๋ฐฉ๋ฒ
docker network ๊ธฐ๋ฅ ์ฌ์ฉ
- ์ด์ ์๋ docker run - link ์ต์
์ ์ฌ์ฉํ์์
network๋ฅผ ๋ง๋ค๊ณ , ๋ชจ๋ ์ปจํ
์ด๋๋ฅผ ๋คํธ์ํฌ ์์ผ๋ก ์ง์
- ์ฐ๊ฒฐ์ ๋ฐ๋ผ ๋ณ๊ฐ์ ๋คํธ์ํฌ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋๊ฒ๋ ๊ฐ๋ฅ (back-tier, front-tier)
1. Create newtork
- ๋จผ์ ์ด์ ์ ์์ฑํ container๋ค์ ์ญ์ ํ๋ค. ๋น๋ํ ์ด๋ฏธ์ง๋ ์ญ์ ํ์ง ์์๋ ๋จ
1
| docker container rm -f $(docker container ls -aq)
|
- ๋คํธ์ํฌ๋ฅผ ์์ฑํ๋ค.
1
| docker network create mynetwork
|
2. Run in network
- ์์ ์
๋ ฅํ ์ปค๋งจ๋์
--network mynetwork
๋ฅผ ์ถ๊ฐํ์ฌ ์ปจํ
์ด๋๋ฅผ ๋คํธ์ํฌ ์์ ์ง์ ํ๋ค.
1
2
3
4
5
6
| docker run -d --name=redis --network mynetwork redis
# password๋ฅผ Postgres๋ก ์ฃผ์ด์ผ ์๋ก ์ฐ๊ฒฐํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์
docker run -d --name=db -e POSTGRES_PASSWORD=postgres --network mynetwork postgres
docker run -d --name=vote -p 5001:80 --network mynetwork vote
docker run -d --name=result -p 5002:80 --network mynetwork result
docker run -d --name=worker --network mynetwork worker
|
3. ๊ฒฐ๊ณผ ํ๋ฉด
๐ย CHECK
(์ด๋ ต๊ฑฐ๋ ์๋กญ๊ฒ ์๊ฒ ๋ ๊ฒ ๋ฑ ๋ค์ ํ์ธํ ๊ฒ๋ค)
Docker review quiz
Ubuntu 22.04์์ Docker๋ก airflow ์คํํ๋ ๋ฒ
- ๊ฐ์์์ ์๋ ค์ค๋๋ก ์คํํ๋๋ฐ webserver ์ฐ๊ฒฐ์ด ์๋๋ ๋ฌธ์ ๋ฐ์
- ๋ก๊ทธ๋ฅผ ๋ณด๊ณ ๊ฒ์ํด๋ณด๋๊น ๊ถํ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์์ chat gpt์๊ฒ ๋ฌผ์ด๋ด
- airflow ์ค์ ํ๋๋ฐ ์ฐ์ธ docker-compose.yml๋ฅผ ๋ณด๋, user id ์ธํ
์ด airflow id ์ธํ
๊ฐ์ธ 50000:0 ์ธ๊ฑธ ํ์ธ
- ๋ด
ํธ์คํธ์ uid / gid
๋ฅผ ํ์ธํ๋ (id -u, id -g) 1001:1002์์ ์ ์ ์์์ - ๊ทธ๋์ .yml๋ฅผ ์์ ํ๊ณ , chown chmod๋ก host ์์คํ
ํ์ผ ๊ฒฝ๋ก์ ๊ถํ๋ ์คฌ์
1
2
| sudo chown -R 1001:1002 /path/to/your/airflow/directory
sudo chmod -R 775 /path/to/your/airflow/directory
|
- ๋ค์ ๋น๋ํด์ผํ๋ ๊ณ ๋ฏผํ๋๋ฐ ์น ์๋ฒ๊ฐ ์๋ก๊ณ ์นจ ํ๋๋ ์ ์์ด ๋จ!
- docker exec์ผ๋ก ์๋ฒ ์ ์ํด์ uid/gid ํ์ธํ๋๊น 50000:0 ๊ทธ๋๋ก์ธ๊ฑธ ๋ด์ ๊ถํ์ ์ฃผ๋๊ฒ ๋ต์ด์๋๋ฏ
โ ๋๋ ์