image creating from a container

 

Dockerfile로 이미지를 빌드하는 건 해봤어요.

이번에는 컨테이너를 이미지로 만드는 걸 해볼 거예요.

 

먼저 gninx:1.14 이미지로 컨테이너를 하나 만들고 docker ps 명령으로 잘 돌아가는지 확인해요.

그리고 잘 돌아가는 걸 확인했으면 docker exec 명령으로 컨테이너에 쉘로 접속해요.

➜  ~ docker run -d --name xodwkx nginx:1.14
04f0ef3bb0e5ecc3adb949a727ad3723318038e4f337a57e59e0da23220dd603

➜  ~ docker ps 
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS     NAMES
04f0ef3bb0e5   nginx:1.14   "nginx -g 'daemon of…"   11 seconds ago   Up 10 seconds   80/tcp    xodwkx

➜  ~ docker exec -it xodwkx /bin/bash 
root@04f0ef3bb0e5:/#

 

nginx 이미지에서 nginx가 html 파일을 저장해놓은 곳으로 가서 index.html 파일을 고쳐요.

vi도 설치가 안 되어있어요. 치사해요.

 

root@04f0ef3bb0e5:/# cd /usr/share/nginx/html/
root@04f0ef3bb0e5:/usr/share/nginx/html# ls
50x.html  index.html

root@04f0ef3bb0e5:/usr/share/nginx/html# cat > index.html 
<!DOCTYPE html>
<html>
<head>
  <title>탱자 전성시대</title>
<head>
<body>
  <h1>Welcome to 탱자월드</h1>
</body>
</html>

## Ctrl + D 누르고 입력 종료

root@04f0ef3bb0e5:/usr/share/nginx/html# cat index.html 
<!DOCTYPE html>
<html>
<head>
  <title>탱자 전성시대</title>
<head>
<body>
  <h1>Welcome to 탱자월드</h1>
</body>
</html>

이제 다시 HOST로 나와서 컨테이너에서 변경한 웹페이지를 잘 보여주는지 확인해볼게요.

 

➜  ~ curl 172.17.0.2:80
<!DOCTYPE html>
<html>
<head>
  <title>탱자 전성시대</title>
<head>
<body>
  <h1>Welcome to 탱자월드</h1>
</body>
</html>%

 

잘 나오는 거 같아요. 그럼 이제 이 컨테이너를 이미지로 만들어볼게요.

➜  ~ docker container commit --author "xodwk" \
> --message "xodwk's nginx web server" \
> xodwkx xodwkx:1.0.0
sha256:897d0a366948dc80d1c41d0d2041a878893e302aeb92f773acb06d20f3b89ec9

 

그럼 이제 이미지가 잘 만들어졌는지 확인하고 그 이미지로 컨테이너를 띄워봐요.

➜  ~ docker run -d -p 8081:80 xodwkx:1.0.0
7709331ca04289ae4a26b4c29e5cd05b14efe6a4ebdc38570d9e682f014cc13b

➜  ~ docker ps 
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                   NAMES
7709331ca042   xodwkx:1.0.0   "nginx -g 'daemon of…"   17 seconds ago   Up 17 seconds   0.0.0.0:8081->80/tcp, :::8081->80/tcp   condescending_davinci
04f0ef3bb0e5   nginx:1.14     "nginx -g 'daemon of…"   16 minutes ago   Up 16 minutes   80/tcp                                  xodwkx

이번엔 -p 8081:80 옵션으로 HOST의 8081 포트로 접속하면 컨테이너의 80으로 접속할 수 있게 해 봤어요.

그럼 웹브라우저에서 확인해볼까요?

한글은 깨졌는데 그게 중요한 게 아니라 방금 만든 이미지로 만든 컨테이너에서 방금 만든 웹페이지를 서비스하고 있네요. 👍

 

 

history of an image

내가 사용하고 있는 도커 이미지에 대해 자세히 알아야 할 필요가 있다면 이렇게 해봐요.

➜  ~ docker image history xodwkx:1.0.0
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
897d0a366948   8 minutes ago   nginx -g daemon off;                            240B      xodwk's nginx web server
295c7be07902   2 years ago     /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B        
<missing>      2 years ago     /bin/sh -c #(nop)  STOPSIGNAL SIGTERM           0B        
<missing>      2 years ago     /bin/sh -c #(nop)  EXPOSE 80                    0B        
<missing>      2 years ago     /bin/sh -c ln -sf /dev/stdout /var/log/nginx…   22B       
<missing>      2 years ago     /bin/sh -c set -x  && apt-get update  && apt…   53.8MB    
<missing>      2 years ago     /bin/sh -c #(nop)  ENV NJS_VERSION=1.14.2.0.…   0B        
<missing>      2 years ago     /bin/sh -c #(nop)  ENV NGINX_VERSION=1.14.2-…   0B        
<missing>      2 years ago     /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B        
<missing>      2 years ago     /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      2 years ago     /bin/sh -c #(nop) ADD file:4fc310c0cb879c876…   55.3MB

