๐ณ Docker ๊ธฐ๋ณธ ๋ช ๋ น์ด
๐พ ๋์ปค์์ ์์ฃผ ์ฌ์ฉํ๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
๐ฏ ์ปจํ ์ด๋ ๊ด๋ จ ๋ช ๋ น์ด
Docker CLI ๋๊ตฌ๋ Docker ์ปจํ ์ด๋(container)์ ํจ๊ณผ์ ์ธ ๊ด๋ฆฌ๋ฅผ ์ํด์ ๋ค์ํ ์ปค๋งจ๋(command)๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ปจํ ์ด๋ ์กฐํ
docker ps
ย ์ปค๋งจ๋๋ Docker ์ปจํ
์ด๋๋ฅผ ์กฐํ๋ฅผ ์ํด ์ฌ์ฉ๋๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ ์ค์ธ ์ปจํ
์ด๋ ๋ชฉ๋ก์ด ์ถ๋ ฅ๋ฉ๋๋ค.
# ๊ธฐ๋ณธ ์กฐํ
$ docker ps
# -a ์ต์
# ํ์ฌ ์ค์ง๋์ด ์๋ ์ปจํ
์ด๋๊น์ง ํจ๊ป ์ถ๋ ฅ๋ฉ๋๋ค.
$ docker ps -a
# -s ์ต์
# ๊ฐ ์ปจํ
์ด๋์ ๋์คํฌ ์ฌ์ฉ๋๊น์ง ๋ณผ ์ ์์ต๋๋ค.
$ docker ps -s
# -f ์ต์
# ์กฐํ ๊ฒฐ๊ณผ๋ฅผ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ํํฐ๋งํด์ ๋ณผ ์ ์์ต๋๋ค.
# ์๋ฅผ ๋ค์ด, ํน์ ์ด๋ฏธ์ง๋ก ๋ถํฐ ๋ง๋ค์ด์ง ์ปจํ
์ด์ด๋ง ๋ณด๊ณ ์ถ๋ค๋ฉด ancestor ํํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
$ docker ps -af "ancestor=python:alpine"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1bae952f7a6 python:alpine "python -m http.servโฆ" About an hour ago Exited (137) 3 minutes ago amazing_chatelet
518d8bb6afaf python:alpine "python3" About an hour ago Exited (0) About an hour ago focused_gauss
์ปจํ ์ด๋ ์คํ
docker run
ย ์ปค๋งจ๋๋ ์๋นํ ์ฌ๋ฌ๊ฐ์ง ์ต์
์ ํตํด ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ปจํ
์ด๋๋ฅผ ์คํํ ์ ์๋๋ก ํด์ค๋๋ค.
# ๊ธฐ๋ณธ ์คํ
# $ docker run (<์ต์
>) <์ด๋ฏธ์ง ์๋ณ์> (<๋ช
๋ น์ด>) (<์ธ์>)
$ docker run hello-world
# -d ์ต์
# ์ปจํ
์ด๋๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ
# -d ์ต์
์์ด ์คํํ๋ค๋ฉด, ํด๋น ํฐ๋ฏธ๋์์ Ctrl + C๋ฅผ ๋๋ฌ์ ๋น ์ ธ๋์ค๋ ์๊ฐ ํด๋น ์ปจํ
์ด๋๋ ์ข
๋ฃ๋ ๊ฒ์
๋๋ค.
$ docker run -d python:3.8-alpine python -m http.server
# -it ์ต์
# -i์ -t๋ฅผ ๋์์ ์ฌ์ฉํ ๊ฒ์ผ๋ก ํฐ๋ฏธ๋ ์
๋ ฅ์ ์ํ ์ต์
$ docker run -it python:3.8-alpine
$ docker run -it python:3.8-alpine /bin/sh
# -name ์ต์
# ์ปจํ
์ด๋ ์ด๋ฆ ์ค์
$ docker run -d --name my-server python:3.8-alpine python -m http.server
# -e ์ต์
# ์ปจํ
์ด๋ ๋ด์์ ์ฌ์ฉํ ํ๊ฒฝ๋ณ์ ์ค์
## Docker ์ปจํ
์ด๋์ ํ๊ฒฝ๋ณ์๋ฅผ ์ค์ ํ๊ธฐ ์ํด์๋ -e ์ต์
์ ์ฌ์ฉํฉ๋๋ค.
## ๋ํ, -e ์ต์
์ ์ฌ์ฉํ๋ฉด Dockerfile์ ENV ์ค์ ๋ ๋ฎ์ด์จ์ง๊ฒ ๋ฉ๋๋ค.
$ docker run -e FOO=bar python:3.8-alpine env
# -p ์ต์
# ํธ์คํธ์ ์ปจํ
์ด๋์ ํฌํธ๋ฅผ ์ฐ๊ฒฐ (ํฌ์๋ฉ)
$ docker run -d -p 80:8000 python:3.8-alpine python -m http.server
# -v ์ต์
# ํธ์คํธ์ ์ปจํ
์ด๋์ ๋๋ ํ ๋ฆฌ๋ฅผ ์ฐ๊ฒฐ (๋ง์ดํธ)
$ echo Hi > test.txt
$ docker run -v `pwd`:/etc python:3.8-alpine cat /etc/test.txt
Hi
# -rm ์ต์
# ์ปจํ
์ด๋๊ฐ ์ข
๋ฃ๋ ๋ ์ปจํ
์ด๋์ ๊ด๋ จ๋ ๋ฆฌ์์ค(ํ์ผ ์์คํ
, ๋ณผ๋ฅจ)๊น์ง ๊นจ๋์ด ์ ๊ฑฐํด์ค๋๋ค.
$ docker run --rm -it ubuntu:16.04 /bin/bash
์ปจํ ์ด๋ ์ค์ง
์คํ ์ค์ธ Docker ์ปจํ
์ด๋๋ฅผ ์ค์งํ๋ ค๋ฉดย docker stop
ย ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ค์งํ๊ณ ์ถ์ ์ปจํ
์ด๋์ ์์ด๋๋ ์ด๋ฆ์ ์ธ์๋ก ๋๊น๋๋ค.
# ์์ด๋๋ ์ด๋ฆ์ ์ธ์๋ก ์ปจํ
์ด๋ ์ค์ง
$ docker stop container_name
container_name
# ์กฐํ
$ docker ps -af "name=container_name"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1bae952f7a6 python:alpine "python -m http.servโฆ" About an hour ago Exited (137) 32 seconds ago container_name
# ์ปจํ
์ด๋ ์ ์ฒด ์ค์ง
$ docker stop $(docker ps -a -q)
์ปจํ ์ด๋ ์์
์ค์ง๋ Docker ์ปจํ
์ด๋๋ฅผ ๋ค์ ์์ํ๋ ค๋ฉดย docker start
ย ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์์ํ๊ณ ์ถ์ ์ปจํ
์ด๋์ ์์ด๋๋ ์ด๋ฆ์ ์ธ์๋ก ๋๊ธฐ๋ฉด ๋ฉ๋๋ค.
# ์์ด๋๋ ์ด๋ฆ์ ์ธ์๋ก ์ปจํ
์ด๋ ์์
$ docker start b1bae952f7m1
b1bae952f7m1
$ docker ps -af "id=b1bae952f7m1"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1bae952f7m1 python:alpine "python -m http.servโฆ" About an hour ago Up About a minute amazing_chatelet
์ปจํ ์ด๋ ์๋๋ก ๋ช ๋ น์ด ์คํ
์คํ ์ค์ธ ์ปจํ
์ด๋ ์๋๋ก ๋ช
๋ น์ด๋ฅผ ๋ ๋ฆฌ๊ณ ์ถ๋ค๋ฉดย docker exec
ย ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ค ์ปจํ
์ด๋๋ฅผ ์๋๋กย ls
ย ์ปค๋งจ๋๋ฅผ ์คํํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ฉด ๋ฉ๋๋ค.
$ docker exec b1bae952f7a6 ls
bin dev etc home lib media mnt ...์๋ต...
-it
ย ์ต์
์ ์ฌ์ฉํ๋ฉด ํด๋น ์ปจํ
์ด๋์ ์(shell)๊ณผ ์์ ์ํธ์์ฉํ๋ฉด์ ์ฐ์์ผ๋ก ๋ช
๋ น์ด๋ฅผ ์คํํ ์ ์์ต๋๋ค.
$ docker exec -it container_name /bin/sh
$ ls
bin etc lib mnt proc run srv tmp var
dev home media opt root sbin sys usr
์ปจํ ์ด๋ ๋ก๊ทธ ํ์ธ
์ปจํ
์ด๋์ ๋ก๊ทธ๋ฅผ ํ์ธํ๋ ค๋ฉดย docker logs
ย ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
$ docker logs b1bae952f7a6
# -f ์ต์
์ ์ฌ์ฉํ๋ฉด ์ค์๊ฐ ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
$ docker logs -f container_name
# ๋ง์ง๋ง 10์ค๋ง ์ถ๋ ฅ
$ docker logs --tail 10 container_name
์ปจํ ์ด๋ ์์ธ ์ ๋ณด
ํน์ ์ปจํ
์ด๋์ ์์ธ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ์ถ๋ค๋ฉด,ย docker inspect
ย ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
$ docker inspect 8c27a672e23c
[
{
"Id": "8c27a672e23c1c48aaaa0d2e65325aefb36db2934f724634dd4f5684397014ba",
"Created": "2020-04-25T18:23:24.651490253Z",
"Path": "/bin/sh",
"Args": [],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-04-25T18:23:25.300618082Z",
"FinishedAt": "2020-04-25T18:23:25.347690066Z"
},
"Image": "sha256:f70734b6a266dcb5f44c383274821207885b549b75c8e119404917a61335981a",
...์๋ต...
}
]
์ปจํ ์ด๋ ์ ๊ฑฐ
์ปจํ
์ด๋๋ฅผ ์ ๊ฑฐํ๊ณ ์ถ์ ๋๋ย docker rm
ย ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ค์ง๋์ด ์๋ ์ปจํ
์ด๋๋ ์๋ฌด ์ต์
์์ด ์ ๊ฑฐํ ์ ์์ต๋๋ค.
# ์ปจํ
์ด๋ ์ ๊ฑฐ
$ docker rm 3722f14f4d2a
3722f14f4d2a
# ์คํ ์ค์ธ ์ปจํ
์ด๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๋ก ์ ๊ฑฐ๊ฐ ํ์ฉ๋์ง ์์ต๋๋ค.
# ์ด ๋๋, -f ์ต์
์ ์ฌ์ฉํ๋ฉด ํด๋น ์ปจํ
์ด๋๋ฅผ ๋จผ์ ์ ์ง์ํจ ๋ค์์ ์ ๊ฑฐํด์ค๋๋ค.
$ docker rm d2f83048485e
Error response from daemon: You cannot remove a running container d2f83048485e4fe694dac374be152906e4e20da400305e5095bbb476bcaf718d. Stop the container before attempting removal or force remove
$ docker rm -f d2f83048485e
# ์คํ ์ค์ธ ์ปจํ
์ด๋๋ ๊ฑด๋ค์ง ์๊ณ ์ค์ง๋์ด ์๋ ๋ชจ๋ ์ปจํ
์ด๋๋ฅผ ์ ๊ฑฐํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ฉด ๋ฉ๋๋ค.
$ docker rm $(docker ps -a -q)
์ปจํ ์ด๋ ๋ ํผ๋ฐ์ค ์ฐธ๊ณ
- Docker run reference
- docker run
- docker ps
- docker stop
- docker start
- docker exec
- docker logs
- docker attach
- docker inspect
- docker rm
๐ฏ ๋ณผ๋ฅจ/๋ฐ์ธ๋ ๋ง์ดํธ ๊ด๋ จ ๋ช ๋ น์ด
Docker ์ปจํ ์ด๋(container)์ ์ฐ์ฌ์ง ๋ฐ์ดํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปจํ ์ด๋๊ฐ ์ญ์ ๋ ๋ ํจ๊ป ์ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค. Docker์์ ๋์๊ฐ๋ ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปจํ ์ด๋์ ์๋ช ์ฃผ๊ธฐ์ ๊ด๊ณ์์ด ๋ฐ์ดํฐ๋ฅผ ์์์ ์ผ๋ก ์ ์ฅ์ ํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๋ํ ์ฌ๋ฌ ๊ฐ์ Docker ์ปจํ ์ด๋๊ฐ ํ๋์ ์ ์ฅ ๊ณต๊ฐ์ ๊ณต์ ํด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์จ์ผํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
์ด๋ ๊ฒ Docker ์ปจํ ์ด๋์ ์๋ช ์ฃผ๊ธฐ์ ๊ด๊ณ์์ด ๋ฐ์ดํฐ๋ฅผ ์์์ ์ผ๋ก ์ ์ฅํ ์ ์๋๋ก Docker๋ ๋๊ฐ์ง ์ต์ ์ ์ ๊ณตํฉ๋๋ค. ์ฒซ๋ฒ์งธ๋ Docker ๋ณผ๋ฅจ(volume), ๋๋ฒ์งธ๋ ๋ฐ์ธ๋ ๋ง์ดํธ(bind mount)์ ๋๋ค.
๋ณผ๋ฅจ ์์ฑ
docker volume create
ย ์ปค๋งจ๋๋ฅผ ์ด์ฉํด์ ๋ณผ๋ฅจ์ ์์ฑํ ์ ์์ต๋๋ค.
$ docker volume create our-vol
our-vol
๋ณผ๋ฅจ ์กฐํ
docker volume ls
ย ์ปค๋งจ๋๋ฅผ ์คํํ๋ฉด ๋ณผ๋ฅจ์ ํ์ธํ ์ ์์ต๋๋ค.
$ docker volume ls
DRIVER VOLUME NAME
local our-vol
๋ณผ๋ฅจ ์์ธ ์ ๋ณด
docker volume inspect
ย ์ปค๋งจ๋๋ฅผ ํตํด ํด๋น ๋ณผ๋ฅจ์ ์ข ๋ ์์ธํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
$ docker volume inspect our-vol
[
{
"CreatedAt": "2020-05-09T17:03:46Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/our-vol/_data",
"Name": "our-vol",
"Options": {},
"Scope": "local"
}
]
Mountpoint
ย ํญ๋ชฉ์ ๋ณด๋ฉด ํด๋น ๋ณผ๋ฅจ์ด ์ปดํจํฐ์ ์ด๋ ๊ฒฝ๋ก์ ์์ฑ๋์๋์ง๋ฅผ ์ ์ ์์ต๋๋ค.
์ปจํ ์ด๋์ ๋ณผ๋ฅจ ๋ง์ดํธ
์ปจํ
์ด๋๊ฐ ๋ณผ๋ฅจ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ณผ๋ฅจ์ ์ปจํ
์ด๋์ ๋ง์ดํธ(mount)ํด์ค์ผ ํฉ๋๋ค.ย docker run
ย ์ปค๋งจ๋๋ก ์ปจํ
์ด๋๋ฅผ ์คํํ ๋ย -v
ย ์ต์
์ ์ฌ์ฉํ์ฌ ๋ง์ดํธํฉ๋๋ค. ์ฝ๋ก (:
)์ ๊ตฌ๋ถ์๋ก ํด์ ์์๋ ๋ง์ดํธํ ๋ณผ๋ฅจ๋ช
๋ค์๋ ์ปจํ
์ด๋ ๋ด์ ๊ฒฝ๋ก๋ฅผ ๋ช
์ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
# `our-vol`ย ๋ณผ๋ฅจ์ย `one`ย ์ปจํ
์ด๋์ย `/app`ย ๊ฒฝ๋ก์ ๋ง์ดํธ, touch ๋ช
๋ น์ด๋ก ํ์ผ ์์ฑ
$ docker run -v our-vol:/app --name one busybox touch /app/test.txt
touch /app/test.txt
ย ์ปค๋งจ๋๋ฅผ ์คํํ์๊ธฐ ๋๋ฌธ์,ย test.txt ํ์ผ์ดย our-volย ๋ณผ๋ฅจ์ ๊ฒฝ๋ก์๋ ๋จ์์์ต๋๋ค.
$ ls /var/lib/docker/volumes/our-vol/_data
test.txt
docker inspect
ย ์ปค๋งจ๋๋ก ์ปจํ
์ด๋์ ์์ธ ์ ๋ณด๋ฅผ ํ์ธํด๋ณด๋ฉดย our-volย ๋ณผ๋ฅจ์ดย volumeย ํ์
์ผ๋ก ๋ง์ดํธ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
$ docker inspect one
...์๋ต...
"Mounts": [
{
"Type": "volume",
"Name": "our-vol",
"Source": "/var/lib/docker/volumes/our-vol/_data",
"Destination": "/app",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
...์๋ต...
๋ค๋ฅธ ์ปจํ ์ด๋์๋ ๋ณผ๋ฅจ ๋ง์ดํธ
๊ฐ์ย our-volย ๋ณผ๋ฅจ์ย twoย ์ปจํ ์ด๋์ย /appย ๊ฒฝ๋ก์ ๋ง์ดํธ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค.ย ls /appย ์ปค๋งจ๋๋ฅผ ์คํํด๋ณด๋,ย oneย ์ปจํ ์ด๋๊ฐ ๋ณผ๋ฅจ์ ์์ฑํด๋์ ํ์ผ์ด ๊ทธ๋๋ก ๋ณด์ด๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
$ docker run -v our-vol:/app --name two busybox ls /app
test.txt
์ด๋ ๊ฒ ์ฌ๋ฌ ๊ฐ์ ์ปจํ
์ด๋๊ฐ ํ๋์ ๋ณผ๋ฅจ์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ์ปจํ
์ด๋ ๊ฐ ๋ฐ์ดํฐ ๊ณต์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋ณผ๋ฅจ ์ญ์
docker volume rm
ย ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํด์ ๋ณผ๋ฅจ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๋ง์ฝ ์ ๊ฑฐํ๋ ค๋ ๋ณผ๋ฅจ์ด ๋ง์ดํธ๋์ด ์๋ ์ปจํ
์ด๋๊ฐ ์์ ๋๋ ํด๋น ๋ณผ๋ฅจ์ด ์ ๊ฑฐ๊ฐ ๋์ง๊ฐ ์์ต๋๋ค. ๊ทธ๋ด ๋๋ ํด๋น ๋ณผ๋ฅจ์ด ๋ง์ดํธ๋์ด ์๋ ๋ชจ๋ ์ปจํ
์ด๋๋ฅผ ๋จผ์ ์ญ์ ํ๊ณ , ๋ณผ๋ฅจ์ ์ญ์ ํด์ผ ํฉ๋๋ค.
# ์ปจํ
์ด๋ ์ญ์
$ docker rm -f one two
one
two
# ๋ณผ๋ฅจ ์ญ์
$ docker volume rm our-vol
our-vol
๋ณผ๋ฅจ ์ฒญ์
docker volume prune
ย ์ปค๋งจ๋๋ฅผ ์ด์ฉํด์ ๋ง์ดํธ๋์ด ์์ง ์์ ๋ชจ๋ ๋ณผ๋ฅจ์ ํ๋ฒ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
๋ฐ์ธ๋ ๋ง์ดํธ
Docker ์ปจํ ์ด๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ธ๋ ๋ง์ดํธ(bind mount)๋ผ๋ ๊ฒ๋ ์์ต๋๋ค. ๋ฐ์ธ๋ ๋ง์ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ํธ์คํธ ํ์ผ ์์คํ ์ ํน์ ๊ฒฝ๋ก๋ฅผ ์ปจํ ์ด๋๋ก ๋ฐ๋ก ๋ง์ดํธํ ์ ์์ต๋๋ค.
๋ฐ์ธ๋ ๋ง์ดํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ย docker run
ย ์ปค๋งจ๋๋ฅผ ์คํํ ๋,ย -v
ย ์ต์
์ ์ฝ๋ก (:
) ์ ๋ถ๋ถ์ ๋ง์ดํธ๋ช
๋์ ์ ํธ์คํธ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํด์ฃผ๋ ๊ฒ์
๋๋ค.
์๋ฅผ ๋ค์ด, ํ์ฌ ๊ฒฝ๋ก์ย test.txt
ย ํ์ผ์ ์์ฑํ๊ณ , ํด๋น ํธ์คํธ ๊ฒฝ๋ก๋ฅผ ์ปจํ
์ด๋์ย /app
ย ๊ฒฝ๋ก์ ๋ง์ดํธํฉ๋๋ค. ์ปจํ
์ด๋์ ํฐ๋ฏธ๋์ ์ ์ํ์ฌย ls /app
ย ์ปค๋งจ๋๋ฅผ ์คํํด๋ณด๋ฉดย test.txt
ย ํ์ผ์ด ์กด์ฌํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
# ํ์ผ ์์ฑ
$ touch test.txt
# ๋ฐ์ธ๋ ๋ง์ดํธ, ์ปจํ
์ด๋ ์ ์ ์
$ docker run -v `pwd`:/app -it --name one busybox /bin/bash
# ์กฐํ
$ ls /app
test.txt
๋ฐ๋๋ก ์ปจํ ์ด๋์ย /appย ๊ฒฝ๋ก ์์์ย test2.txtย ํ์ผ์ ์คํํด๋ณด๋ฉด ํธ์คํธ์ ํ์ฌ ๊ฒฝ๋ก์์๋ ํด๋น ํ์ผ์ ํ์ธํ ์ ์์ต๋๋ค.
# ์ปจํ
์ด๋ ๋ด์์ ํ์ผ ์์ฑ
$ touch /app/test2.txt
# ์ปจํ
์ด๋ ์ ์ข
๋ฃ
$ exit
# ํธ์คํธ์์ ์กฐํ
$ ls
test.txt test2.txt
๋ณผ๋ฅจ VS ๋ฐ์ธ๋ ๋ง์ดํธ
๋ณผ๋ฅจ(volume)๊ณผ ๋ฐ์ธ๋ ๋ง์ดํธ(bind mount)์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ Docker์ ํด๋น ๋ง์ดํธ ํฌ์ธํธ ๊ด๋ฆฌ ์ฌ๋ถ์ ๋๋ค.
๋ณผ๋ฅจ์ ์ฌ์ฉํ ๋๋ ์ฐ๋ฆฌ๊ฐ ์ค์ค๋ก ๋ณผ๋ฅจ์ ์์ฑํ๊ฑฐ๋ ์ญ์ ํด์ผํ๋ ๋ถํธํจ์ด ์์ง๋ง, ํด๋น ๋ณผ๋ฅจ์ Docker ์์์ ์ด๋ฏธ์ง(image)๋ ์ปจํ ์ด๋(container), ๋คํธ์ํฌ(network)์ ๋น์ทํ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌ๊ฐ ๋๋ ์ด์ ์ด ์์ต๋๋ค. ๊ทธ๋์ ๋๋ถ๋ถ์ ์ํฉ์์๋ ๋ณผ๋ฅจ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋์ง๋ง ์ปจํ ์ด๋ํ๋ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ฑํ ๋๋ ๋ฐ์ธ๋ ๋ง์ดํธ๊ฐ ๋ ์ ๋ฆฌํ ์ ์์ต๋๋ค.
๋ก์ปฌ์์ ๊ฐ๋ฐ์ ํ ๋๋ ์ผ๋ฐ์ ์ผ๋ก ํ์ฌ ์์
๋๋ ํฐ๋ฆฌ์ ํ๋ก์ ํธ ์ ์ฅ์๋ฅผย git clone
ย ๋ฐ์๋๊ณ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฐ์ธ๋ ๋ง์ดํธ๋ฅผ ์ด์ฉํด์ ํด๋น ๋๋ ํฐ๋ฆฌ๋ฅผ ์ปจํ
์ด๋์ ํน์ ๊ฒฝ๋ก์ ๋ง์ดํธํด์ฃผ๋ฉด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋ ๋ง๋ค ๋ณ๊ฒฝ ์ฌํญ์ ์ค์๊ฐ์ผ๋ก ์ปจํ
์ด๋๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค. ๋ํ ์ปจํ
์ด๋๋ฅผ ํตํด ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ ํ์ฌ ์์
๋๋ ํฐ๋ฆฌ์์ ๋ฐ๋ก ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ํธ๋ฆฌํฉ๋๋ค.
๋ณผ๋ฅจ ๋ ํผ๋ฐ์ค ์ฐธ๊ณ
๐ฏ ๋คํธ์ํฌ ๊ด๋ จ ๋ช ๋ น์ด
Docker ์ปจํ ์ด๋(container)๋ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์์ ๋์๊ฐ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ์ปจํ ์ด๋์์ ํต์ ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง ์ฌ๋ฌ ๊ฐ์ ์ปจํ ์ด๋๋ฅผ ํ๋์ Docker ๋คํธ์ํฌ(network)์ ์ฐ๊ฒฐ์ํค๋ฉด ์๋ก ํต์ ์ด ๊ฐ๋ฅํด์ง๋๋ค.
๋คํธ์ํฌ ์ข ๋ฅ
Docker ๋คํธ์ํฌ๋ย bridge
,ย host
,ย overlay
ย ๋ฑ ๋ชฉ์ ์ ๋ฐ๋ผ ๋ค์ํ ์ข
๋ฅ์ ๋คํธ์ํฌ ๋๋ผ์ด๋ฒ(driver)๋ฅผ ์ง์ํฉ๋๋ค.
bridge
ย ๋คํธ์ํฌ๋ ํ๋์ ํธ์คํธ ์ปดํจํฐ ๋ด์์ ์ฌ๋ฌ ์ปจํ ์ด๋๋ค์ด ์๋ก ์ํตํ ์ ์๋๋ก ํด์ค๋๋ค.host
ย ๋คํธ์ํฌ๋ ์ปจํ ์ด๋๋ฅผ ํธ์คํธ ์ปดํจํฐ์ ๋์ผํ ๋คํธ์ํฌ์์ ์ปจํ ์ด๋๋ฅผ ๋๋ฆฌ๊ธฐ ์ํด์ ์ฌ์ฉ๋ฉ๋๋ค.overlay
ย ๋คํธ์ํฌ๋ ์ฌ๋ฌ ํธ์คํธ์ ๋ถ์ฐ๋์ด ๋์๊ฐ๋ ์ปจํ ์ด๋๋ค ๊ฐ์ ๋คํธ์ํน์ ์ํด์ ์ฌ์ฉ๋ฉ๋๋ค.
๋คํธ์ํฌ ์์ฑ
docker network create
ย ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํด์ Docker ๋คํธ์ํฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
$ docker network create our-net
e6dfe4a9a5ec85abcb484662c30a3a0fc76df217dde76d52fac39fae8412ca68
๋คํธ์ํฌ ์กฐํ
docker network ls
์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ ์์ฑ๋์ด ์๋ Docker ๋คํธ์ํฌ ๋ชฉ๋ก์ ์กฐํํ ์ ์์ต๋๋ค.
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
143496b94e57 bridge bridge local
311d6534f79f host host local
aa89f58200a6 none null local
๋คํธ์ํฌ ์์ธ ์ ๋ณด
docker network inspect
ย ์ปค๋งจ๋๋ก ๋คํธ์ํฌ์ ์์ธ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
$ docker network inspect our-net
๋คํธ์ํฌ์ ์ปจํ ์ด๋ ์ฐ๊ฒฐ
๋จผ์ ์ปจํ
์ด๋ ํ๋๋ฅผย one
๋ผ๋ ์ด๋ฆ์ผ๋ก ์คํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
$ docker run -itd --name one busybox
660bafdce2996378cde070dfd894731bb90745e46d2ab10d6504c0cc9f4bdea9
์ปจํ
์ด๋๋ฅผ ์คํํ ๋ย --network
ย ์ต์
์ ๋ช
์ํด์ฃผ์ง ์์ผ๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋กย bride
๋ผ๋ ์ด๋ฆ์ ๋ํดํธ ๋คํธ์ํฌ์ ๋ถ๊ฒ ๋ฉ๋๋ค.
$ docker network inspect bridge
... ์๋ต ...
"Containers": {
"660bafdce2996378cde070dfd894731bb90745e46d2ab10d6504c0cc9f4bdea9": {
"Name": "one",
"EndpointID": "40b4bbd8385debf86eef2fc2136315e1a82fa1ef72877bfae25477d6e8e46726",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
},
},
... ์๋ต ...
์ด์ one
ย ์ปจํ
์ด๋์ย our-net
ย ๋คํธ์ํฌ๋ฅผ ์ฐ๊ฒฐํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Docker ๋คํธ์ํฌ์ ์ปจํ
์ด๋๋ฅผ ์ฐ๊ฒฐํ ๋๋ย docker network connect
ย ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
$ docker network connect our-net one
our-net
ย ๋คํธ์ํฌ์ ์์ธ ์ ๋ณด๋ฅผ ๋ค์ ํ์ธํด๋ณด๋ฉดย Containers
ย ํญ๋ชฉ์ย one
ย ์ปจํ
์ด๋๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.ย one
ย ์ปจํ
์ด๋์ IPย 172.19.0.2
๊ฐ ํ ๋น๋ ๊ฒ๋ ํ์ธํ ์ ์์ต๋๋ค.
$ docker network inspect our-net
[
{
"Name": "our-net",
"Id": "e6dfe4a9a5ec85abcb484662c30a3a0fc76df217dde76d52fac39fae8412ca68",
"Created": "2020-04-26T19:23:04.563643516Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"660bafdce2996378cde070dfd894731bb90745e46d2ab10d6504c0cc9f4bdea9": {
"Name": "one",
"EndpointID": "cc490148a533d40b3aff33a421cc9a01c731c75a8deb70ab729a5358f2fd381c",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
๋คํธ์ํฌ๋ก๋ถํฐ ์ปจํ ์ด๋ ์ฐ๊ฒฐ ํด์
ํ๋์ ์ปจํ
์ด๋๋ ์ฌ๋ฌ ๊ฐ์ ๋คํธ์ํฌ์ ๋์์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ต์ด์ย one
ย ์ปจํ
์ด๋๋ฅผ ์์ฑํ ๋ย bridge
ย ๋คํธ์ํฌ ๋ถ์๊ธฐ ๋๋ฌธ์, ํ์ฌย one
ย ์ปจํ
์ด๋๋ย our-net
ย ๋คํธ์ํฌ์ย bridge
ย ๋คํธ์ํฌ์ ๋์์ ๋ถ์ด์๊ฒ ๋ฉ๋๋ค.
one
ย ์ปจํ
์ด๋๋ฅผย bridge
ย ๋คํธ์ํฌ๋ก๋ถํฐ ํด์ ํ๊ฒ ์ต๋๋ค. Docker ๋คํธ์ํฌ๋ก๋ถํฐ ์ปจํ
์ด๋์ ์ฐ๊ฒฐ์ ๋์ ๋๋ย docker network disconnect
ย ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
$ docker network disconnect bridge one
๋๋ฒ์งธ ์ปจํ ์ด๋ ์ฐ๊ฒฐ
ํ๋์ ์ปจํ
์ด๋๋ฅผ ๋ย our-net
ย ๋คํธ์ํฌ์ ์ฐ๊ฒฐํฉ๋๋ค. ์ด๋ฒ์๋ย --network
ย ์ต์
์ ์ฌ์ฉํด์ ์ปจํ
์ด๋๋ฅผ ์คํํ๋ฉด์ ๋ฐ๋ก ์ฐ๊ฒฐํ ๋คํธ์ํฌ๋ฅผ ์ง์ ํด์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
$ docker run -itd --name two --network our-net busybox
0e7fe8a59f9d3f8bd545d3e557ffd34100a09b8ebe92ae5a375f37a5d072873d
์ปจํ ์ด๋ ๊ฐ ๋คํธ์ํน
์ปจํ ์ด๋ ์ด๋ฆ์ ํธ์คํธ๋ค์(hostname)์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
$ docker exec one ping two
PING two (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.119 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.105 ms
64 bytes from 172.19.0.3: seq=2 ttl=64 time=0.116 ms
64 bytes from 172.19.0.3: seq=3 ttl=64 time=0.883 ms
64 bytes from 172.19.0.3: seq=4 ttl=64 time=0.127 ms
๋คํธ์ํฌ ์ ๊ฑฐ
docker network rm
ย ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํด์ย our-netย ๋คํธ์ํฌ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
๋คํธ์ํฌ ์์์ ์คํ์ค์ธ ์ปจํ ์ด๋๊ฐ ์์ ๋๋ ์ ๊ฑฐ๊ฐ ๋์ง ์์ต๋๋ค. ๋จผ์ ํด๋น ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋์ด ์คํ ์ค์ธ ๋ชจ๋ ์ปจํ ์ด๋๋ฅผ ์ค์ง์ํค๊ณ , ๋คํธ์ํฌ๋ฅผ ์ญ์ ํด์ผ ํฉ๋๋ค.
# ์ปจํ
์ด๋ ์ค์ง
$ docker stop one two
one
two
# ๋คํธ์ํฌ ์ญ์
$ docker network rm our-net
our-net
๋คํธ์ํฌ ์ฒญ์
docker network prune
ย ์ปค๋งจ๋๋ฅผ ์ด์ฉํด์ ๋ถํ์ํ ๋คํธ์ํฌ๋ฅผ ํ๋ฒ์ ๋ชจ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
$ docker network prune
WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N] y
๋คํธ์ํฌ ๋ ํผ๋ฐ์ค ์ฐธ๊ณ
- docker network ls
- docker network create
- docker network inspect
- docker network connect
- docker network disconnect
- docker network rm
- docker network prune
๐ฏ ์ด๋ฏธ์ง ๊ด๋ จ ๋ช ๋ น์ด
Docker CLI ๋๊ตฌ๋ Docker ์ด๋ฏธ์ง(image)์ ํจ๊ณผ์ ์ธ ๊ด๋ฆฌ๋ฅผ ์ํด์ ๋ค์ํ ์ปค๋งจ๋(command)๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด๋ฏธ์ง ์กฐํ
docker images
์ปค๋งจ๋๋ก ์ด๋ฏธ์ง๋ฅผ ์กฐํํ ์ ์์ต๋๋ค.
# ์ด๋ฏธ์ง ์กฐํ
$ docker images
## ํน์ ๋ฆฌํ์งํ ๋ฆฌ(repository)์ ํด๋นํ๋ ์ด๋ฏธ์ง๋ง ํํฐ๋งํด์ ๋ณด๊ณ ์ถ์ ๋๋
## ๋ฆฌํ์งํ ๋ฆฌ๋ฅผ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ฉด ๋ฉ๋๋ค.
$ docker images node
node 10-alpine 34a10d47f150 2 weeks ago 83.5MB
node 12-alpine f77abbe89ac1 2 weeks ago 88.1MB
# ํ๊ทธ๊น์ง ์ธ์๋ก ๋๊ธฐ๋ฉด ํน์ ์ด๋ฏธ์ง๊ฐ ์กฐํ๋ฉ๋๋ค.
$ docker images node:12-alpine
node 12-alpine f77abbe89ac1 2 weeks ago 88.1MB
์ด๋ฏธ์ง ๋ค์ด๋ก๋
docker pull
์ปค๋งจ๋๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ ํ ์ ์์ต๋๋ค.
run
๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด ์ด๋ฏธ์ง๊ฐ ์์ ๋ ์๋์ผ๋ก ๋ค์ด๋ฐ์ผ๋ย pull
๋ช
๋ น์ด๋ฅผ ์ธ์ ์ฐ๋์ง ๊ถ๊ธํ ์ ์๋๋ฐย pull
์ ์ด๋ฏธ์ง๋ฅผ ์ต์ ๋ฒ์ ์ผ๋ก ๋ค์ ๋ค์ด ๋ฐ์ต๋๋ค. ๊ฐ์ ํ๊ทธ์ง๋ง ์ด๋ฏธ์ง๊ฐ ์
๋ฐ์ดํธ ๋ ๊ฒฝ์ฐ๋ย pull
๋ช
๋ น์ด๋ฅผ ํตํด ์ด๋ฏธ์ง๋ฅผ ์๋ก ๋ค์ด๋ฐ์ ์ ์์ต๋๋ค.
# ์ด๋ฏธ์ง ๋ค์ด
$ docker pull ubuntu:14.04
์ด๋ฏธ์ง ๋น๋
docker build
ย ์ปค๋งจ๋๋ Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋(build)ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
Docker ๋ฐ๋ชฌ์ด ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ ค๋ฉด ์์ ์ปจํ ์คํธ(context)๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ Dockerfile์ ๋ด๊ณ ์๋ ๋๋ ํฐ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. Dockerfile์ ๋ณดํต ๊ฐ์ ๋๋ ํฐ๋ฆฌ ์์ ์๋ ์ค์ ํ์ผ์ด๋ ์์ค ์ฝ๋๋ฅผ ์ด์ฉํด์ ์ด๋ฏธ์ง์ ๋น๋ ์ ์ฐจ๋ฅผ ์ ์ํฉ๋๋ค.
# ํ์ฌ ์์
๋๋ ํฐ๋ฆฌ ๊ธฐ์ค ์ด๋ฏธ์ง ๋น๋
$ docker build .
# ๋คํธ์ํฌ ์์ Git repository ์ฃผ์๋ ์์ถ ํ์ผ ๋น๋
$ docker build github.com/creack/docker-firefox
# -t ์ต์
์ ์ฌ์ฉํ์ฌ Docker ์ด๋ฏธ์ง์ ํ๊ทธ(tag)๋ฅผ ์ค์
## ํ๊ทธ๋ ๋ฆฌํ์งํ ๋ฆฌ(repository):ํ๊ทธ(tag) ํํ๋ก ์ง์ ์ด ๊ฐ๋ฅํ๋ฉฐ
## ํ๊ทธ ๋ถ๋ถ์ ์๋ตํ๋ฉด latest๊ฐ ํ๊ทธ๊ฐ ๋ฉ๋๋ค.
$ docker build -t test:1.0 .
# -f ์ต์
์ ์ฌ์ฉํ๋ฉด ๋ํดํธ์ธ Dockerfile ๋์ ์ ๋ค๋ฅธ ํ์ผ๋ก ๋ถํฐ Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋
$ docker build -f Dockerfile.dev .
์ด๋ฏธ์ง ํ๊น
์ด๋ฏธ์ง ํ๊น
์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ ํ ํ์ ๋ณ๋๋ก ํด์ค ์๋ ์๋๋ฐ, ์ด ๋ย docker tag
ย ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ด๋ฏธ์งID, ๋๋ฒ์งธ ์ธ์๋ก ๋ฆฌํ์งํ ๋ฆฌ ๋๋ ํ๊ทธ๊น์ง ๋๊ฒจ์ฃผ๋ฉด ๋ฉ๋๋ค.
$ docker tag 8bae72379b48 test:2.0
์ด๋ฏธ์ง ์ญ์
docker rmi
ย ์ปค๋งจ๋๋ก Docker ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค. ์ญ์ ํ๋ ค๋ ์ด๋ฏธ์ง์ ID๋ ํ๊ทธ๋ฅผ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ฉด ํด๋น ์ด๋ฏธ์ง๊ฐ ์ญ์ ๊ฐ ๋ฉ๋๋ค.
# ์ด๋ฏธ์ง ์ญ์
$ docker rmi f77abbe89ac1
$ docker rmi node:12-alpine
# ์ด๋ฏธ์ง ์กฐํ
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test2 latest 8bae72379b48 56 minutes ago 5.6MB
test latest 8bae72379b48 56 minutes ago 5.6MB
# -f ์ต์
์ ์ฃผ๊ณ ์ด๋ฏธ์ง ID๋ฅผ ์ธ์๋ก ๋๊ธฐ๋ฉด ์ด๋ฏธ์ง ์ญ์
$ docker rmi -f 8bae72379b48
Untagged: test2:latest
Untagged: test:latest
Deleted: sha256:8bae72379b4
# ์ฌ์ฉํ์ง ์๋ ์ด๋ฏธ์ง ์ ์ฒด ์ญ์
$ docker rmi $(docker images -q) -f
๋๊ธ๋จ๊ธฐ๊ธฐ