[Infra] 도커(docker)(3) 이미지 변경 후 저장(commit)

업데이트:

도커(docker)(3) 이미지 변경 후 저장(commit)

참고 링크

1. 이미지 변경하기

먼저 터미널을 열고 이미지가 무엇무엇이 있는지 알아봅시다.

(터미널1)$ sudo -i
(터미널1)# docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    1318b700e415   2 weeks ago    72.8MB
hello-world   latest    d1165f221234   5 months ago   13.3kB

‘docker image ls’ 커맨드를 이용하면 현재 호스트에 어떤 이미지가 있는지 볼 수 있습니다. 우리는 앞으로 우분투 이미지를 컨테이너로 실행시키고 내용을 바꾼후 새로운 이미지로 저장할 것입니다. 그러기 위해 먼저 우분투를 실행시키고 bash를 띄워보겠습니다. 저번 시간에 배웠듯, ‘docker run -it ubuntu bash’ 커맨드를 입력하면 우분투에 bash를 띄울수 있습니다.

(터미널1)# docker run -it ubuntu bash
(터미널1)root@1ba32c09ddb4:/#

위 결과에서 1ba32c09ddb4 는 컨테이너 ID 입니다. 터미널을 하나 더 띄워 컨테이너가 잘 돌아가는지 확인해봅시다.

(터미널2)$ sudo -i
(터미널2)# docker container ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                    PORTS     NAMES
1ba32c09ddb4   ubuntu        "bash"     3 minutes ago   Up 3 minutes                        romantic_rubin

위와 같이 우분투 컨테이너가 잘 돌아가고 있는 것을 알 수 있습니다.

다시 터미널1로 돌아갑시다. 터미널1에서 아이피 주소를 확인하고 위한 명령어 ifconfig를 입력해봅니다.

(터미널1)root@1ba32c09ddb4:/# ifconfig
bash: ifconfig: command not found

위와 같이 ifconfig가 설치되어 있지 않은 것을 볼 수 있습니다. 그럼 한번 설치해 보겠습니다.

(터미널1)root@1ba32c09ddb4:/# apt-get update && apt-get install net-tools
Get:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Get:2 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
...(중략)...
Preparing to unpack .../net-tools_1.60+git20180626.aebd88e-1ubuntu1_amd64.deb ...
Unpacking net-tools (1.60+git20180626.aebd88e-1ubuntu1) ...
Setting up net-tools (1.60+git20180626.aebd88e-1ubuntu1) ...

위 코드와 같이 ‘apt-get update && apt-get install net-tools’를 입력하면 패키지를 업데이트 하고 net-tools를 설치합니다. net-tools를 설치해야 ifconfig 명령어를 쓸수 있습니다. 그리고 ‘apt-get install net-tools’만 입력하면 설치가 안되고 그전에 반드시 ‘apt-get update’를 해줘야합니다. 설치가 완료되었으니 다시한번 ifconfig를 입력해 ip주소를 확인합니다.

(터미널1)root@1ba32c09ddb4:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 5982  bytes 19281518 (19.2 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3282  bytes 220960 (220.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1  bytes 28 (28.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1  bytes 28 (28.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

위 코드를 보면 ifconfig가 제대로 작동하는 것을 알 수 있습니다.

지금까지 한 내용을 정리하면 우분투 컨테이너를 실행하고, net-tools를 설치했습니다. 즉, 우리가 처음 열었던 우분투 이미지와 현재의 우분투 컨테이너는 다릅니다. 이렇게 달라진 새로운 우분투 이미지를 저장해 보도록 하겠습니다.

2. 변경된 이미지 저장하기

먼저 터미널2에서 실행중인 컨테이너 ID를 확인합니다. (터미널1 종료하면 안됩니다.)

(터미널2)# docker container ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                    PORTS     NAMES
1ba32c09ddb4   ubuntu        "bash"     17 minutes ago   Up 17 minutes                       romantic_rubin

변경된 이미지를 저장하는 방법은 터미널2로 이동 후 다음 커맨드를 입력합니다.

(터미널2)# docker container ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                    PORTS     NAMES
1ba32c09ddb4   ubuntu        "bash"     17 minutes ago   Up 17 minutes                       romantic_rubin

우리가 수정한 컨테이너 ID가 1ba32c09ddb4인 것을 알았습니다. 따라서 해당 컨테이너를 다른 이미지로 저장하겠습니다.

(터미널2)# docker commit 1ba32c09ddb4 my-ubuntu:0.1
sha256:55a9d44bfc792f48834355c1ac79332d485845226025fef68a3614603728cd53

위 커맨드와 같이 변경된 이미지를 저장하는 방법은 ‘docker commit 컨테이너ID 리포지터리명:태그’ 입니다. 제대로 저장되었는지 확인해봅니다.

(터미널2)# docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED              SIZE
my-ubuntu     0.1       55a9d44bfc79   About a minute ago   104MB
ubuntu        latest    1318b700e415   2 weeks ago          72.8MB
hello-world   latest    d1165f221234   5 months ago         13.3kB

위 결과를 보면 앞서 수정한 이미지가 my-ubuntu라는 이름의 리포지터리(태그는 0.1)로 제대로 저장된 것을 알 수 있습니다. 그리고 SIZE를 보면 우리가 여러가지 설치를 했기 때문에 기존 72.8MB에서 104MB로 증가된 것을 볼 수 있습니다.

3. 변경된 이미지 실행해보기

그렇다면 우리가 변경 후 저장한 my-ubuntu 이미지가 제대로 작동 되는지 확인해봅니다. 먼저 터미널1에서 기존 ubuntu 컨테이너에서 빠져나오고 my-ubuntu 이미지를 컨테이너로 실행시킵니다.

(터미널1)root@1ba32c09ddb4:/# exit
(터미널1)# exit
(터미널1)# docker run -it my-ubuntu:0.1 bash
(터미널1)root@5ed18e3e07e8:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 736 (736.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1  bytes 42 (42.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1  bytes 28 (28.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1  bytes 28 (28.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

그리고 위 코드 처럼 ifconfig 명령어가 제대로 먹히는지 확인합니다. 결과를 보면 ifconfig가 제대로 실행되는 것으로 보아 아까 우리가 수정한 이미지가 제대로 저장되어 있는 것을 알 수 있습니다.