docker image history 명령은 이미지 안에 들어있는 모든 레이어, 각 이미지 ID, 생성일, 크기 그리고 어떻게 생성되었는지를 보여줘요. 그리고 끝에 아까 --message 옵션으로 적었던 내용도 comment 항목에 들어가 있네요.

 

도커 이미지를 빌드할 때 도커 엔진은 빌드한 내역을 이미지의 metadata 안에 저장해놔요. 그리고 나중에 docker image history 명령을 실행하면 이미지 각각의 base image와 instruction을 쭉쭉 보여줘요.

 

 

removing an image

이제 도커 이미지를 지워볼 거예요. 도커 이미지를 지울 때는 docker image rm 명령을 사용해요.

한 번에 하나 혹은 여러 이미지를 지울 수 있고 이미지를 지울 때는 이미지 ID나 이름으로도 지울 수 있어요. 그런데 이미지를 지우기 전에 그 이미지를 사용해서 실행되고 있는 컨테이너는 먼저 삭제해야 돼요. 

➜  ~ docker container ls -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                   NAMES
7709331ca042   xodwkx:1.0.0   "nginx -g 'daemon of…"   21 minutes ago   Up 21 minutes   0.0.0.0:8081->80/tcp, :::8081->80/tcp   condescending_davinci
04f0ef3bb0e5   nginx:1.14     "nginx -g 'daemon of…"   37 minutes ago   Up 37 minutes   80/tcp                                  xodwkx

➜  ~ docker stop 770 04f0
770
04f0

➜  ~ docker container prune 
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
7709331ca04289ae4a26b4c29e5cd05b14efe6a4ebdc38570d9e682f014cc13b
04f0ef3bb0e5ecc3adb949a727ad3723318038e4f337a57e59e0da23220dd603

Total reclaimed space: 238B
➜  ~

정지된 컨테이너가 많은데 112 지우기 번거로우셨다구요?

걱정 마세요 이제 docker container prune 명령어만 있으면 정지된 컨테이너들은 한 번에 다 지울 수 있다구요.

 

그럼 이제 마지막으로 도커 이미지를 지워볼게요.

➜  ~ docker image rm xodwkx 
Error: No such image: xodwkx

➜  ~ docker image rm xodwkx:1.0.0
Untagged: xodwkx:1.0.0
Deleted: sha256:897d0a366948dc80d1c41d0d2041a878893e302aeb92f773acb06d20f3b89ec9
Deleted: sha256:bf48fb893431a934c370e618c7239cfa77b8913895526b0da8854ee219e516b5

다른 이미지 관련 명령들도 마찬가지지만 이미지를 지울 때는 이미지 이름만 넣어주면 안 돼요. <이미지 이름:태그>까지 같이 넣어줘야 해요.

 

 

 

exporting an image

인터넷 접속이 제한적인 곳에서 도커 레지스트리를 사용하지 못할 경우에는 어떻게 도커 이미지를 받아올 수 있을까요? 이런 경우라면 이미지를 파일로 저장해서 보낼 수 있어요.

 

nginx:1.14 버전의 도커 이미지를 mynginx.tar로 만들어볼게요.

➜  ~ docker image save --output=mynginx.tar nginx:1.14

➜  ~ ls -lh mynginx.tar 
-rw-------. 1 xodwk xodwk 108M Aug  2 23:32 mynginx.tar

 

자. 이제 그 도커가 설치된 인터넷이 안 되는 환상적인 공간에서 이 타르볼을 가지고 어떻게 도커에서 사용할 수 있는 이미지로 변환해서 로컬 레지스트리에 넣을 수 있는지 알아봐요.

 

자 여기에는 nginx:1.14 도커 이미지가 없어요. 하지만 mynginx.tar 파일은 있어요.

➜  ~ docker images 
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ubuntu       latest    1318b700e415   6 days ago     72.8MB
centos       7         8652b9f0cb4c   8 months ago   204MB

➜  ~ ls -lh mynginx.tar 
-rw-------. 1 xodwk xodwk 108M Aug  2 23:32 mynginx.tar

이제 docker image load 명령으로 타르볼 파일을 가지고 이미지를 복원하는 걸 알아볼게요.

➜  ~ docker image load -i mynginx.tar
5dacd731af1b: Loading layer [==================================================>]  58.45MB/58.45MB
b8f18c3b860b: Loading layer [==================================================>]  54.38MB/54.38MB
82ae01d5004e: Loading layer [==================================================>]  3.584kB/3.584kB
Loaded image: nginx:1.14

➜  ~ docker images 
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ubuntu       latest    1318b700e415   6 days ago     72.8MB
centos       7         8652b9f0cb4c   8 months ago   204MB
nginx        1.14      295c7be07902   2 years ago    109MB

딱. nginx:1.14 도커 이미지가 로컬 레지스트리에 들어왔네요. 

이제 폐쇄망과 같이 인터넷 접속이 제한적인 곳에서도 도커 이미지 파일을 활용할 수 있겠네요.

 

끝!