🌱 Infra/Container_Docker

[Docker-Basic (8)] Container Image 관리하기

mini_world 2020. 9. 28. 17:19
목차 접기

이번포스팅에서는 이미지에 대한 기본 내용을 다루겠습니다.


 

시작하기전에, 모든 도커 이미지와 컨테이너를 삭제하겠습니다. 헷갈릴수있으니까요!

먼저 컨테이너 전체 삭제!

[root@docker-master /]# docker rm -f $(docker ps -aq)
2bf8c98f110d

그다음 이미지도 모두 삭제하겠습니다!

[root@docker-master /]# docker rmi -f $(docker images -q)
Untagged: registry:2
Untagged: registry@sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Deleted: sha256:2d4f4b5309b1e41b4f83ae59b44df6d673ef44433c734b14c1c103ebca82c116
Deleted: sha256:36a83751a1193f6edf65d21f62fe7988394d562d71904ee20cb4aa72f14148bd
Deleted: sha256:c2588dfa0db64031c1c0683ed59a00ad0943889efb819bffd0455ae9b232016c
Deleted: sha256:6eb97e254200a2d82064e63977f84626e376256fe4d4c033a8b7817b2950071d
Deleted: sha256:7c6634cc9948baef3600559e298228a962bd9499cbbaf840d4d4889f5abaca2a
Deleted: sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a

 


 

이번 실습에서는 Image에 대한 내용을 다룰 예정입니다.
본격적으로 시작하기 전에 Docker Folw을 간략히 살펴볼게요 :)

출처 : https://sh-tsang.medium.com/docker-tutorial-4-exporting-container-and-saving-image-c3a7d792cfb6

 

 

1. Docker Image Pull : 이미지 다운로드

docker pull 명령어로 쉽게  도커 이미지를 외부 저장소에서 다운로드 합니다. 

[root@docker-master /]# docker pull centos/httpd-24-centos7
Using default tag: latest
latest: Pulling from centos/httpd-24-centos7
75f829a71a1c: Pull complete
e2c4942f4189: Pull complete
f1498894b11c: Pull complete
da56c9694723: Pull complete
063ff8a1435c: Pull complete
09351523c1de: Pull complete
9a03c4ed0deb: Pull complete
17f560ff6bfd: Pull complete
Digest: sha256:df111e9031b838fa9b5c120b07cba0f23188a539e9be91e020b0a9f77d65ec9e
Status: Downloaded newer image for centos/httpd-24-centos7:latest
docker.io/centos/httpd-24-centos7:latest

이미지가 잘 저장되었는지 확인합니다.

[root@docker-master /]# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
centos/httpd-24-centos7   latest              24aec7b98d6b        3 days ago          344MB

 

 

2. Docker Image로 컨테이너 생성 및 확인

위에서 다운받은 이미지로 컨테이너를 실행시키겠습니다.

[root@docker-master /]# docker run --name httpd -d -p 8180:8080 centos/httpd-24-centos7
dc1351b75b8d9f63e0444f2a5e74f7f08f55011a593abd4108d24cad74419494

잘 실행중인지 확인합니다.

[root@docker-master /]# docker container ls
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                              NAMES
dc1351b75b8d        centos/httpd-24-centos7   "container-entrypoin…"   5 seconds ago       Up 4 seconds        8443/tcp, 0.0.0.0:8180->8080/tcp   httpd

 

 

3. 컨테이너를 이미지로 저장 : Docker Commit

commit 은 컨테이너를 이미지로 저장하는 명령어 입니다. :)
이번 단계에서는 현재 실행중인 컨테이너를 수정하고, commit 하여 새로운 버전의 컨테이너를 생성해보도록 하겠습니다.

자, 컨테이너 목록을 확인하고 위에서 실행한 컨테이너에 접속합니다.

[root@docker-master /]# docker container ls
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                              NAMES
dc1351b75b8d        centos/httpd-24-centos7   "container-entrypoin…"   4 minutes ago       Up 4 minutes        8443/tcp, 0.0.0.0:8180->8080/tcp   httpd

