티스토리 뷰

반응형

이 글은 '완벽한 IT 인프라 구축을 위한 Docker(Asa Shiho 지음, Yamada Yoshihiro 감수, 신은화 옮김)'  책을 바탕으로 요약 및 실습한 내용을 정리한 글입니다.


 실습 환경 설정

cd /home
mkdir docker

실습을 진행하기 위해 /home 경로에 'docker' 폴더를 하나 만들어주고 모든 실습은 별도로 명시하지 않을 경우 docker 폴더 내에서 진행합니다.



제3장 Docker의 설치 방법과 기본 커맨드

3-1 Docker의 설치 방법과 동작 확인

Linux에서의 설치

sudo apt-get update
sudo apt-get install docker.io

대응되는 Linux 배포판과 클라우드 환경이 빈번하게 업데이트되므로 자주 체크하는 것이 좋습니다.


3-2 Docker 이미지 실행

이미지 다운로드(docker pull)

#이미지 다운로드
docker pull [옵션] <이미지명>[:태그명]
#CentOS Docker 이미지 다운로드
docker pull centos:7

#CentOS 모든 태그의 Docker 이미지 다운로드
docker pull -a centos

#다운로드 URL을 지정하여 CentOS Docker 이미지 다운로드
docker pull registry.hub.docker.com/centos:7


이미지 목록 출력(docker images)

#다운로드한 이미지 목록 출력
docker images [옵션] [repository명]
  • 주요 옵션
옵션 설명
-a, --all=false 모든 이미지 표시
--digests=false digest 표시
--no-trunc=false 모든 결과 표시
-q, -quiet=false Docker 이미지 ID만 표시


Docker repository에 업로드한 이미지는 한눈에 식별하기 쉽도록 digest가 부여됩니다.

#로컬 환경의 Docker 이미지 목록 출력
docker images

#로컬 환경 Docker 이미지의 digest 표시
docker images --digests ewshin/dockersample
  • docker images 커맨드 결과
항목 설명
REPOSITORY Docker 이미지명
TAG Docker 이미지 태그명
IMAGE ID Docker 이미지 ID(랜덤으로 할당)
CREATED 생성일
VIRTUAL SIZE 사이즈


이미지 세부 정보 확인(docker inspect)

#이미지 세부 정보 확인
docker inspect [옵션] <컨테이너 또는 이미지의 이름, ID>

커맨드를 실행하면 이미지의 세부 정보가 표시됩니다. 주요한 정보는 다음과 같습니다,

  1. 이미지 ID
  2. 생성일
  3. Docker 버전
  4. 이미지 생성자
  5. CPU

커맨드 실행 결과는 *JSON 형식으로 표시됩니다.

※ JSON(JavaScript Object Notation) : 텍스트 기반의 데이터 포맷

#centos 이미지의 세부 정보 확인
docker inspect centos

#OS 상세 정보 확인
docker inspect --format="{{ .Os }}" centos

#Image 상세 정보 확인
docker inspect --format="{{ .ContainerConfig.Image }}" centos


이미지 태그 설정(docker tag)

이미지 태그에는 일반적으로 버전명을 설정합니다. 또한 Docker Hub에 생성된 이미지를 등록할 때는 다음의 규칙에 맞게 이미지명을 붙여야 합니다.

#Docker 이미지 명명 규칙
<Docker Hub 사용자명>/이미지명:[태그명]
#이미지 태그 설정
docker tag httpd:2.4 miyoung/webserver:1.0

각 이미지의 이름은 다르나 본래 이미지를 rename한 것 뿐입니다.


이미지 검색(docker search)

#Docker Hub에 공개된 이미지 검색
docker search [옵션] <검색 키워드>

주요 옵션

옵션 설명
--automated=false

*Automated Build만 표시

--no-trunc=false 모든 결과 표시
-s[--starts=0]

특정 개수 이상의 별 수

※ Automated Build : 사용자가 GitHub과 Bitbucket상에 배치한 Dockerfile을 기반으로 Docker Hub에서 자동으로 생성한 Docker 이미지.
#Docker Hub에 공개된 'centos' 관련 Docker 이미지 검색
docker search centos

