티스토리 뷰
이 글은 '완벽한 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>
커맨드를 실행하면 이미지의 세부 정보가 표시됩니다. 주요한 정보는 다음과 같습니다,
- 이미지 ID
- 생성일
- Docker 버전
- 이미지 생성자
- 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] | 특정 개수 이상의 별 수 |
#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를 사용하여 이미지를 생성해야 합니다.
'개발도구 > Docker' 카테고리의 다른 글
[Docker] 완벽한 IT 인프라 구축을 위한 Docker: 제5장 Docker 이미지 공유―Docker Registry (0) | 2018.01.30 |
---|---|
[Docker] 완벽한 IT 인프라 구축을 위한 Docker: 제4장 Dockerfile로 서버 구축 (0) | 2018.01.30 |
[Docker] 완벽한 IT 인프라 구축을 위한 Docker: 제2장 컨테이너 가상화 기술과 Docker (0) | 2018.01.30 |
[Docker] 완벽한 IT 인프라 구축을 위한 Docker: 제1장 알아두어야 할 시스템·인프라 지식 (2) | 2018.01.30 |
[Docker] Docker Training: Docker Fundamentals (0) | 2017.12.28 |
- Total
- Today
- Yesterday
- Hyperledger Fabric
- 어서와 데이터는 처음이지
- ubuntu
- Hyperledger Fabric v1.2
- 하이퍼레저 인디
- 블록 체인
- codility
- 빅데이터 기초
- docker
- Blockchain
- ambrosus
- 코딜리티
- 알고리즘
- 기초 of 기초 데이터 개념
- 코테
- 코딩테스트
- 하이퍼레저 패브릭
- 빅데이터
- Hyperledger Indy
- Hyperledger Fabric v1.1
- 빅데이터 교육
- 블록체인
- DOCs
- javascript
- 직딩잇템
- 하이퍼레저 페브릭
- 문제풀이
- 암브로셔스
- 빅데이터 강의
- Private Data
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |