Docker 튜토리얼

Jieun Yang·2023년 7월 17일

Docker

목록 보기
3/3

참고한 글 https://domdom.tistory.com/590


이미지 다운로드

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

컨테이너 create, start 동시에 구동

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 명령어로 nginx 페이지 호출 확인

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>

grep 필터링

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 + q

docker 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

파이썬 설치 완료

변경된 컨테이너를 이미지로 저장하고 docker hub에 내 이미지 올리기

  1. Ctrl+p+q 컨테이너 빠져나오기
  2. commit
  3. push
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 확인해줬다

ps, images 차이점

docker ps와 docker images 두 명령어는 Docker에서 사용하는 두 가지 서로 다른 유형의 객체, 즉 컨테이너와 이미지에 관한 정보를 제공합니다.

docker ps

실행 중인 인스턴스 (컨테이너)
현재 실행 중인 Docker 컨테이너의 목록을 표시합니다. 여기에는 컨테이너 ID, 사용 중인 이미지, 컨테이너가 시작된 시간, 컨테이너의 상태 (예: 실행 중, 중지됨 등), 포트 매핑 정보, 컨테이너의 이름 등이 포함됩니다.

docker images

사용 가능한 템플릿 (이미지)
시스템에 있는 모든 Docker 이미지의 목록을 표시합니다. 여기에는 이미지의 리포지토리 이름, 태그, 이미지 ID, 생성된 시간, 크기 등이 포함됩니다.

이미지

응용 프로그램을 실행하는 데 필요한 모든 파일과 설정을 포함하는 템플릿입니다.

컨테이너

이러한 이미지를 기반으로 실행된 인스턴스입니다. 즉, 이미지는 클래스와 같고 컨테이너는 그 클래스의 인스턴스라고 생각할 수 있습니다.


모든 컨테이너 구동 중지 및 삭제

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

모든 이미지 삭제

docker rmi $(docker images -q

Docker 볼륨

도커 컨테이너는 컨테이너 삭제 시 컨테이너 내부에 있는 데이터도 함께 사라집니다.
이 데이터를 보존하기 위해서 도커볼륨을 사용합니다.
도커 내 데이터 디렉토리를 호스트 디렉토리와 공유하며 연결해놓는 것입니다.
컨테이너 생성 시 -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 디렉토리 생성됨!

1) docker 컨테이너에서 데이터 생성하기

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

2) 호스트 시스템에서 데이터 생성하기

<볼륨이름>/_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  717 05:38 .
drwx-----x 3 root root 4096  717 05:13 ..
-rw-r--r-- 1 root root   20  717 05:22 test.txt
-rw-r--r-- 1 root root   35  717 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  717 05:13 .
drwx--x--- 12 root root   4096  714 04:11 ..
drwx-----x  3 root root   4096  717 01:18 0d7505219428b713db7805f3ad36c1b2cabcad30ddb4558f0fefa90e275e05d7
brw-------  1 root root 253, 0  714 04:11 backingFsBlockDev
drwx-----x  3 root root   4096  717 01:27 d80856c6f445091ccd92bfb89e5cef24ac13a49041190e525c105bd1527ecc3e
drwx-----x  3 root root   4096  714 04:57 e0fc2c158e1cc99bb327e54b6b83d0c6185e7cacbc560b6bda1447d9983a7d69
drwx-----x  3 root root   4096  717 01:28 f0a347b06be504b8d3ea868ecd3226c0e2cf3d0e6cda54462ef190897bc31627
drwx-----x  3 root root   4096  717 05:13 ffdd5012fdac3064933bbf38baa8b07ee68ca5ca27b7c3524fce3b8a05135da3
-rw-------  1 root root  32768  717 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




궁금한 점

  1. 볼륨 마운트는 언제 연결해줘야 하지?
  2. 도커 엔진이 자동으로 연결해줘도 되나? 무슨 기준으로 연결해주지?
  3. 내가 수동으로 연결은 어떻게 해야 하지?

0개의 댓글