커맨드 실행 결과

항목 설명
NAME Docker 이미지명
DESCRIPTION Docker 이미지 설명
STARS 해당 이미지가 받은 별 수
OFFICIAL 공식 이미지 여부
AUTOMATED Dockerfile을 기반으로 자동 생성된 이미지 여부
#인기 있는 Docker 이미지 검색
docker search --starts=30 centos


이미지 삭제(docker rmi)

#생성한 이미지 삭제
docker rmi [옵션] <이미지명(REPOSITORY/IMAGE_ID)>

docker rmi 커맨드를 사용하면 태그가 없는 부모 이미지도 모두 삭제됩니다.

여러 개의 이미지를 삭제하고자 할 때에는 여러 이미지명을 공백으로 구분하여 입력합니다.


주요 옵션

옵션 설명
-f, --force=false 이미지 강제 삭제
--no-prune=false 태그가 없는 부모 이미지를 삭제하지 않음
#nginx 이미지 삭제
docker rmi nginx


Docker Hub에 로그인(docker login)

#Docker Hub에 로그인
docker login [옵션] [서버명]


주요 옵션

옵션 설명
-u, --username="" 사용자명
-p, --password="" 패스워드
-e, --email="" 이메일 주소

옵션을 입력하지 않으면 사용자명, 패스워드, 이메일 주소를 물어봅니다.

서버명을 입력하지 않으면 Docker Hub에 액세스합니다. 로컬 환경에 Docker repository가 있는 경우에는 서버명을 입력합니다.


이미지 업로드(docker push)

#Docker Hub에 이미지 업로드
docker push <이미지명>[:태그명]

Docker Hub에 업로드하는 이미지명은 <Docker Hub 사용자명>/이미지명:[태그명] 이어야 합니다.

이미지를 업로드 하기 위해서는 docker login 커맨드를 사용하여 Docker Hub에 미리 로그인해야 합니다.

#docker push 커맨드로 업로드
docker push miyoung/webserver:1.0


Docker Hub에서 로그아웃(docker logout)

#Docker Hub에서 로그아웃
docker logout [서버명]


3-3 Docker 컨테이너 생성·구동·중지

Docker 컨테이너 라이프 사이클

컨테이너 생성(docker create)

  • 이미지로 컨테이너 생성
  • 이미지에 포함된 Linux 디렉터리 및 파일 집합의 *스냅샷을 만듬
  • 컨테이너를 생성하는 것 뿐이며, 컨테이너를 구동하지는 않음
  • 컨테이너를 구동할 수 있는 준비 상태를 만드는 단계
※ 스냅샷 : 특정 시간에 스토리지 내부에 존재하는 파일과 디렉터리를 저장한 것.

컨테이너 생성 및 구동(docker run)

  • 이미지에서 컨테이너를 생성하여 컨테이너상에서 프로세스를 구동
  • 서버 프로세스를 백그라운드에서 실행하거나 경우에 따라 강제 종료 가능
  • 포트 번호 등 네트워크 설정을 통해 외부에서 컨테이너 프로세스에 액세스 가능

컨테이너 구동(docker start)

  • 중지 상태인 컨테이너를 구동할 때 사용
  • 컨테이너에 할당된 컨테이너명 또는 ID를 입력하여 컨테이너 구동

컨테이너 중지(docker stop)

  • 구동 중인 컨테이너를 중지할 때 사용
  • 컨테이너에 할당된 컨테이너명 또는 ID를 입력하여 컨테이너 구동
  • 컨테이너를 삭제하기 전에 docker stop 명령으로 중지시켜야 함

컨테이너 삭제(docker rm)

  • 컨테이너를 삭제할 때 사용
  • 중지되어 있는 컨테이너 삭제

컨테이너 생성 및 실행(docker run)

#Docker 컨테이너 생성 및 실행
docker run [옵션] <이미지명>[:태그명] [값]

주요 옵션

옵션 설명
-a, --attach=[STDIN | STDOUT | STDERR] 표준 입력(STDIN), 표준 출력(STDOUT), 표준 에러 출력(STDERR)을 연결
--cidfile="파일명" 컨테이너 ID를 파일로 출력
-d, --detach=false 컨테이너를 생성하여 백그라운드에서 실행
-i, --interactive=false 컨테이너 표준 입력 열기
-t, --tty=false tty(단말 디바이스)를 사용
--name 컨테이너명
#/bin/cal 커맨드를 실행한 캘린더 표시
docker run -it --name "test1" centos /bin/cal

#/bin/bash 실행
docker run -it --name "test2" centos /bin/bash


컨테이너 백그라운드 실행(docker run)

#컨테이너를 백그라운드에서 실행
docker run [옵션] <이미지명>[:태그명] [값]

주요 옵션

옵션 설명
-d, --detach 백그라운드에서 실행
-u, --user="사용자명" 사용자명을 입력
--restart= [no | on-failure | on-failure:횟수n | always] 커맨드 실행 결과에 따라 재기동
--rm 커맨드 실행 완료 후 컨테이너 자동 삭제
#/bin/ping 커맨드 실행으로 컨테이너 백그라운드 구동
docker run -d centos /bin/ping localhost

#컨테이너 로그 확인
docker logs -t <컨테이너명/ID>

커맨드 실행 결과에 따라 컨테이너를 재구동시키고자 할 때에는 다음과 같은 restart 옵션을 사용

설명
no 재구동하지 않음
on-failure 종료 status가 0이 아닌 경우 재구동
on-failure:횟수n 종료 status가 0이 아닌 경우 n번 재구동
always 항상 재구동
#컨테이너 항상 재구동
docker run -it --restart=always centos /bin/bash


컨테이너 네트워크 설정(docker run)

#컨테이너 네트워크 설정
docker run [옵션] <이미지명>[:태그명] [값]

주요 옵션

옵션 설명
--add-host=[호스트명:IP Address] 컨테이너의 /etc/hosts에 호스트명과 IP Address를 설정
--dns=[IP Address] DNS 서버의 IP Address를 설정
--expose=[포트 번호] 포트 번호 할당
--mac-address=[MAC Address] 컨테이너의 MAC Address 설정
--net=[bridge | none | container:<name|d> | host] 컨테이너의 네트워크 설정
-h, --hostname="호스트명" 컨테이너의 호스트명 설정
-P, --publish-all=[true | false] 임의의 포트를 컨테이너에 할당
-p [호스트 포트 번호]:[컨테이너 포트 번호] 호스트와 컨테이너의 포트를 매핑
--link=[컨테이너명:alias] 다른 컨테이너에서 액세스 시 이름 설정
#컨테이너 포트 매핑
docker run -d -p 8080:80 httpd

#컨테이너 DNS 서버 설정
docker run --dns=192.168.1.1 httpd

#MAC Address 설정
docker run -it --mac-address="92:d0:c6:0a:29:33" centos

#호스트명과 IP Address 설정
docker run -it --add-host=test.com:192.168.1.1 centos

#호스트명 설정
docker run -it --hostname=www.test.com --add-host=node1.test.com:192.168.1.1 centos

한편, Docker에서는 defalut로 호스트OS와 bridge 접속을 하며 net 옵션을 통해 다음과 같이 네트워크를 설정할 수도 있습니다.


net 옵션

설명
bridge bridge 접속(default) 사용
none 네트워크에 접속하지 않음
container:[ name | id ] 다른 컨테이너의 네트워크를 사용
host 컨테이너가 호스트OS의 네트워크를 사용


리소스를 설정하여 컨테이너 생성 및 실행(docker run)

#리소스를 설정하여 컨테이너를 생성 및 실행
docker run [리소스 옵션] <이미지명>[:태그명] [값]

주요 옵션

옵션 설명
-c, --cpu-shares=0 CPU 리소스 분배
-m, --memory=[메모리 사용량] 메모리 사용량 제한(단위는 b, k, m, g 등. defalut는 1024)
-v, --volume=[호스트 디렉터리]:[컨테이너 디렉터리] 호스트와 컨테이너의 디렉터리 공유

CPU는 cpu-share 옵션으로 제한 값을 설정할 수 있습니다. 아래와 같이 Docker 리소스를 제한하는 기능은 Linux의 cgroups 기능을 사용합니다.