[root@docker-master /]# docker container exec -it httpd /bin/bash

index.html 파일을 생성합니다. :)
이제, 이 컨테이너는 This is Docker Test 라는 index.html을 반환하게 됩니다.

bash-4.2$ echo 'This is Docker Test' > /var/www/html/index.html
bash-4.2$ exit
exit

자, 이제 컨테이너를 중지하고, 커밋합니다.

* docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a = 작성자 지정
-m = 메시지 지정 
[root@docker-master /]# docker container stop httpd
httpd

[root@docker-master /]# docker container commit -a 'mini' -m 'Add Index.html' httpd
sha256:d6422173cd696f5f2b3750cb7025d8962ea9a7ff493a55466b0058c1100884c4

이미지를 확인합니다. None 이라는 태그를 가진 이미지가 생성되었네요 :)

[root@docker-master /]# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
<none>                    <none>              d6422173cd69        6 seconds ago       344MB
centos/httpd-24-centos7   latest              24aec7b98d6b        3 days ago          344MB

 

 

4. Docker Image 태그

이미지에 태그를 달아야 합니다.

[root@docker-master /]# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
<none>                    <none>              d6422173cd69        6 seconds ago       344MB
centos/httpd-24-centos7   latest              24aec7b98d6b        3 days ago          344MB

docker image tag 명령어를 통해 이미지에 태그를 달아줍니다 :)

* docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] 

이후에 이미지를 확인해보면, 태그가 정상적으로 설정된것을 볼 수 있습니다.

[root@docker-master /]# docker image tag 24aec7b98d6b 1mini2/myrepo:addIndex_v1

[root@docker-master /]# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
1mini2/myrepo             addIndex_v1         24aec7b98d6b        3 days ago          344MB
centos/httpd-24-centos7   latest              24aec7b98d6b        3 days ago          344MB

 

 

5. Docker registry에 Push/Pull 하기 (도커 허브 사용)

도커  허브에 접속하시고, 레포지토리를 생성합니다.
이 단계에서는 별도로 안내하지 않습니다 :)

docker login 명령어를 사용하여 도커 허브에 로그인 합니다.

[root@docker-master /]# docker login --username 1mini2

Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

이제, 이 이미지를 도커 허브 레포지토리로 Push합니다.

[root@docker-master /]# docker image push 1mini2/myrepo:addIndex_v1

The push refers to repository [docker.io/1mini2/myrepo]
c6c197ea251d: Mounted from centos/httpd-24-centos7
be00ea727b88: Mounted from centos/httpd-24-centos7
4973b9e35e84: Mounted from centos/httpd-24-centos7
f4626fba958f: Mounted from centos/httpd-24-centos7
a317a6aa16e0: Mounted from centos/httpd-24-centos7
7da7d3716181: Mounted from centos/httpd-24-centos7
0b0618c6ced8: Mounted from centos/httpd-24-centos7
613be09ab3c0: Mounted from centos/httpd-24-centos7 

도커 허브 접속 시 업로드된 이미지 확인 가능합니다.

이제 이 이미지를 다운로드 받아보겠습니다.

[root@docker-master /]# docker rmi -f $(docker images -q)
Untagged: 1mini2/myrepo:addIndex_v1
Untagged: 1mini2/myrepo@sha256:df111e9031b838fa9b5c120b07cba0f23188a539e9be91e020b0a9f77d65ec9e
Deleted: sha256:24aec7b98d6bc27d1a9af66958328cf4193c6f29b770b3005da1ae00baa13e61

도커 이미지 목록을 확인하겠습니다. 아무것도 없습니다.

