Docker Image 추출

 

·         Version : Docker

 

지난 포스트에 docker commit 명령을 사용하여 이미지를 생성한 다음 docker hub 사용하여 이미지를 공유하는 방법에 대해서 다루었다.

·         도커 이미지 생성 : http://sqlmvp.kr/221461385385

 

이번 포스트에서는 이미지 파일을 단일 바이너리 파일로 저장하는 방법과 저장된 이미지 파일을 로드 하는 방법에 대해서 살펴본다.

 

 이미지를 파일로 추출하는 명령은 docker save이다. 명령을 사용하면 이미지의 모든 메타 데이터를 포함하는 하나의 파일로 추출할 있다.

docker save [option] image [image]

docker save busybox > busybokx.tar

docker save --output busybox.tar busybox 

docker save -0 fedora-latest.tar fedora:latest

·         --output, -o : STDOUT 대신 파일에 쓰기

 


추출된 이미지는 docker load 명령으로 도커에 다시 로드할 있다. 이미지를 로드하면 이전의 이미지와 동일한 이미지가 도커 엔진에 생성된다.

docker load [OPTION]

docker load < busybox.tar

docker load --input fefora.tar

·         --input, -i : STDIN 대신  tar 아카이브 파일에서 읽기

·         --quiet, -q : 부하 출력 억제

 

 

docker save, load 비슷한 기능을 하는 명령으로 docker export, import 있다.

export 명령은 컨테이너의 파일 시스템을 tar 파일로 추출하고 import 추출된 파일을 이미지로 다시 저장한다. export 명령은 컨테이너와 연관된 볼륨의 내용을 내보내지는 않는다. 볼륨이 컨테이너의 기존 디렉터리 위에 마운트 되면 docker export 볼륨의 내용이 아닌 기본 디렉토리의 내용을 내보낸다.

docker export [OPTIONS] CONTAINER

docker export red_panda > latest.tar

docker export –output=”latest.tar” red_panda

·         --output, -o : SDTOUT대신 파일에 쓰기

 

Import 명령을 사용할 STDIN에서 직접 데이터를 가져오기 위해 URL또는 –(대시) 지정할 있다. URL 파일 시스템이나  Docker 호스트의 개별 파일(.tar, .tar.gz, .tgz, .bˆp, .tar.xz, .txz) 포함하는 아카이브를 가리킬 있다. 아카이브를 지정하면  Docker 컨테이너에서 /(root) 기준으로 아카이브에 압축 해제 한다. 개별 파일을 지정하는 경우 호스트 전체 경로를 지정해야 한다. 원격에서 가져오려면 http://또는 https:// 시작하는 URL프로토콜을 사용한다.

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

docker import http://example.com/exampleimage.tgz

docker import /path/to/exampleimage.tgz

·         --change, -c : 생성된 이미지에 dockerfile 적용

·         --message, -m : 가져온 이미지에 커밋 메시지 설정

·         --platform : 서버가 멀티 플랫폼 가능하면 플랫폼 설정

 

 

 

[참고자료]

·         docker save : https://docs.docker.com/engine/reference/commandline/save/

·         docker load : https://docs.docker.com/engine/reference/commandline/load/

·         docker export : https://docs.docker.com/engine/reference/commandline/export/

·         docker import : https://docs.docker.com/engine/reference/commandline/import/

 

 

 

2019-02-11 / Sungwook Kang / http://sqlmvp.kr

 

Docker, 이미지 추출, docke save, docker load, docker import, docker export, 도커 로드

Docker Image 생성 docker hub 이미지 업로드

 

·         Version : Docker

 

컨테이너는 기본적으로 이미지를 사용하여 생성하며, 컨테이너 생성 사용자 변경 부분에 대해서는 필요에 따라 새로운 이미지를 만들어서 배포하거나 재사용하기도 한다. 이번 포스트에서는 docker hub에서 이미지를 다운로드 (Pull), 업로드(push) 이미지를 생성(commit)하는 방법에 대해서 알아본다.

 