#CPU와 메모리 사용량 설정
docker run --cpu-share=512 --memory=512m centos

#디렉터리 공유
docker run -v /c/Users/ewshin/WebPage:/var/www/html httpd


컨테이너 생성 및 구동 환경 설정(docker run)

#컨테이너 환경변수 및 컨테이너 내의 작업 디렉터리 등을 설정하여 컨테이너를 생성하고 실행
docker run [환경설정 옵션] <이미지명>[:태그명] [값]

주요 옵션

옵션 설명
-e, --env=[환경변수] 환경변수 설정
--env-file=[파일명] 파일에서 환경변수 설정
--privileged=[true | false] privileged 모드에서 구동(호스트의 커널 기능도 사용 가능)
--read-only=[true | false] 컨테이너의 파일 시스템을 read-only로 설정
-w, --workdir=[경로] 컨테이너의 작업 디렉터리를 설정
#환경변수 설정
docker run -it -e foo=bar centos /bin/bash

#환경변수 파일 작성
sudo atom env_list
#env_list 작성
hoge=fuga
foo=bar
#환경변수 일괄 설정
docker run -it --env-file=env_list centos /bin/bash

#작업 디렉터리 설정
docker run -it -w=/tmp/work centos /bin/bash


컨테이너 목록 확인(docker ps)

#구동 중인 컨테이너 목록 확인
docker ps [옵션]

주요 옵션

옵션 설명
-a, --all=false 구동, 중지 상태의 모든 컨테이너를 표시
--before="" 입력한 컨테이너명 또는 ID보다 이전에 구동된 컨테이너를 표시
-f, --filter '[key]=[value]' 목록에 표시할 컨테이너를 필터링
--format '[key]=[value]' 목록에 표시할 포맷을 설정
-l, --latest=false 마지막에 구동된 컨테이너를 표시
--no-trunc=false 생략된 정보 없이 모두 표시
-q, --quiet=false 컨테이너 ID만 표시
-s, --size=false 파일 사이즈를 표시
--since="" 입력한 컨테이너명 또는 ID보다 이후에 구동된 컨테이너를 표시


커맨드 실행 결과

항목 설명
CONTAINER ID 컨테이너 ID
IMAGE 컨테이너 기반이 된 이미지
COMMAND 컨테이너에서 실행 중인 커맨드
CREATED 컨테이너 생성 후 경과 시간
STATUS 컨테이너 상태(restarting | running | paused | exited)
PORTS 할당된 포트
NAMES 컨테이너명
#모든 컨테이너 목록 출력
docker ps -a

#'test1'에 대하여 필터링 사용
docker ps -a -f 'name=test1'

#STATUS의 종료 코드가 0인 목록
docker ps -a -f 'exited=0'

출력 형식을 변경할 때는 format 옵션을 사용하며 다음과 같은 placeholder를 활용합니다.

placeholder 설명
.ID 컨테이너 ID
.Image 컨테이너의 기반이 된 이미지
.Command 실행 커맨드
.CreatedAt 컨테이너가 생성된 시간
.RunningFor 컨테이너 구동 시간
.Ports 할당된 포트
.Status 컨테이너 상태
.Size 컨테이너 디스크 사이즈
.Labels 컨테이너의 모든 라벨
.Label 컨테이너 라벨
#docker ps 커맨드의 출력 형식 지정
docker ps -a --format "{{ .ID }}: {{ .Status }}"

#docker ps 커맨드를 표 형식으로 실행
docker ps -a --format "table {{ .ID }}\t{{ .Status }}"


컨테이너 구동 확인(docker stats)

#Docker 상에서 동작하는 컨테이너 상태 확인
docker stats <컨테이너명 또는 ID>

docker stats 커맨드의 실행 결과는 다음과 같습니다.

항목 설명
CONTAINER 컨테이너명 또는 ID
CPU % CPU 사용률
MEM USAGE/LIMIT 메모리 사용량·컨테이너에서 사용할 수 있는 메모리 제한
MEM % 메모리 사용률
NET I/O 네트워크 I/O