[root@docker-master /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker pull 명령어를 사용하여 도커 허브에 업로드해두었던 이미지를 다운받습니다.

[root@docker-master /]# docker pull 1mini2/myrepo:addIndex_v1
addIndex_v1: Pulling from 1mini2/myrepo
75f829a71a1c: Already exists
e2c4942f4189: Already exists
f1498894b11c: Already exists
da56c9694723: Already exists
063ff8a1435c: Already exists
09351523c1de: Already exists
9a03c4ed0deb: Already exists
17f560ff6bfd: Already exists
Digest: sha256:df111e9031b838fa9b5c120b07cba0f23188a539e9be91e020b0a9f77d65ec9e
Status: Downloaded newer image for 1mini2/myrepo:addIndex_v1
docker.io/1mini2/myrepo:addIndex_v1

도커 이미지를 확인합니다.

[root@docker-master /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
1mini2/myrepo       addIndex_v1         24aec7b98d6b        3 days ago          344MB

 

 

6. Docker 이미지 저장(save) 및 사용 (load)

도커 컨테이너는 tar파일로 저장이 가능하며, 이렇게 tar로 저장하여 보관하고 다시 로드하여 사용할 수 있습니다.

헷갈리지 않게 먼저 디렉터리를 하나 만들고 그 안에서 작업하도록 하겠습니다.

[root@docker-master /]# mkdir /docker_images && cd docker_images/

도커 이미지 목록을 확인해봅니다.

[root@docker-master docker_images]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
1mini2/myrepo       addIndex_v1         24aec7b98d6b        3 days ago          344MB

도커 이미지를 tar파일로 저장합니다.

* 명령어 : docker save [OPTIONS] IMAGE [IMAGE...]
[root@docker-master docker_images]# docker save -o myweb.tar 1mini2/myrepo:addIndex_v1

저장이 잘 되었는지 확인합니다.
잘 저장 되었네요 :)

[root@docker-master docker_images]# ls -al
합계 348232
drwxr-xr-x.  2 root root        23  9월 29 02:44 .
dr-xr-xr-x. 18 root root       262  9월 29 02:44 ..
-rw-------.  1 root root 356587008  9월 29 02:44 myweb.tar

자 이제 이 tar파일을 다시 이미지로 가져올 예정인데, 그 실습을 진행하기 전에!
도커 이미지를 전체 삭제해줍니다. 헷갈릴 수 있으니까요.

[root@docker-master docker_images]# docker rmi -f $(docker images -q)
Untagged: 1mini2/myrepo:addIndex_v1
Untagged: 1mini2/myrepo@sha256:df111e9031b838fa9b5c120b07cba0f23188a539e9be91e020b0a9f77d65ec9e
Deleted: sha256:24aec7b98d6bc27d1a9af66958328cf4193c6f29b770b3005da1ae00baa13e61

[root@docker-master docker_images]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

자, 이제 docker load 명령어를 사용하여 tar파일을 이미지로 로드합니다.

[root@docker-master docker_images]# docker load -i ./myweb.tar
Loaded image: 1mini2/myrepo:addIndex_v1

잘 로드 되었는지 확인해봅니다.

[root@docker-master docker_images]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
1mini2/myrepo       addIndex_v1         24aec7b98d6b        3 days ago          344MB

 

 

7. Docker 이미지 & 컨테이너 삭제

모든 테스트가 마무리 되었습니다 :)
컨테이너를 정리해봅시다.
도커 이미지와 컨테이너를 확인합니다.

[root@docker-master /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
1mini2/myrepo       addIndex_v1         24aec7b98d6b        3 days ago          344MB

[root@docker-master /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
dc1351b75b8d        24aec7b98d6b        "container-entrypoin…"   28 minutes ago      Exited (0) 23 minutes ago                       httpd

도커 이미지 전체 삭제를 docker rmi -f $(docker images) 명령어를 통해 진행합니다.

[root@docker-master /]# docker rmi -f $(docker images)
Untagged: 1mini2/myrepo:addIndex_v1
Deleted: sha256:24aec7b98d6bc27d1a9af66958328cf4193c6f29b770b3005da1ae00baa13e61

도커 컨테이너 전체 삭제를 docker rm -f $(docker ps -aq) 명령어를 통해 진행합니다.

[root@docker-master /]# docker rm -f $(docker ps -aq)
dc1351b75b8d

컨테이너와 이미지가 잘 삭제되었는지 확인합니다 :)

[root@docker-master /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

[root@docker-master /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

 

728x90