도커는 기본적으로 docker hub(https://hub.docker.com/)라는 중앙 이미지 저장소에서 이미지를 내려 받는다. 아래 그림처럼 docker hub 도커가 공식적으로 제공하는 이미지 저장소로 누구나 가입 이미지를 내려 받을 있다. 또한 사용자 이미지를 도커 허브에 업로드하여 다른 사람과 공유할 있다.

[출처]  https://www.itzgeek.com/how-tos/linux/working-with-docker-images-building-docker-images.html

 

사용자가 docker create, docker run, docker pull 명령을 실행하면 로컬에 해당 이미지가 없을 경우 docker hub에서 해당 이미지를 검색하여 다운로드 받는다. 대부분의 이미지가 공식적으로 제공되어 있기 때문에 직접 이미지를 만들어 사용하지 않아도 되므로 빠르고 편리하게 개발 운영 환경을 구축 있다. 아래 명령어는 docker hub 이미지가 있는지 확인하는 명령어로 공식 이미지의 경우 “OFFICIAL” 라벨이 부여되어 있으며 “STARS” 해당 이미지가 사용자로부터 얼마나 즐겨찾기가 되었는지를 나타낸다.

docker search nginx

 

 

docker hub 부터 이미지를 다운로드 받으려면 pull 명령을 사용한다.

docker pull nginx

 



베이스 이미지로부터 컨테이너를 생성하고 사용자가 변경 사항을 만들었다면 docker commit 명령을 사용하여 현재 컨테이너를 이미지로 만들 있다. 아무런 옵션을 사용하지 않으면 태그는 자동적으로 “latest” 설정된다. -a 옵션은 작성자를 나타내며, -m 커밋 메시지를 작성한다. 아래 스크립트는 nginx 라는 컨테이너를 nginx_sqlmvp:first 이미지를 생성한다.

docker commit nginx nginx_custom

docker commit -a "sqlmvp" -m "my image" nginx nginx-sqlmvp:first

 

 

로컬에서 생성된 이미지를 공유하려면 리포지토리가 있어야 한다. Docker hub 누구나 가입해서 무료로 리포지토리를 사용할 있다. 무료 계정의 경우 리포지토리가 퍼블릭이며, 유료로 사용할 경우 프라이빗 리포지토리를 이용할 있다. 또한 docker hub외에 프라이빗 리포지토리를 구축해서 사용할 있다. 아래 스크립트는 docker hub 로컬의 이미지를 업로드(push)한다. docker hub 업로드하기 전에 이미지에 리포지토리와 태그를 만들어야 한다.

Syntax : docker tag image username/repository:tag

Ex) docker tag nginx_sqlmvp:first sqlmvp/nginx-sqlmvp:first

 

 

Syntax : docker push username/repository:tag

Ex) docker push sqlmvp/nginx-sqlmvp:first

 

 

 

 

 

[참고자료]

·         docker commit : https://docs.docker.com/engine/reference/commandline/commit/

·         docker pull : https://docs.docker.com/engine/reference/commandline/pull/

·         docker push : https://docs.docker.com/engine/reference/commandline/push/

 

 

 

2019-02-08 / Sungwook Kang / http://sqlmvp.kr

 

Docker, 이미지 생성, docker commit, docker push, docker tag, 도커 허브, 도커 커밋

Docker Container 리소스 제한

-         CPU, Memory, Disk I/O 리소스 사용량 설정

 

·         Version : Docker

 

컨테이너를 생성할 다양한 옵션으로 컨테이너 리소스 사용량을 조절할 있다. 아무런 옵션을 입력하지 않으면 기본적으로 호스트의 모든 리소스를 제한없이 사용할 있게 되어, 여러 컨테이너 실행 리소스 사용의 불균형이 발생할 수도 있다.

 

이번 포스트에서는 시스템 리소스(CPU, MEMORY, Disk I/O) 컨테이너 실행시 설정하거나 이미 운영중인 컨테이너에서 리소스를 수정하는 방법에 대해서 살펴 본다.

 