상태 확인 완료 후, Ctrl + c를 누르면 커맨드가 종료됩니다.

#apache와 nginx 컨테이너의 상태 확인
docker stats apache nginx


컨테이너 구동(docker start)

#중지되어 있는 컨테이너 구동
docker start [옵션] <컨테이너명 또는 ID>

주요 옵션

옵션 설명
-a, --attach=false 표준 출력, 표준 에러를 연결
-i, --interactive=false 컨테이너 표준 입력을 연결
#컨테이너 ID가 dbb4bbe0f470인 컨테이너 구동
docker start dbb4bbe0f470

여러 컨테이너를 한 번에 구동하고 싶을 때에는 컨테이너명 또는 ID를 스페이스로 구분하여 값을 입력합니다.


컨테이너 중지(docker stop)

#구동 중인 컨테이너 중지
docker stop [옵션] <컨테이너명 또는 ID>

주요 옵션

옵션 설명
-t, --time=10 컨테이너 중지 시간을 지정(default는 10초)
#컨테이너 ID가 dbb4bbe0f470인 컨테이너를 2초 후 중지
docker stop -t 2 dbb4bbe0f470

강제로 컨테이너를 중지시킬 때에는 docker kill 커맨드를 사용합니다.


컨테이너 재시작(docker restart)

#컨테이너 재시작
docker restart [옵션] <컨테이너명 또는 ID>

주요 옵션

옵션 설명
-t, --time=10 컨테이너 재시작 시간을 지정(default는 10초)
#컨테이너 ID가 dbb4bbe0f470인 컨테이너를 2초 후 재시작
docker restart -t 2 dbb4bbe0f470

커맨드의 종료 상태(정상 종료인지 아닌지)에 따라 컨테이너를 자동으로 재시작하고자 하는 경우, docker run 커맨드의 --restart 옵션을 사용합니다.


컨테이너 삭제(docker rm)

#컨테이너 삭제
docker rm [옵션] <컨테이너명 또는 ID>

주요 옵션

옵션 설명
-f, --force=false 구동 중인 컨테이너를 강제 삭제
-v, --volumes=false 할당된 볼륨을 삭제
#컨테이너 ID가 dbb4bbe0f470인 컨테이너를 삭제
docker rm dbb4bbe0f470

#구동 중인 컨테이너까지 모두 삭제
docker rm -f $(docker ps -aq)


컨테이너 일시정지 및 재시작(docker pause/docker unpause)

#구동 중인 컨테이너에서 실행 중인 프로세스를 모두 일시정지
docker pause <컨테이너명 또는 ID>
#실행 중인 nginx1 프로세스 일시정지
docker pause nginx1

#일시정지된 nginx1 프로세스 재시작
docker unpause nginx1


3-4 Docker 컨테이너 사용법

컨테이너 접속(docker attach)

구동중인 컨테이너에 접속할 때에는 docker attach 커맨드를 사용합니다.

#구동 중인 컨테이너에 접속
docker attach <컨테이너명 또는 ID>

Ctrl + c로 접속한 컨테이너를 종료할 수도 있지만, 컨테이너를 종료시키지 않고 프로세스를 빠져나올 때에는 Ctrl + p, Ctrl + q를 입력합니다.


컨테이너의 프로세스 실행(docker exec)

웹 서버처럼 백그라운드에서 실행하는 컨테이너에 docker attach 커맨드로 접속해도 쉘이 동작하지 않는다면 커맨드를 입력할 수 없습니다. 이런 경우 docker exec로 임의의 커맨드를 실행시켜야 합니다.

#구동 중인 컨테이너에서 새로운 프로세스 실행
docker exec [옵션] <컨테이너명 또는 ID> <커맨드> [값]

주요 옵션

옵션 설명
-d, --datach=false 커맨드를 백그라운드에서 실행
-i, --interactive=false 컨테이너 표준 입력 열기
-t, --tty=false tty(단말디바이스) 사용
#nginx1 컨테이너에서 /bin/bash 실행
docker exec -it nginx1 /bin/bash

#nginx1 컨테이너에서 localhost로 ping 실행
docker exec -it nginx1 /bin/ping localhost

