Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-19 10:17
관리 메뉴

nomad-programmer

[DevOps/Docker] 이미지 생성 (commit, export, import, save, load) & docker system prune 본문

DevOps/Docker

[DevOps/Docker] 이미지 생성 (commit, export, import, save, load) & docker system prune

scii 2020. 11. 28. 20:36

Docker 컨테이너는 Docker 이미지를 바탕으로 작성하지만 반대로 Docker 컨테이너를 바탕으로 Docker Image를 작성할 수도 있다. 예를 들어 저장소에서 취득한 공식 이미지를 바탕으로 컨테이너를 만들고 환경에 맞도록 설정을 변경한 컨테이너로부터 다시 이미지를 만들 수가 있다.

컨테이너로부터 이미지 작성 (docker container commit)

컨테이너로부터 이미지를 작성하려면 docker container commit 명령을 사용한다. 

docker container commit [옵션] <컨테이너 식별자> [이미지명[:태그명]]

지정할 수 있는 주요 옵션

옵션 설명
--author, -a 작성자 지정 (ex: scii<example@gmail.com>)
--message, -m 메시지 지정
--change, -c commit 시, Dockerfile 명령 지정
--pause, -p 컨테이너를 일시 정지하고 commit

예를 들어 webserver라는 이름의 컨테이너를 scii/webfront 라는 이름으로 태그명을 1.0으로 지정하여 새로운 이미지를 작성하는 경우 다음 명령을 실행한다.

$ docker container commit -a "scii" -m "test comment" webserver scii/webfront:1.0

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
scii/webfront       1.0                 f436b1628e93        4 seconds ago       133MB

독자적으로 작성한 이미지는 Docker Hub 등에서 공개할 것도 고려하여 작성자나 commit 메시지를 붙여두는 것이 좋다.

설정한 작성자 정보는 docker image inspect 명령으로 확인할 수 있다.

// 이미지 상제 정보 확인
$ docker image inspect scii/webfront:1.0