현재 컨테이너에 설정된 리소스를 확인하는 방법은 docker inspect 명령을 사용한다. docker inspect 많은 항목을 나타내는데 “HostConfig” 항목에서 리소스를 확인할 있다.

docker inspect nginx

 

 

[메모리 제한]

메모리는 m(Megabyte), g(Gigabyte) 단위로 설정 있으며 최소 메모리는 4MB이다. 컨테이너 내부에서 동작하는 프로세스가 컨테이너에 할당된 메모리를 초과하면 컨테이너는 자동으로 종료되므로 적절한 메모리를 설정해야한다. 아래 스크립트는 컨테이너 실행 메모리를 1 GB 제한한다.

docker run -d –name nginx1g --memory=1g nginx

 

컨테이너가 실행되었으면 해다 컨테이너의 메모리를 확인한다. docker inspect 많은 정보를 나타내므로 grep 명령어를 함께 사용하여 Memory 부분만 표시하였다.

docker inspect nginx1g | grep "Memory"

 

 

컨테이너의 swap메모리는 기본적으로 설정된 메모리의 2배로 설정되지만 별도로 설정할 있다. 아래 스크립트는 swap메모리를 4GB 설정한다.

docker run -d –name nginx1g --memory=1g --memory-swap=4g nginx

 

 

[CPU제한]

컨테이너 CPU 전체 CPU 사용량에서 리소스 할당을 설정한다. , 가상머신의 경우 특정 갯수의 CPU 할당 받지만 컨테이너의 경우 전체 사용량에서 얼마나 사용할지를 결정한다. 또한 CPU 사용하는 다양한 옵션이 있다.

·         --cpu-shares : 기본값은 1024 CPU 할당에서는 1 뜻한다. 2048 설정할 경우 기본 컨테이너보다 2 많은 시간을 할당 받을 있다.

docker run -d –name nginx --cpu-share=2048 nginx

 

·         --cpuset-cpus : 호스트에 여러개의 CPU 있을 컨테이너가 특정 CPU 사용하도록 설정한다. 아래 스크립트는 컨테이너가 3번째 CPU 사용하도록 설정한다.

#3번째 CPU 사용

docker run -d –name nginx --cpuset-cpus=2

 

#1, 4 번째 CPU 사용

docker run -d –name nginx --cpuset-cpus=”0,3”

 

#1,2,3번째 CPU 사용

docker run -d –name nginx --cpuset-cpus=”0-2”

 

 

·         --cpu-period, --cpu-quota : CPU 주기를 설정하며 -period 기본값은 100000이며 100ms 뜻한다, -quota -period 설정된 시간 CPU 스케줄링에 얼마나 할당할 것인지 설정한다. 예를 들어 -period = 100000이고 -quota=25000 할당하면 CPU주기가 ¼ 줄어 일반적인 컨테이너보다 CPU성능이 ¼ 감소한다. 컨테이너는 -period/-quota만큼 CPU 할당을 받는다.

docker run -d --name nginx --cpu-period=100000 --cpu-quota= 100000 nginx

 

·         --cpus : 이전의 --cpu-period, --cpu-quota, --cpu-share 비슷하지만 좀더 직관적으로 CPU사용량을 정의할 있다. 예를 들어 --cpus=0.1이라고 한다면 해당 컨테이너는 전체 CPU 중에 10% 사용한다는 뜻이다.

Docker run -d --name nginx --cpus=0.1 nginx

 

 

[I/O 제한]

컨테이너 생성시 아무런 제한을 하지 않으면 디스크I/O또한 모든 대역폭을 하나의 컨테이너가 사용할 있으므로 상황에 따라 I/O 제한 설정이 필요하다.  사용 형식은 [디바이스이름]:[] 이다.

·         --device-write-bps, --device-read-bps :  초당 읽기, 쓰기를 MB 단위로 설정하여 대역폭 제한한다. 아래 스크립트는 초당 쓰기를 10MB 제한한다.

docker run -it --name nginx --device-write-bps /var/data:10mb nginx

 

 