docker exec는 구동 중인 컨테이너에서만 실행할 수 있으므로 중지된 컨테이너인 경우에는 docker start를 사용합니다.


컨테이너의 프로세스 확인(docker top)

#구동 중인 컨테이너에서 실행 중인 프로세스 확인
docker top <컨테이너명 또는 ID>

이 커맨드를 통해 해당 컨테이너에서 실행 중인 프로세스의 PID와 USER, 커맨드를 알 수 있습니다.


컨테이너의 포트 상태 확인(docker port)

#구동 중인 컨테이너에서 실행 중인 프로세스의 전송 포트 확인
docker port <컨테이너명 또는 ID>

대표적인 Well-Known Port

번호 TCP/UDP 서비스/프로토콜 설명
20 TCP FTP(데이터) 파일 전송(데이터)
21 TCP FTP(제어) 파일 전송(제어)
22 TCP/UDP ssh secure shell
23 TCP Telnet 리모트 액세스
25 TCP/UDP SMTP 메일 전송
43 TCP WHOIS 도메인 정보 검색
53 TCP/UDP DNS 도메인 네임 시스템
80 TCP/UDP HTTP Web 액세스
88 TCP/UDP Kerberos Kerberos 인증
110 TCP POP3 메일 수신
123 UDP NTP 시간 조정
135 TCP Microsoft RPC Microsoft 리모트 액세스
143 TCP/UDP IMAP2/4 인터넷 메일 액세스
161 TCP/UDP SNMP 네트워크 모니터링
162 TCP/UDP SNMP 트래픽 네트워크 모니터링(트래픽)
389 TCP/UDP LDAP 디렉터리 서비스
443 TCP/UDP HTTPS HTTP 암호화 통신
465 TCP SMTPS SMTP 암호화 통신
514 UDP syslog 로그 수집
989 TCP/UDP FTPS(데이터) FTP(데이터) 암호화 통신
990 TCP/UDP FTPS(제어) FTP(제어) 암호화 통신
992 TCP/UDP Telnets Telnet 암호화 통신
993 TCP IMAPS IMAP 암호화 통신
995 TCP POP3S POP3 암호화 통신


컨테이너명 변경(docker rename)

#컨테이너명 변경
docker rename <기존의 컨테이너명> <새로운 컨테이너명>


컨테이너 내에서 파일 복사(docker cp)

#컨테이너 내의 파일을 호스트로 복사
docker cp <컨테이너명 또는 ID>:<컨테이너 내의 파일 경로> <호스트 디렉터리 경로>
docker cp <호스트 파일> <컨테이너명 또는 ID>:<컨테이너 내의 파일 경로>
#test 컨테이너의 /etc/passwd 파일을 호스트의 /tmp/etc에 복사
docker cp test:/etc/passwd /tmp/etc

#호스트의 현재 디렉터리에 있는 local.txt 파일을 text 컨테이너의 /tmp/local.txt로 복사
docker cp ./local.txt test:/tmp/local.txt


컨테이너 내에서 파일 변경 이력 확인(docker diff)

#컨테이너가 생성된 시점부터 변경된 이력 확인
docker diff <컨테이너명 또는 ID>

변경된 내용은 다음과 같이 세 가지로 구분됩니다.

구분 설명
A 파일 추가
D 파일 삭제
C 파일 변경


3-5 Docker 정보 확인

Docker의 버전과 설치 정보를 확인하기 위해서는 docker version 커맨드와docker info 커맨드를 사용합니다.


Docker 버전 확인(docker version)

#Docker 버전 확인
docker version

docker version 커맨드를 실행시키면 Docker 버전과 Go 언어 버전, OS와 아키텍처를 확인할 수 있습니다.

Docker는 클라이언트 및 서버 아키텍처로 구성되어 있어, Docker 클라이언트와 Docker 서버가 Remote API를 경유하여 접속합니다. 그러므로 docker ps 등의 모든 커맨드는 서버를 거쳐 처리됩니다.


Docker 실행 환경 확인(docker info)

#Docker 실행 환경 확인
docker info

