docker pull 이미지
root@ubuntu2004:~# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
faef57eae888: Pull complete
76579e9ed380: Pull complete
cf707e233955: Pull complete
91bb7937700d: Pull complete
4b962717ba55: Pull complete
f46d7b05649a: Pull complete
103501419a0a: Pull complete
Digest: sha256:08bc36ad52474e528cc1ea3426b5e3f4bad8a130318e3140d6cfe29c8892c7ef
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
docker images
root@ubuntu2004:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sheepjieun/ubuntu_py3 latest d35b33131eeb 2 days ago 149MB
nginx latest 021283c8eb95 12 days ago 187MB
docker create 이름
root@ubuntu2004:~# docker container create nginx
e2b5b4151e79e370b18e98a51284217aaa19f2503b45e57ea3eacda3d259a403
docker ps
root@ubuntu2004:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d82f1b3ce211 sheepjieun/ubuntu_py3 "bash" 2 days ago Up 2 days ubuntu_py3
컨테이너를 만들기는 하였으나 구동하지 않았으므로 docker ps 명령어를 입력했을 때는 아무런 정보도 나오지 않습니다.
docker ps에 -a를 붙이면 구동하지 않은 컨테이너의 정보도 조회할 수 있어요.
docker ps -a
root@ubuntu2004:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2b5b4151e79 nginx "/docker-entrypoint.…" 6 minutes ago Created hopeful_maxwell
d82f1b3ce211 sheepjieun/ubuntu_py3 "bash" 2 days ago Up 2 days ubuntu_py3
docker create --name="컨테이너명" 이미지명
root@ubuntu2004:~# docker container create --name="nginx" nginx
bc1ce28646328c61786f3591f3f6d21ddeb67d54cb3f30296bf9efc05010a25d
root@ubuntu2004:~#
root@ubuntu2004:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc1ce2864632 nginx "/docker-entrypoint.…" 3 seconds ago Created nginx
e2b5b4151e79 nginx "/docker-entrypoint.…" 7 minutes ago Created hopeful_maxwell
d82f1b3ce211 sheepjieun/ubuntu_py3 "bash" 2 days ago Up 2 days ubuntu_py3
docker stop nginx
docker rm 컨테이너ID
root@ubuntu2004:~# docker rm e2b5b4151e79
e2b5b4151e79
root@ubuntu2004:~#
root@ubuntu2004:~#
root@ubuntu2004:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc1ce2864632 nginx "/docker-entrypoint.…" 31 seconds ago Created nginx
d82f1b3ce211 sheepjieun/ubuntu_py3 "bash" 2 days ago Up 2 days ubuntu_py3
docker run --name=컨테이너명 -d -p 8888:80 이미지명
root@ubuntu2004:~# docker run --name=nginx -d -p 8888:80 nginx
a105fc3060b9e15b19359ab4f31bd87ab3144d5dfbf3cf6a937ca28235c3c88d
root@ubuntu2004:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a105fc3060b9 nginx "/docker-entrypoint.…" 25 seconds ago Up 25 seconds 0.0.0.0:8888->80/tcp, :::8888->80/tcp nginx
d82f1b3ce211 sheepjieun/ubuntu_py3 "bash" 2 days ago Up 2 days ubuntu_py3
-d
'detached mode' 또는 '백그라운드 모드'로 컨테이너를 실행하라는 뜻이고, 이 옵션을 사용하면 컨테이너가 백그라운드에서 실행되어 터미널 세션을 차지하지 않게 됩니다.
백그라운드에서 데몬 실행-p
-p 옵션은 'port'를 의미하며, 이 옵션을 사용하여 호스트 시스템의 포트와 컨테이너의 포트를 연결할 수 있습니다. -p 뒤에 나오는 첫 번째 숫자는 호스트 시스템의 포트 번호를, 두 번째 숫자는 컨테이너의 포트 번호를 나타냅니다. 이를 통해 호스트 시스템의 특정 포트를 통해 컨테이너의 서비스에 접근할 수 있습니다.
즉, -p 8888:80 옵션을 사용하면 호스트 시스템의 8888번 포트를 통해 컨테이너의 80번 포트 (즉, nginx 서비스)에 접근할 수 있게 됩니다. 이렇게 설정하면 도커 호스트 외부에서도 웹 브라우저 등을 통해 nginx 서비스를 사용할 수 있게 됩니다. 도커가 호스트 OS와 격리된 환경에서 동작하기 때문에, 이렇게 포트를 매핑해주지 않으면 컨테이너 내부의 서비스에 접근할 방법이 없습니다.
curl localhost:포트번호
root@ubuntu2004:~# curl localhost:8888
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
docker ps -a | grep Exited
docker ps -a --filter "status=exited"
root@ubuntu2004:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29dda8a2535b nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8886->80/tcp, :::8886->80/tcp nginx4
f4d364f708f8 nginx "/docker-entrypoint.…" 2 minutes ago Up 5 seconds 0.0.0.0:8887->80/tcp, :::8887->80/tcp nginx3
a105fc3060b9 nginx "/docker-entrypoint.…" 10 minutes ago Up 10 minutes 0.0.0.0:8888->80/tcp, :::8888->80/tcp nginx
d82f1b3ce211 sheepjieun/ubuntu_py3 "bash" 2 days ago Up 2 days ubuntu_py3
root@ubuntu2004:~# docker stop nginx3
nginx3
root@ubuntu2004:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29dda8a2535b nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:8886->80/tcp, :::8886->80/tcp nginx4
f4d364f708f8 nginx "/docker-entrypoint.…" 2 minutes ago Exited (0) 11 seconds ago nginx3
a105fc3060b9 nginx "/docker-entrypoint.…" 11 minutes ago Up 11 minutes 0.0.0.0:8888->80/tcp, :::8888->80/tcp nginx
d82f1b3ce211 sheepjieun/ubuntu_py3 "bash" 2 days ago Up 2 days ubuntu_py3
root@ubuntu2004:~#
root@ubuntu2004:~# docker ps -a | grep Exited
f4d364f708f8 nginx "/docker-entrypoint.…" 2 minutes ago Exited (0) 6 seconds ago nginx3
docker rm -f $(docker ps -qa)
-f : 강제로 실행
docker ps -qa : 모든 컨테이너 ID 나열
root@ubuntu2004:~# docker rm -f $(docker ps -qa)
29dda8a2535b
f4d364f708f8
a105fc3060b9
d82f1b3ce211
root@ubuntu2004:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker run -it --name="ubuntu" ubuntu
root@ubuntu2004:~# docker run -it --name="ubuntu" ubuntu
root@8ddb4ac18ed1:/#
Ctrl + p + qdocker run -it --name="ubuntu" ubuntu
대화형 쉘을 통해 ubuntu 컨테이너를 실행하고, 사용자는 컨테이너와 직접 상호작용하게 됩니다.
docker run -it -d --name="ubuntu" ubuntu
ubuntu 컨테이너를 백그라운드에서 독립적으로 실행하게 되며, 사용자는 다른 작업을 계속 수행할 수 있습니다.
docker run -it -d --name="ubuntu" ubuntu
root@ubuntu2004:~# docker run -it -d --name="ubuntu" ubuntu
9ac22e732f072e13ceab231af0c28baf1a645421d2780a155113afd6e21c2e94
root@ubuntu2004:~#
docker exec -it ubuntu bash
root@ubuntu2004:~# docker exec -it ubuntu bash
root@9ac22e732f07:/#
apt-get update
apt-get install -y python3
root@9ac22e732f07:/# python3
Python 3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 3 + 2
5
파이썬 설치 완료
Ctrl+p+q 컨테이너 빠져나오기docker commit 컨테이너ID 계정명/저장할이미지명
docker push 계정명/저장된 이미지명
root@ubuntu2004:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9ac22e732f07 ubuntu "/bin/bash" 8 minutes ago Up 8 minutes ubuntu
root@ubuntu2004:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 021283c8eb95 12 days ago 187MB
ubuntu latest 5a81c4b8502e 2 weeks ago 77.8MB
root@ubuntu2004:~# docker commit 9ac22e732f07 sheepjieun/ubuntu_py
sha256:7b88870d6af72fa4af1b5ae743f34d4625fd0a81fd0c48d2c02a5ec9102087ea
root@ubuntu2004:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sheepjieun/ubuntu_py latest 7b88870d6af7 38 seconds ago 149MB
nginx latest 021283c8eb95 12 days ago 187MB
ubuntu latest 5a81c4b8502e 2 weeks ago 77.8MB
root@ubuntu2004:~# docker push sheepjieun/ubuntu_py
Using default tag: latest
The push refers to repository [docker.io/sheepjieun/ubuntu_py]
bfc881153c8f: Pushed
59c56aee1fb4: Pushed
latest: digest: sha256:e9e297d470071afc93978674cc77fbcf4c6945bf64568a5f92829782c3d61234 size: 741
중간마다 images 확인해줬다
docker ps와 docker images 두 명령어는 Docker에서 사용하는 두 가지 서로 다른 유형의 객체, 즉 컨테이너와 이미지에 관한 정보를 제공합니다.
실행 중인 인스턴스 (컨테이너)
현재 실행 중인 Docker 컨테이너의 목록을 표시합니다. 여기에는 컨테이너 ID, 사용 중인 이미지, 컨테이너가 시작된 시간, 컨테이너의 상태 (예: 실행 중, 중지됨 등), 포트 매핑 정보, 컨테이너의 이름 등이 포함됩니다.
사용 가능한 템플릿 (이미지)
시스템에 있는 모든 Docker 이미지의 목록을 표시합니다. 여기에는 이미지의 리포지토리 이름, 태그, 이미지 ID, 생성된 시간, 크기 등이 포함됩니다.
응용 프로그램을 실행하는 데 필요한 모든 파일과 설정을 포함하는 템플릿입니다.
이러한 이미지를 기반으로 실행된 인스턴스입니다. 즉, 이미지는 클래스와 같고 컨테이너는 그 클래스의 인스턴스라고 생각할 수 있습니다.

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -q
도커 컨테이너는 컨테이너 삭제 시 컨테이너 내부에 있는 데이터도 함께 사라집니다.
이 데이터를 보존하기 위해서 도커볼륨을 사용합니다.
도커 내 데이터 디렉토리를 호스트 디렉토리와 공유하며 연결해놓는 것입니다.
컨테이너 생성 시 -v {컨테이너 디렉토리명} 옵션을 걸어줍니다.
그러면 컨테이너로 들어갔을 때 data라는 디렉토리가 생성됩니다.
docker run -it -v /data --name="생성할 컨테이너명" <이미지명> bash
root@ubuntu2004:~# docker run -it -v /data --name="ubuntu_py" sheepjieun/ubuntu_py bash
root@f308932fc051:/#
-v 옵션을 사용하여 Docker 컨테이너의 '/data' 디렉토리를 Docker 볼륨으로 설정
-v /data
호스트 시스템의 '/data' 디렉토리를 컨테이너에 볼륨으로 마운트하려는 것을 의미합니다.
이 경우, 컨테이너 내부에서 이 디렉토리를 사용할 수 있으며, 컨테이너에서 생성 또는 변경한 데이터가 컨테이너를 삭제해도 보존됩니다.
root@f308932fc051:/# ls -al
total 68
drwxr-xr-x 1 root root 4096 Jul 17 05:13 .
drwxr-xr-x 1 root root 4096 Jul 17 05:13 ..
-rwxr-xr-x 1 root root 0 Jul 17 05:13 .dockerenv
lrwxrwxrwx 1 root root 7 Jun 24 02:02 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Apr 18 2022 boot
drwxr-xr-x 2 root root 4096 Jul 17 05:13 data
drwxr-xr-x 5 root root 360 Jul 17 05:13 dev
drwxr-xr-x 1 root root 4096 Jul 17 05:13 etc
drwxr-xr-x 2 root root 4096 Apr 18 2022 home
lrwxrwxrwx 1 root root 7 Jun 24 02:02 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Jun 24 02:02 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 Jun 24 02:02 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 Jun 24 02:02 libx32 -> usr/libx32
drwxr-xr-x 2 root root 4096 Jun 24 02:02 media
drwxr-xr-x 2 root root 4096 Jun 24 02:02 mnt
drwxr-xr-x 2 root root 4096 Jun 24 02:02 opt
dr-xr-xr-x 264 root root 0 Jul 17 05:13 proc
drwx------ 2 root root 4096 Jun 24 02:06 root
drwxr-xr-x 5 root root 4096 Jun 24 02:06 run
lrwxrwxrwx 1 root root 8 Jun 24 02:02 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Jun 24 02:02 srv
dr-xr-xr-x 13 root root 0 Jul 17 05:13 sys
drwxrwxrwt 1 root root 4096 Jul 17 04:43 tmp
drwxr-xr-x 1 root root 4096 Jun 24 02:02 usr
drwxr-xr-x 1 root root 4096 Jun 24 02:06 var
data 디렉토리 생성됨!
root@f308932fc051:/# cd data
root@f308932fc051:/data# ls -al
total 8
drwxr-xr-x 2 root root 4096 Jul 17 05:13 .
drwxr-xr-x 1 root root 4096 Jul 17 05:13 ..
root@f308932fc051:/data# echo "This is a test data" > test.txt
root@f308932fc051:/data# ls -al
total 12
drwxr-xr-x 2 root root 4096 Jul 17 05:22 .
drwxr-xr-x 1 root root 4096 Jul 17 05:13 ..
-rw-r--r-- 1 root root 20 Jul 17 05:22 test.txt
<볼륨이름>/_data echo "This is a test data in host system" > testhost.txt
root@ubuntu2004:/var/lib/docker/volumes/ffdd5012fdac3064933bbf38baa8b07ee68ca5ca27b7c3524fce3b8a05135da3/_data# echo "This is a test data in host system" > testhost.txt
root@ubuntu2004:/var/lib/docker/volumes/ffdd5012fdac3064933bbf38baa8b07ee68ca5ca27b7c3524fce3b8a05135da3/_data# ls -al
합계 16
drwxr-xr-x 2 root root 4096 7월 17 05:38 .
drwx-----x 3 root root 4096 7월 17 05:13 ..
-rw-r--r-- 1 root root 20 7월 17 05:22 test.txt
-rw-r--r-- 1 root root 35 7월 17 05:38 testhost.txt
호스트 시스템에서 데이터 확인 및 데이터를 새로 생성했으니 다시 컨테이너 접속해서 새 데이터를 확인해보자
root@ubuntu2004:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f308932fc051 sheepjieun/ubuntu_py "bash" 27 minutes ago Up 27 minutes ubuntu_py
9ac22e732f07 ubuntu "/bin/bash" About an hour ago Up About an hour ubuntu
root@ubuntu2004:~# docker exec -it ubuntu_py bash
root@f308932fc051:/# ls -al
total 68
drwxr-xr-x 1 root root 4096 Jul 17 05:13 .
drwxr-xr-x 1 root root 4096 Jul 17 05:13 ..
-rwxr-xr-x 1 root root 0 Jul 17 05:13 .dockerenv
lrwxrwxrwx 1 root root 7 Jun 24 02:02 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Apr 18 2022 boot
drwxr-xr-x 2 root root 4096 Jul 17 05:38 data
drwxr-xr-x 5 root root 360 Jul 17 05:13 dev
drwxr-xr-x 1 root root 4096 Jul 17 05:13 etc
drwxr-xr-x 2 root root 4096 Apr 18 2022 home
lrwxrwxrwx 1 root root 7 Jun 24 02:02 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Jun 24 02:02 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 Jun 24 02:02 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 Jun 24 02:02 libx32 -> usr/libx32
drwxr-xr-x 2 root root 4096 Jun 24 02:02 media
drwxr-xr-x 2 root root 4096 Jun 24 02:02 mnt
drwxr-xr-x 2 root root 4096 Jun 24 02:02 opt
dr-xr-xr-x 264 root root 0 Jul 17 05:13 proc
drwx------ 2 root root 4096 Jun 24 02:06 root
drwxr-xr-x 5 root root 4096 Jun 24 02:06 run
lrwxrwxrwx 1 root root 8 Jun 24 02:02 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Jun 24 02:02 srv
dr-xr-xr-x 13 root root 0 Jul 17 05:13 sys
drwxrwxrwt 1 root root 4096 Jul 17 04:43 tmp
drwxr-xr-x 1 root root 4096 Jun 24 02:02 usr
drwxr-xr-x 1 root root 4096 Jun 24 02:06 var
root@f308932fc051:/# cd data
root@f308932fc051:/data# ls -al
total 16
drwxr-xr-x 2 root root 4096 Jul 17 05:38 .
drwxr-xr-x 1 root root 4096 Jul 17 05:13 ..
-rw-r--r-- 1 root root 20 Jul 17 05:22 test.txt
-rw-r--r-- 1 root root 35 Jul 17 05:38 testhost.txt
root@f308932fc051:/data# cat testhost.txt
This is a test data in host system
도커 연습하면서 레파지토리, 컨테이너를 많이 생성하고 삭제해서 그런지 볼륨이 매우 많아졌다
root@ubuntu2004:/var/lib/docker/volumes# ls -al
합계 56
drwx-----x 7 root root 4096 7월 17 05:13 .
drwx--x--- 12 root root 4096 7월 14 04:11 ..
drwx-----x 3 root root 4096 7월 17 01:18 0d7505219428b713db7805f3ad36c1b2cabcad30ddb4558f0fefa90e275e05d7
brw------- 1 root root 253, 0 7월 14 04:11 backingFsBlockDev
drwx-----x 3 root root 4096 7월 17 01:27 d80856c6f445091ccd92bfb89e5cef24ac13a49041190e525c105bd1527ecc3e
drwx-----x 3 root root 4096 7월 14 04:57 e0fc2c158e1cc99bb327e54b6b83d0c6185e7cacbc560b6bda1447d9983a7d69
drwx-----x 3 root root 4096 7월 17 01:28 f0a347b06be504b8d3ea868ecd3226c0e2cf3d0e6cda54462ef190897bc31627
drwx-----x 3 root root 4096 7월 17 05:13 ffdd5012fdac3064933bbf38baa8b07ee68ca5ca27b7c3524fce3b8a05135da3
-rw------- 1 root root 32768 7월 17 05:13 metadata.db
매번 _data 디렉토리에 들어가서 데이터를 확인하기 힘드니까 필터 명령어로 확인해야겠다.
docker ps --filter volume=볼륨이름
root@ubuntu2004:/var/lib/docker/volumes# docker ps --filter volume=0d7505219428b713db7805f3ad36c1b2cabcad30ddb4558f0fefa90e275e05d7
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
현재 생성한 컨테이너가 1개이고, test.txt 파일만 있기 때문에 이에 맞는 데이터가 들어있는 볼륨 빼고 전부 삭제할 예정이다.
docker volume rm 볼륨이름
root@ubuntu2004:/var/lib/docker/volumes# docker volume rm e0fc2c158e1cc99bb327e54b6b83d0c6185e7cacbc560b6bda1447d9983a7d69
e0fc2c158e1cc99bb327e54b6b83d0c6185e7cacbc560b6bda1447d9983a7d69
궁금한 점
- 볼륨 마운트는 언제 연결해줘야 하지?
- 도커 엔진이 자동으로 연결해줘도 되나? 무슨 기준으로 연결해주지?
- 내가 수동으로 연결은 어떻게 해야 하지?