·         --device-write-iops, --device-read-iops : IO 대한 상대적인 값으로 아래 스크립트는 디스크에 대해 10IOPS 제한한다는 뜻이다.

docker run -it --name nginx --device-write-iops /var/data:10 nginx

 

 

[실행중인 컨테이너 리소스 재설정]

이미 실행중인 컨테이너의 리소스 설정을 변경할 때에는 docker update 명령을 사용한다. 아래 예제는 CPU 사용량을 10% 제한한다.

docker update [리소스 설정] [컨테이너이름]

docker update --cpus=0.1 nginx

 

 

[참고자료]

·         docker run : https://docs.docker.com/engine/reference/commandline/run/

 

 

 

2019-02-06 / Sungwook Kang / http://sqlmvp.kr

 

Docker, 컨테이너 리소스 제한, 도커 자원 할당, 컨테이너 설정, 컨테이너 CPU, 컨테이너 메모리, 컨테이너 I/O

Docker Container 로그 확인

-         컨테이너에서 발생하는 다양한 로그 확인

 

·         Version : Docker

 

어떠한 시스템을 운영하던지 로그는 매우 중요하다. 로그는 현재 서비스의 다양한 상태를 확인할 있는 훌륭한 도구이기 때문이다. Docker 경우 다양한 방법으로 컨테이너 로그를 남기는데, 이번 포스트에서는 컨테이너의 표준 입력(STDIN),  표준 출력(STDOUT), 표준 오류(STDERR) 로그를 별도의 메타데이터 파일로 저장하며 이를 확인하는 방법에 대해서 살펴본다.

 

컨테이너의 로그를 확인하는 명령은 docker logs 사용한다. docker logs 명령은 컨테이너의 표준 출력을 표시함으로써 애플리케이션 상태를 있다.

docker log [container name]

docker logs mariadb

 

 

컨테이너의 로그가 너무 많아 읽기 힘들면 --tail 옵션을 사용하여 마지막 로그부터 사용자가 지정한 라인까지 출력하도록 있다. 아래 예시는 마지막 로그의 10줄만 표시한다.

docker logs --tail 10 mariadb 

 

 

--since 옵션은 입력 받은 유닉스 시간 이후의 로그를 확인할 있으며 -t옵션으로 타임 스탬프를 표시할 수도 있다.

Docker logs --since 1549150300 -t mariadb

 

 

-f 옵션을 사용하면 실시간으로 생성되는 로그를 스트림으로 확인할 있다.

 


로깅 드라이버는 기본적으로 json-file 설정되지만 도커 데몬 시작 옵션에서 --log-driver 옵션을 사용하여 기본적으로 사용할 로깅 드라이버를 변경할 있다. 아래 스크립트는 nonoe 로깅드라이버로 alpine 컨테이너를 시작한다.

docker run -it --log-driver none alpine ash

 

실행중인 컨테이너의 로깅 드라이버를 확인하려면 docker inspect 명령을 실행한다.

docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>

docker inspect -f '{{.HostConfig.LogConfig.Type}}' mariadb

 

 

현재 로깅 드라이버는 매우 다양하게 지원되고 있으며 아래 링크에서 지원되는 드라이버를 확인할 있다.

·         Configure logging drivers  : https://docs.docker.com/config/containers/logging/configure/

 

docker logs 명령은 json-file journald이외의 드리이버에서는 사용할 없다.

 

 

[참고자료]

·         View logs for a container or service  : https://docs.docker.com/config/containers/logging/

·         Configure logging drivers  : https://docs.docker.com/config/containers/logging/configure/

 

 

2019-02-03 / Sungwook Kang / http://sqlmvp.kr

 

Docker, docker logs, 컨테이너 로그

  1. 안가 2020.06.03 10:20

    포스팅 잘 보고 갑니다.

  2. notacat 2021.09.15 11:04

    감사합니다
    docker logs --tail 100 -f container

  3. 행인 2022.05.26 16:39

    좋은 내용 잘 보고 갑니다
    감사합니다.

+ Recent posts