[
  {
    "Id": "sha256:",
    "RepoTags": [
      "scii/webfront:1.0"
    ],
    "Comment": "test comment",

컨테이너를 tar 파일로 출력 (docker container export)

Docker 에서는 가동 중인 컨테이너의 디렉토리/파일들을 모아서 tar 파일을 만들 수 있다. 이 tar 파일을 바탕으로 하여 다른 서버에서 컨테이너를 가동시킬 수 있다.

tar 파일의 작성에는 docker container export 명령을 사용한다. 

docker container export <컨테이너 식별자>

예를 들어 webserver라는 컨테이너를 latest.tar 라는 tar 파일로 출력하는 경우 다음의 명령을 실행한다.

$ docker container export webserver > latest.tar

생성된 tar 파일의 내용을 확인하면 컨테이너를 작동시키기 위해 필요한 파일을 확인할 수 있다.

// 생성된 tar 파일의 상세 정보 확인
$ tar -tf latest.tar

tar 파일로부터 이미지 작성 (docker image import)

docker image import 명령을 사용하면 Linux OS 이미지의 디렉토리/파일로부터 Docker 이미지를 만들 수 있다.

docker image import <파일 또는 URL> | - [이미지명[:태그명]]

압축된 디렉토리나 파일도 취급할 수 있다. 하지만 docker image import 명령에서 지정할 수 있는 파일은 하나뿐이므로 tar 명령 등으로 디렉토리나 파일을 모아놓기 바란다. 

root 권한으로실행하지 않으면 액세스 권한이 없는 파일이 포함되지 않는 경우가 발생하므로 주의해야 한다.

docker image import 명령으로 지정할 수 있는 아카이브 파일은 다음과 같다.

  • tar
  • tar.gz
  • tgz
  • bzip
  • tar.xz
  • txz

예를 들어 latest.tar로 모아놓은 디렉토리나 파일을 바탕으로 scii/webfront 라는 이름의 태그명이 1.1인 이미지를 작성할 때는 다음의 명령을 실행한다.

// 이미지 작성
$ cat latest.tar | docker image import - scii/webfront:1.1

// 혹은 직접적으로 명령을 적는다.
docker image import ./latest.tar scii/webfront:1.1
// 이미지 확인
$ docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
scii/webfront       1.1                 bdcc7700aa53        14 seconds ago      132MB

이미지 저장 (docker image save)

docker image save 명령을 사용하면 Docker 이미지를 tar 파일로 저장할 수 있다.

docker image save [옵션] <저장 파일명> [이미지명]

예를 들어 tensorflow라는 이름의 이미지를 export.tar에 저장하려면 다음의 명령을 실행한다. 저장할 파일명은 -o 옵션으로 지정한다.

// 이미지 저장
$ docker image save -o export.tar tensorflow

이미지 읽어 들이기 (docker image load)

docker image load 명령을 사용하면 tar 이미지로부터 이미지를 읽어 들일 수 있다. 

docker image load [옵션]

예를 들어 export.tar 라는 이름의 이미지를 읽어 들이려면 다음의 명령을 실행한다. 읽어 들일 파일명은 -i 옵션으로 지정한다.

// 이미지 읽어 들이기
$ docker image load -i export.tar

export/import 와 save/load 의 차이

컨테이너를 export하면 컨테이너를 작동시키는 데 필요한 파일을 모두 압축 아카이브로 모을 수 있다. 그래서 이 tar 파일을 풀면 컨테이너의 루트 파일 시스템을 그대로 추출할 수 있다.
docker container export 명령을 사용한 파일을 전개하면 아래와 같다.

tar -tf export.tar

.dockerenv
bin/
bin/bash
bin/cat
bin/chgrp
bin/chmod
bin/chown
...

한편 이미지를 save하면 이미지의 레이어 구조도 포함된 형태로 압축 아카이브로 모을 수 있다. 마찬가지로 Nginx의 공식 이미지인 'nginx'를 docker image save 명령으로 save.tar라는 이름으로 모운다. 이것을 tar 명령으로 전개하여 내용을 확인하면 다음과 같다.

$ tar -tf export.tar

2a515cead8b435b9c8673c302c61f65d6a046d2998e553e69a9387833805f833/
2a515cead8b435b9c8673c302c61f65d6a046d2998e553e69a9387833805f833/VERSION
2a515cead8b435b9c8673c302c61f65d6a046d2998e553e69a9387833805f833/json
2a515cead8b435b9c8673c302c61f65d6a046d2998e553e69a9387833805f833/layer.tar
...

이와 같이 바탕이 되는 이미지는 똑같아도 docker container export 명령과 docker image save 명령은 내부적인 디렉토리와 파일 구조가 다르다.

그래서 압축 아카이브에서는 docker container export 명령으로 작성한 것을 읽어 들일 때 docker image import 명령을, docker image save 명령으로 생성한 것을 읽어 들일 때는 docker image load 명령을 사용하는 것이다.


불필요한 이미지/컨테이너 일괄 삭제 (docker system prune)

docker sysmtem prune 명령을 사용하면 사용하지 않는 이미지, 컨테이너, 볼륨, 네트워크를 일괄적으로 삭제할 수 있다. 

docker system prune [옵션]

지정할 수 있는 주요 옵션

옵션 설명
--all, -a 사용하지 않는 리소스를 모두 삭제
--force, -f 강제적으로 삭제

예를 들어 다음의 명령을 실행하면 사용하지 않는 리소스를 모두 삭제할 수 있기 때문에 쓸 데 없는 디스크 영역 낭비를 줄일 수 있다.

// 불필요한 리소스 삭제
$ docker system prune -a

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
e56194feabcec3e940374cbeed81acd243d0614770b6f0733f2347966fb49ed6
78d3cd2aaf1f89c2ab1624e673e48707e6e41c07a2ebca6ae90af3d0661fd344
e6d7e7594e663941451dbb680f58f16425aa7df85bd3a674521bd87383325fce

Deleted Images:
untagged: scii/webfront:1.1
deleted: sha256:bdcc7700aa5316a9c4fddb0cbd1b4b910263c18839c07e7105677c46a249f39f
deleted: sha256:2049a5c7b23caf3c2a2baa23d3461c6f9e22f0fff1fb55429b8ac2fc2fe49d79
untagged: centos:7
untagged: centos@sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
deleted: sha256:8652b9f0cb4c0599575e5a003f5906876e10c1ceb2ab9fe1786712dac14a50cf
deleted: sha256:174f5685490326fc0a1c0f5570b8663732189b327007e47ff13d2ca59673db02
untagged: nginx:latest
untagged: nginx@sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3
deleted: sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c
deleted: sha256:a6862ade3b91fdde2aa8a3d77fdcc95b1eb6c606be079c11b7f97f249d0e731d
deleted: sha256:32bcbe3740b68d0625744e774b404140366c0c4a2b2eadf32280d66ba001b4fb
deleted: sha256:2dc5e43f496e41a18c016904b6665454a53be22eb4dcc1b468d864b4e2d1f311
deleted: sha256:5fe6a7c579cd9fbcfa604810974c4c0c16893f4c40bc801545607ebd0accea74
deleted: sha256:f5600c6330da7bb112776ba067a32a9c20842d6ecc8ee3289f1a713b644092f8
untagged: ubuntu:latest
deleted: sha256:f643c72bc25212974c16f3348b3a898b1ec1eb13ec1539e10a103e6e217eb2f1
deleted: sha256:9386795d450ce06c6819c8bc5eff8daa71d47ccb9f9fb8d49fe1ccfb5fb3edbe
deleted: sha256:3779241fda7b1caf03964626c3503e930f2f19a5ffaba6f4b4ad21fd38df3b6b
deleted: sha256:bacd3af13903e13a43fe87b6944acd1ff21024132aad6e74b4452d984fb1a99a

Total reclaimed space: 541.6MB

인카토스https://incatos.shop 라는 회사에서 고맙게도 제품 하나를 협찬해주셨습니다. 그것은 바로 Docker 컨테이너 각 티슈 케이스입니다.

제품이 도착하여 조립해보니 너무 앙증맞고 귀여운 제품입니다. docker가 큼지막하게 쓰여져 있고, 색상 또한 흰색이라 정말 깔끔합니다.
무엇보다 조립 형식인데 견고하니 아주 마음에 듭니다.

책상에 올려 놓고 개발 공부를 하니 더 잘 되는? 기분입니다 :) 
개발할 때 커피를 마시면서 하고 있는데 종종 커피를 흘릴때도 있고, 커피 잔에서 흐르는 물방울로 인하여 책상에는 항상 두루마리 화장지를 두는데요. 이제는 도커가 쓰여져있는 티슈를 책상에 올려 놓으면 되겠네요. 
개발자의 책상에 이러한 아이템이 있으니 뭔가 더 개발자의 책상같은 기분입니다.

다시 한 번 좋은 제품 협찬해주신 인카토스에 감사 인사를 전합니다 :)

* 도커 컨테이너 제품 : https://incatos.shop

 

인카토스

인카토스 쇼핑몰 | Outerwear, Tops, Dresses, Bottoms, Accessories

incatos.shop

Comments