docker info 커맨드를 실행하면 구동 중인 컨테이너 수, 스토리지 드라이브 종류와 *Boot2Docker 버전 등 Docker의 상세 설정을 확인할 수 있습니다.

※ Boot2Docker : Windows, Mac OS X에서 Docker를 사용할 수 있게 해주는 도구(Docker는 현재 리눅스 전용). VirtualBox 가상 머신 안에 리눅스를 설치하고 Docker를 실행.


3-6 컨테이너에서 이미지 생성

Docker 컨테이너는 Docker 이미지를 기반으로 생성되지만 반대로 Docker 컨테이너를 기반으로 Docker 이미지를 생성할 수도 있습니다.


컨테이너에서 이미지 생성(docker commit)

#컨테이너에서 이미지 생성
docker commit [옵션] <컨테이너명 또는 ID> [이미지명[:태그명]]

주요 옵션

옵션 설명
-a, --author="~ " 생성자 (예: MIYOUNG LIM <mylim109@nongshim.co.kr>)
-m, --message="~ " 메시지
-p, --pause=true 컨테이너를 일시 중지한 후 commit
#nginx1 컨테이너에서 miyoung/webfront라는 이름에 1.0 태그를 붙인 새로운 이미지 생성
docker commit -a "MIYOUNG LIM" nginx1 miyoung/webfront:1.0

이와 같이 독자적으로 생성한 이미지는 추후 Docker Hub 등에 공개하는 것을 고려하여 생성자와 commit 메시지를 입력하는 것이 좋습니다.


컨테이너를 tar 파일로 저장(docker export)

Docker에서는 구동 중인 컨테이너의 디렉터리 및 파일들을 모아 tar 파일로 저장할 수 있습니다. 이러한 tar 파일을 기반으로 다른 서버에서 컨테이너를 구동할 수 있는 것입니다.

#tar 파일 생성
docker export <컨테이너명 또는 ID>
#webap 컨테이너를 latest.tar 파일로 저장
docker export webap > latest.tar

#생성된 tar 파일 상세 확인
tar -tvf latest.tar


tar 파일에서 이미지 생성(docker import)

#Linux OS 이미지의 디렉터리 및 파일로 Docker 이미지 생성
docker import <파일 또는 URL> - [이미지명[:태그명]]

docker import 커맨드에서 지정 가능한 파일은 하나뿐이므로 tar 커맨드 등으로 디렉터리, 파일 등을 한데 모아야 합니다. 이때, root 권한으로 실행하지 않으면 액세스 권한이 없는 파일이 포함되지 않는 등 문제가 발생할 수 있으므로 주의해야 합니다.

docker import 커맨드에서 지정할 수 있는 파일은 다음과 같습니다.

  • tar
  • tar.gz
  • tgz
  • bzip
  • tar.xz
  • txz
#latest.tar 파일을 기반으로 1.0 태그의 webap 이미지 생성
cat latest.tar | docker import - webap:1.0

#생성된 이미지 확인
docker images


이미지 저장(docker save)

#Docker 이미지를 tar 파일로 저장
docker save [옵션] <파일명> [이미지명]

저장할 파일명은 o 옵션으로 지정할 수 있습니다.

#mongo 이미지를 export.tar 파일로 저장
docker save -o export.tar mongo


이미지로 되돌리기(docker load)

#docker save로 저장한 tar 파일을 이미지로 되돌림
docker load [옵션]

파일명은 i 옵션을 통해 입력합니다.

#export.tar 파일을 이미지로 재생성
docker load -i export.tar


export/import와 save/load의 차이

컨테이너를 export하면 컨테이너 동작에 필요한 파일이 모두 압축됩니다. 그러므로 이 tar 파일에는 컨테이너의 루트 파일 시스템 자체가 들어있다고 할 수 있습니다.

한편, 이미지를 save하면 레이어 구조까지 포함한 형태로 압축됩니다.

이처럼 기반 이미지는 같아도 docker export와 docker save 커맨드의 내부 디렉터리 및 파일 구조가 다름을 알 수 있습니다. 그러므로 docker export로 압축된 파일은 docker import로, docker save로 압축된 파일은 docker load를 사용하여 이미지를 생성해야 합니다.


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함