docker
Requirements
시스템과 인프라 기초 지식
하드웨어와 네트워크 기초 지식
OSI 7 Layer
OSI 참조 모델 | 대표 프로토콜 | 대표 통신 기기 | Descriptions |
7계층(L7) | 응용 계층 | HTTP, DNS, SMPT, SSH | 방화벽, 로드밸런서 | 애플리케이션 특화된 프로토콜 규정 |
6계층(L6) | 표현 계층 | | | 데이터의 저장 형식이나 압축, 문자 인코딩과 같은 데이터의 표현 형식을 규정 |
5계층(L5) | 세션 계층 | | | 커넥션 확립 타이밍이나 데이터 전송 타이밍을 규정. 애플리케이션 간에 일어나는 요청(request)과 응답(response)으로 구성 |
4계층(L4) | 전송 계층 | TCP, UDP | | 전송 오류의 검출이나 재전송을 규정. 데이터를 통신 상대의 노드로 확실히 보내는 역할 |
3계층(L3) | 네트워크 계층 | IP, ICMP | 라우터, L3 스위치 | 서로 다른 네트워크 간에 통신을 하기 위한 규정 |
2계층(L2) | 데이터 링크 계층 | Ethernet | L2 스위치, 브리지 | 동일한 네트워크 안(동일 세그먼트)에 있는 노드 간의 통신을 규정. MAC 주소로 데이터 전송 |
1계층(L1) | 물리 계층 | | 리피터 허브 | 통신 장비의 물리적 및 전기적 특성을 규정. 데이터를 어떻게 전압과 전류의 값으로 할당할지, 케이블이나 커넥터의 모양(RJ) 등을 규정. 트위스트 페어 케이블(STP/UTP), 100BASE-T, IEEE802.11 등 |
방화벽; 패킷 필터형, 애플리케이션 게이트웨이 형
라우터/레이어3 스위치; 라우팅 테이블 → 정적 경로(Static Route), 라우팅 프로토콜 → 동적 경로(Dynamic Route)
Linux 기초 지식
Linux 커널; 디바이스 관리, 프로세스 관리, 메모리 관리
쉘의 종류
쉘의 종류 |
이름 | 특징 |
bash | 명령 이력, 디렉토리 스택, 명령 변환 기능, 명령이나 파일명의 자동보완 기능 등을 지원하는 고기능 쉘. 대부분의 Linux 시스템이나 macOS(OS X)에 표준으로 탑재 |
csh | C 언어와 매우 비슷한 쉘로, BSD 계열 OS에서 주로 이용 |
tcsh | csh를 개선한 버전으로 명령이나 파일명 등의 자동보완 기능을 가짐 |
zsh | bash와 호환성이 있는 쉘로, 고속으로 작동하는 것이 특징 |
Linux 파일 시스템; VFS(Virtual File System)
디렉토리 구성; /bin, /boot, /dev, /etc, /home, /proc, /sbin, /tmp, /usr, /var
보안 기능; 계정에 대한 권한 설정, 네트워크 필터링을 사용한 보안 기능(iptables), SELinux(Security-Enhanced Linux)
미들웨어 기초 지식
웹서버/웹 애플리케이션 서버; Apache
HTTP Server,
IIS(Internet Information Services), Nginx, ..
데이터베이스 서버;
RDBMS; MySQL, PostgreSQL, Oracle Database, …
NoSQL; Redis, MongoDB, Apache Cassandra, …
시스템 감시 툴; Zabbix, Datadog, Mackerel, …
인프라 구성 관리 기초 지식
인프라 구성 관리; Chef, Ansible, Puppet, Itamae, … Kubernetes
지속적 인티그레이션/지속적 딜리버리;
Linux 디렉토리 구성
이름 | 설명 |
/bin | ls 커맨드나 cp 커맨드와 같은 기본 커맨드를 저장하는 디렉토리. 특권 사용자, 일반 사용자 모두 이용하는 명령들이 배치되어 있음. |
/boot | Linux 커널 등의 OS의 시작에 필요한 파일을 배치하는 디렉토리. Linux 커널의 정체는 vmlinuz라는 이름의 파일. |
/dev | 하드디스크, 키보드, 디바이스 파일을 저장하는 디렉토리. 예를 들어 /dev/had는 하드디스크, /dev/hda는 IDE 타입 하드디스크, /dev/sda는 SCSI 타입 하드디스크를 나타냄. /dev/tty는 표준입출력이 되는 단말 디바이스. 또한 '아무 것도 아니다'를 나타내는 /dev/null이라는 특수한 디바이스도 마련되어 있음. /dev/null은 필요가 없어진 출력을 버릴 때 사용하거나 빈 파일로 사용. |
/etc | OS나 애플리케이션이 작동하는 데 필요한 설정 파일이 저장되어 있는 디렉토리. 예를 들어 /etc/hosts는 IP 주소와 도메인명을 연결하는 파일이며, /etc/passwd는 사용자의 비밀번호가 저장되어 있음. 웹 서버를 시작할 때의 http 데몬 설정 파일도 이 디렉토리 아래에 배치됨. |
/home | 일반 사용자의 홈 디렉토리. 시스템 이용자가 자유롭게 사용할 수 있는 디렉토리. 독자적인 쉘 설정 파일 등도 여기에 배치될 수 있음. 또한 특권 사용자(root)는 /root를 홈 디렉토리로 사용. |
/proc | 커널이나 프로세스에 관한 정보가 저장되어 있는 디렉토리. /proc 아래에 있는 숫자 폴더는 프로세스 ID. 또한 /proc/cpuinfo는 CPU 정보, /proc/partitions는 디스크의 파티션 정보, /proc/version은 Linux 커널의 버전 정보가 저장되어 있음. |
/sbin | 시스템 관리용 마운트가 저장되어 있는 디렉토리. 예를 들어 mount 커맨드나 reboot 커맨드 등 관리 커맨드는 /usr/sbin/이나 /usr/local/sbin 등에 배치되는 경우도 있음. |
/tmp | 일시적으로 사용하는 파일 등을 저장하는 임시 디렉토리. 하드디스크에 저장되어 있는 보통의 파일처럼 보이지만 /tmp는 보통 tmpfs 파일 시스템을 사용하여 메모리상에 전개되기 때문에 서버를 재시작하면 사라져 버림. |
/usr | 각종 프로그램이나 커널 소스가 저장되는 디렉토리. /usr/local은 시스템 관리자가 애플리케이션을 설치하는 장소로 이용. |
/var | 시스템의 가동과 함께 변화하는 파일을 놓아두는 디렉토리. 예를 들어 /var/log에는 가동 로그, /var/spool에는 애플리케이션이 임시 파일로 사용하는 스풀이 저장됨. 또한 메일 등의 큐나 프로세스의 다중 기동을 막기 위한 로그 파일 등도 배치. |
컨테이너 기술과 Docker 개요
Getting started docker
'hello world' on docker
docker containder run <Docker 이미지명> <실행할 명령>
$ docker containder run ubuntu:latest /bin/echo 'Hello world'
$ docker version
$ docker system info
$ docker system df
nginx 작동 예제
$ docker pull nginx
$ docker image ls
$ docker container run --name webserver -d -p 80:80 nginx
$ docker container ps
$ docker container stats webserver
$ docker stop webserver
$ docker start webserver
Commands
이미지 조작
Docker Hub
이미지 다운로드(docker image pull)
docker hub에서 이미지 다운로드
docker image pull
$ docker image pull [옵션] 이미지명[:태그명]
$ docker image pull centos:7
$ docker image pull -a centos
$ docker image pull gcr.io.tensorflow/tensorflow
이미지 목록 표시(docker image ls)
취득한 이미지의 목록 표시
docker image ls
$ docker image ls [옵션] [리포지토리명]
옵션 | 설명 |
-all, -a | 모든 이미지를 표시 |
–digests | 다이제스트를 표시할지 말지 |
–no-trunc | 결과를 모두 표시 |
–quiet, -q | Docker 이미지 ID만 표시 |
$ docker image ls
결과
항목 | 설명 |
REPOSITORY | 이미지 이름 |
TAG | 이미지 태그명 |
IMAGE ID | 이미지 ID |
CREATED | 작성일 |
SIZE | 이미지 크기 |
$ export DOCKER_CONTENT_TRUST = 1
$ export DOCKER_CONTENT_TRUST = 0
이미지 상세 정보 확인(docker image inspect)
이미지 상세 정보 확인
$ docker image inspect centos:7
$ docker image inspect --format="{{ .Os}}" centos:7
$ docker image inspect --format="{{ .ContainderConfig.Image }}" centos:7
결과는
JSON(JavaScrip Object Notation) 형식으로 표시
이미지 ID
작성일
Docker 버전
CPU 아키텍처
이미지 태그 설정(docker image tag)
이미지에 표식이 되는 태그를 붙임
docker image tag
<Docker Hub 사용자명>/이미지명:[태그명]
$ docker image tag nginx alexlevine/webserver:1.0
이미지 검색(docker search)
docker hub에 공개되어 있는 이미지 검색
docker search
docker search [옵션] <검색 키워드>
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–no-trunc | 결과를 모두 표시 |
–limit | n건의 검색 결과를 표시 |
–fileter=stars=n | 즐겨찾기의 수(n 이상)를 지정 |
$ docker search nginx
docker search 명령 결과 |
항목 | 설명 |
NAME | 이미지 이름 |
DESCRIPTION | 이미지 설명 |
STARS | 즐겨찾기 수 |
OFFICIAL | 공식 이미지인지 아닌지 |
AUTOMATED | Dockerfile을 바탕으로 자동 생성된 이미지인지 아닌지 |
이미지 삭제(docker image rm)
작성한 이미지 삭제
docker image rm
docker image rm [옵션] 이미지명 [이미지명]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–force, -f | 이미지를 강제로 삭제 |
–no-prune | 중간 이미지를 삭제하지 않음 |
$ docker image rm nginx
docker image prune
docker image prune [옵션]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–all, -a | 사용하지 않은 이미지를 모두 삭제 |
–force, -f | 이미지를 강제로 삭제 |
Docker Hub에 로그인(docker login)
docker 리포지토리에 업로드하기 위해 docker에 로그인
docker login
docker login [옵션] [서버]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–password, -p | 비밀번호 |
–username, -u | 사용자명 |
$ docker login
Username: [등록한 사용자명]
Password: [등록한 비밀번호]
Login Succeeded
이미지 업로드(docker image push)
docker hub에 이미지 업로드
docker image push
docker image push 이미지명[:태그명]
$ docker image push alexlevine/webserver:1.0
Docker Hub에서 로그아웃(docker logout)
컨테이너 생성/시작/정지
Docker 컨테이너의 라이프 사이클
컨테이너 생성; docker container create
컨테이너 생성 및 시작; docker container run
컨테이너 시작; docker container start
컨테이너 정지; docker container stop
컨테이너 삭제; docker container rm
컨테이너 생성 및 시작(docker container run)
컨테이너의 생성 및 시작
docker container run
docker container run [옵션] 이미지명[:태그명] [인수]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–attach, -a | 표준 입력(STDIN), 표준 출력(STDOUT), 표준 오류 출력(STDERR)에 어태치한다. |
–cidfile | 컨테이너 ID를 파일로 출력한다. |
–detach, -d | 컨테이너를 생성하고 백그라운드에서 실행한다. |
–interactive, -i | 컨테이너의 표준 입력을 연다. |
–try, -t | 단말기 디바이스를 사용한다. |
$ docker container run -it --name "test1" centos /bin/cal
# docker container run; 컨테이너를 생성 및 실행
# -it; 콘솔에 결과를 출력하는 옵션
# --name "test1"; 컨테이너 명
# centos; 이미지명
# /bin/cal; 컨테이너에서 실행할 명령
$ docker container run -it --name "test2" centos /bin/bash
컨테이너의 백그라운드 실행(docker container run)
docker를 이용하는 경우의 대부분은 컨테이너에 서버 기능을 가지게 해서 실행하는 경우, 대화식이 아닌 백그라운드에서 실행
docker container run
docker container run [실행 옵션] 이미지명[:태그명] [인수]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–detach, -d | 백그라운드에서 실행 |
–user, -u | 사용자명을 지정 |
–restart=[no|on-failure|on-failure:횟수n|always|unless-stopped] | 명령의 실행 결과에 따라 재시작을 하는 옵션 |
–rm | 명령 실행 완료 후에 컨테이너를 자동으로 삭제 |
$ docker container run -d centos /bin/ping localhost
# docker container run; 컨테이너를 생성 및 실행
# -d; 백그라운드에서 실행하는 옵션
# centos; 이미지명
# /bin/ping localhost; 컨테이너에서 실행할 명령
fbcdab0e9417.....
$ docker container logs -t fbcdab0e9417
restart 옵션 |
설정값 | 설명 |
no | 재시작하지 않는다. |
on-failure | 종료 스테이터스가 0이 아닐 때 재시작한다. |
on-failure:횟수n | 종료 스테이터스가 0이 아닐 때 n번 재시작한다. |
always | 항상 재시작한다. |
unless-stopped | 최근 컨테이너가 정지 상태가 아니라면 항상 재시작한다. |
$ docker container run -it --restart=always centos /bin/bash # 컨테이너를 항상 재시작
컨테이너의 네트워크 설정(docker container run)
컨테이너의 네트워크를 설정
docker container run
docker container run [네트워크 옵션]: 이미지명[:태그명] [인수]
지정할 수 있는 옵션 |
옵션 | 설명 |
–add-host=[호스트명:IP 주소] | 컨테이너의 /etc/hosts에 호스트명과 IP 주소를 정의 |
–dns=[IP 주소] | 컨테이너용 DNS 서버의 IP 주소 지정 |
–expose | 지정한 범위의 포트 번호를 할당 |
–mac-address=[MAC 주소] | 컨테이너의 MAC 주소를 지정 |
–net=[bridge|none|container:<name|id>|host|NETWORK] | 컨테이너의 네트워크를 지정 |
–hostname, -h | 컨테이너 자신의 호스트명을 지정 |
–publish, -p[호스트의 포트 번호]:[컨테이너의 포트 번호] | 호스트와 컨테이너의 포트 매핑 |
–publish-all, -p | 호스트의 임의의 포트를 컨테이너에 할당 |
$ docker container run -d --dns 192.168.1.1 nginx
$ docker container run -d --mac-address="92:d0:c6:0a:29:33" centos
2a4f6cf4da30a...
$ docker container inspect --format="{{ .Config.MacAddress }}" 2a5f
92:d0:c6:0a:29:33
$ docker container run -it --add-host test.com:192.168.1.1 centos
$ docker container run -it --hostname www.test.com --add-host node1.test.com:6 192.168.1.1 centos
–net 옵션의 지정 |
설정값 | 설명 |
bridge | 브리지 연결(기본값)을 사용한다. |
none | 네트워크에 연결하지 않는다. |
container:[name|id] | 다른 컨테이너의 네트워크를 사용한다. |
host | 컨테이너가 호스트 OS의 네트워크를 사용한다. |
NETWORK | 사용자 정의 네트워크를 사용한다. |
$ docker network create -d bridge webap-net
$ docker container run --net=webap-net -it centos
자원을 지정하여 컨테이너 생성 및 실행(docker container run)
CPU나 메모리와 같은 자원을 지정하여 컨테이너를 생성 및 실행
docker container run
docker container run [자원 옵션] 이미지명[:태그명] [인수]
지정할 수 있는 주요 옵션 |
–cpu-shares, -c | CPU의 사용 배분(비율) |
–memory, -m | 사용할 메모리를 제한하여 실행
(단위는 b, k, m, g 중 하나) |
–volume=[호스트의 디렉토리]:[컨테이너의 디렉토리], -v | 호스트와 컨테이너의 디렉토리를 공유 |
$ docker container run --cpu-shares=512 --memory=1g centos
$ docker container run -v /Users/alex/webap:/usr/share/nginx/html nginx
컨테이너를 생성 및 시작하는 환경을 지정(docker container run)
컨테이너의 환경변수나 컨테이너 안의 작업 디렉토리 등을 지정하여 컨테이너를 생성/실행
docker container run
docker container run [환경설정 옵션] 이미지명[:태그명] [인수]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–env=[환경변수], -e | 환경변수를 설정한다. |
–evn-file=[파일명] | 환경변수를 파일로부터 설정한다. |
–read-only=[true|false] | 컨테이너의 파일 시스템을 읽기 전용으로 만든다. |
–workdir=[패스], -w | 컨테이너의 작업 디렉토리를 지정한다. |
-u, –user=[사용자명] | 사용자명 또는 UID를 지정한다. |
$ docker container run -it -e foo=bar centos /bin/bash
$ cat env_list
hoge=fuga
foo=bar
$ docker container run -it --env-file=env_list centos /bin/bash
$ docker container run -it -w=/tensorflow centos /bin/bash
가동 컨테이너 목록 표시(docker container ls)
docker 상에서 작동하는 컨테이너의 가동상태를 확인
docker container ls
docker container ls [옵션]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–all, -a | 실행 중/정지 중인 것도 포함하여 모든 컨테이너를 표시 |
–filter, -f | 표시할 컨테이너의 필터링 |
–format | 표시 포맷을 지정 |
–last, -n | 마지막으로 실행된 n건의 컨테이너만 표시 |
–latest, -l | 마지막으로 실행된 컨테이너만 표시 |
–no-trunc | 정보를 생략하지 않고 표시 |
–quiet, -q | 컨테이너 ID만 표시 |
–size, -s | 파일 크기 표시 |
$ docker container ls
$ docker container ls -a -f name=test1
$ docker container ls -a -f exited=0
docker container ls 명령 결과 | |
항목 | 설명 |
CONTAINDER ID | 컨테이너 ID |
IMAGE | 컨테이너의 바탕이 된 이미지 |
COMMAND | 컨테이너 안에서 실행되고 있는 명령 |
CREATED | 컨테이너 작성 후 경과 시간 |
STATUS | 컨테이너의 상태 (restarting | running | paused | exited) |
PORTS | 할당된 포트 |
NAMES | 컨테이너 이름 |
–formate 옵션; 출력 형식의 지정 |
플레이스 홀더 | 설명 |
.ID | 컨테이너 ID |
.Image | 이미지 ID |
.Command | 실행 명령 |
.CreatedAt | 컨테이너가 작성된 시간 |
.RunningFor | 컨테이너의 가동 시간 |
.Ports | 공개 포트 |
.Status | 컨테이너 상태 |
.Size | 컨테이너 디스크 크기 |
.Names | 컨테이너명 |
.Mounts | 볼륨 마운트 |
.Networks | 네트워크명 |
$ docker container ls -a --format "{{.Names}}: {{.Status}}"
$ docker container ls -a --format "table {{.Names}}\t{{.Status}}\t {{.Mounts}}"
컨테이너 가동 확인(docker container stats)
docker 상에서 작동하는 컨테이너 가동 상태를 확인
docker container stats
docker container stats [컨테이너 식별자]
$ docker container stats webserver
docker container stats 명령 결과 |
항목 | 설명 |
CONTAINER ID | 컨테이너 식별자 |
NAME | 컨테이너명 |
CPU % | CPU 사용률 |
MEM USAGE/LIMIT | 메모리 사용량/컨테이너에서 사용할 수 있는 메모리 제한 |
MEM % | 메모리 사용률 |
NET I/O | 네트워크 I/O |
BLOCK I/O | 블록 I/O |
PIDS | PID(Windows 컨테이너 제외) |
* Ctrl + C; 명령 종료
$ docker container top webserver
컨테이너 시작(docker container start)
정지하고 있는 컨테이너 시작
docker container start
docker container start [옵션] <컨테이너 식별자> [컨테이너 식별자]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–attach, -a | 표준 출력, 표준 오류 출력을 연다. |
–interactive, -i | 컨테이너의 표준 입력을 연다. |
$ docker container start dbb4bbe0f470
컨테이너 정지(docker container stop)
실행 중인 컨테이너를 정지
docker container stop
docker container stop [옵션] <컨테이너 식별자> [컨테이너 식별자]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–time, -t | 컨테이너의 정지 시간을 지정(기본값은 10초) |
$ docker container stop -t 2 dbb4bbe0f470
컨테이너 재시작(docker container restart)
컨테이너를 재시작
docker container restart [옵션] <컨테이너 식별자> [컨테이너 식별자]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–time, -t | 컨테이너의 재시작 시간을 지정(기본값은 10초) |
$ docker container restart -t 2 webserver
컨테이너 삭제(docker container rm)
정지하고 있는 컨테이너를 삭제
docker container rm
docker container rm [옵션] <컨테이너 식별자> [컨테이너 식별자]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–force, -f | 실행 중인 컨테이너를 강제로 삭제 |
–volumes, -v | 할당한 볼륨을 삭제 |
$ docker container rm dbb4bbe0f470
컨테이너 중단/재개(docker container pause/docker container unpause)
실행중인 컨테이너에서 작동 중인 프로세스를 모두 중단
docker container pause/docker container unpause
docker container pause <컨테이너 식별자>
$ docker container pause webserver
$ docker container unpause wbserver
컨테이너 네트워크
네트워크 목록 표시(docker network ls)
docker 네트워크의 목록 확인
docker network ls [옵션]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
-f, –filter=[] | 출력을 필터링한다. |
–no-trunc | 상세 정보를 출력한다. |
-q, –quiet | 네트워크 ID만 표시한다. |
$ docker network ls
필터링에서 이용할 수 있는 키 |
값 | 설명 |
driver | 드라이버 지정 |
id | 네트워크 ID |
label | 네트워크에 설정된 라벨(label=<key> 또는 LAbel=<key>=<value>로 지정한다) |
name | 네트워크명 |
scope | 네트워크의 스코프(swarm/global/local) |
type | 네트워크의 타입(사용자 정의 네트워크 custom/정의 완료 네트워크 builtin) |
$ docker network ls -q --filter driver=bridge
네트워크 작성(docker network create)
새로운 네트워크 작성
docker network create [옵션] 네트워크
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–driver, -d | 네트워크 브리지 또는 오버레이(기본값은 bridge) |
–ip-range | 컨테이너에 할당하는 IP 주소의 범위를 지정 |
–subnet | 서브넷을 CIDR 형식으로 지정 |
–ipv6 | IPv6 네트워크를 유효화할지 말지(true/false) |
-label | 네트워크에 설정하는 라벨 |
$ docker network create --driver=bridge web-network
# docker network ls --filter driver=bridge # 작성한 네트워크 확인, filter=bridge
네트워크 연결(docker network connect/docker network disconnect)
docker 컨테이너를 docker 네트워크에 연결/연결 해제 명령
docker network connect/docker network disconnet
docker network connect [옵션] 네트워크 컨테이너
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–ip | IPv4 주소 |
–ip6 | IPv6 주소 |
–alias | 앨리어스명 |
–link | 다른 컨테이너에 대한 링크 |
$ docker network connect web-network webfront
$ docker container inspect webfront
$ docker container run -itd --name=webp --net=web-network nginx
$ docker network disconnet web-network webfront
네트워크 상세 정보 확인(docker network inspect)
네트워크 상세 정보를 확인
docker network inspect
docker network inspect [옵션] 네트워크
$ docker network inspect web-network
네트워크 삭제(docker network rm)
docker 네트워크 삭제
docker network rm
docker network rm [옵션] 네트워크
$ docker network rm web-network
가동중인 컨테이너 조작
실제 환경에서 운용할 때 이미 가동 중인 컨테이너의 상태를 확인하거나 임의의 프로세스를 실행시킬 때 하는 조작
가동 컨테이너 연결(docker container attach)
가동 중인 컨테이너에 연결할 때. 연결한 컨테이너를 종료하려면 Ctrl+C, 컨테이너를 시작한 채로 컨테이너 안에서 움직이는 프로세스만 종료하려면 Ctrl+P, Ctrl+Q 입력.
docker container attach
$ docker container attach sample
가동 컨테이너에서 프로세스 실행(docker container exec)
docker container exec
docker container exec [옵션] <컨테이너 식별자> <실행할 명령> [인수]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–detach, -d | 명령을 백그라운드에서 실행한다. |
–interactive, -i | 컨테이너의 표준 입력을 연다. |
–tty, -t | tty(단말 디바이스)를 사용한다. |
–user, -u | 사용자명을 지정한다. |
$ docker container exec -it webserver /bin/bash
$ docker container exec -it webserver /bin/echo "Hello world"
가동 컨테이너의 프로세스 확인(docker container top)
가동 중인 컨테이너에서 실행되고 있는 프로세스 확인
docker container top
$ docker container top webserver
가동 컨테이너의 포트 전송 확인(docker container port)
가동 중인 컨테이너에서 실행되고 있는 프로세스가 전송되고 있는 포트를 확인
docker container port
$ docker container port webserver
주요 Linux 배포판에서의 잘 알려진 포트 | | |
번호 | TCP/IP | 서비스/프로토콜 | 설명 |
20 | TCP | FTP(데이터) | 파일 전송(데이터) |
21 | TCP | FTP(제어) | 파일 전송(제어) |
22 | TCP/UDP | ssh | 시큐어쉘 |
23 | TCP | Telnet | 원격 액세스 |
25 | TCP/UDP | SMTP | 메일 전송 |
43 | TCP | WHOIS | 도메인 정보 검색 |
53 | TCP/UDP | DNS | 도메인 이름 시스템 |
80 | TCP/UDP | HTTP | 웹 액세스 |
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 | FTP(데이터) | FTP(데이터)의 암호화 통신 |
990 | TCP/UDP | FTP(제어) | FTP(제어)의 암호화 통신 |
992 | TCP/UDP | Telnets | Telnet의 암호화 통신 |
993 | TCP | IMAPS | IMAP의 암호화 통신 |
995 | TCP | POP3S | POP3의 암호화 통신 |
컨테이너 이름 변경(docker container rename)
컨테이너 이름 변경
docker container rename
$ docker container rename old new
컨테이너 안의 파일을 복사(docker container cp)
컨테이너 안의 파일을 호스트에 복사
docker container cp
docker container cp <컨테이너 식별자>:<컨테이너 안의 파일 경로> <호스트의 디렉토리 경로>
docker container cp <호스트 파일> <컨테이너 식별자>:<컨테이너 안의 파일 경로>
$ docker container cp webserver:/etc/nginx/nginx.conf /tmp/nginx.conf
$ docker container cp ./test.txt webserver:/tmp/test.txt
컨테이너 조작의 차분 확인(docker container diff)
컨테이너 안에서 어떤 조작을 하여 컨테이너가 이미지로부터 생성되었을 때와 달라진 점(차분)을 확인
docker container diff
docker container diff <컨테이너 식별자>
변경의 구분 |
구분 | 설명 |
A | 파일 추가 |
D | 파일 삭제 |
C | 파일 수정 |
$ docker container diff test
이미지 생성
docker 컨테이너를 바탕으로 docker 이미지 작성
컨테이너로부터 이미지 작성(docker container commit)
컨테이너로부터 이미지 작성
docker container commit
docker container commit [옵션] <컨테이너 식별자> [이미지명[:태그명]]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–author, -a | 작성자를 지정한다(ex; Alex Levinealex@domain.com) |
–message, -m | 메시지를 지정한다. |
–change, -c | 커밋 시 Dockerfile 명령을 지정한다. |
–pause, -p | 컨테이너를 일시 정지하고 커밋한다. |
</panel-body>
$ docker container commit -a "Alex Levine" webserver alexlevine/webfront:1.0
$ docker image inspect alexlevine/webfront:1.0
컨테이너를 tar 파일로 출력(docker container export)
가동 중인 컨테이너의 디렉토리/파일들을 모아서 tar 파일 만들기
docker container export
docker container export <컨테이너 식별자>
$ docker container export webserver > latest.tar
$ tar -tf latest.tar
$ tar tf latest.tar | more
tar 파일로부터 이미지 작성(docker image import)
Linux
OS 이미지의 디렉토리/파일로부터 docker 이미지 생성
docker image import
docker image import <파일 또는
URL> | - [이미지명[:태그명]]
docker image import 명령으로 지정할 수 있는 아카이브 파일; tar, tar.gz, tgz, bzip, tar.xz, txz
$ cat latest.tar | docker image import - alexlevine/webfront:1.1
$ docker image ls
이미지 저장(docker image save)
docker 이미지를 tar로 저장
docker image save
docker image save [옵션] <저장 파일명> [이미지명]
$ docker image save -o export.tar tensorflow
$ ls -l
이미지 읽어 들이기(docker image load)
tar 이미지로부터 이미지를 읽음
docker image load
$ docker image load -i export.tar
불필요한 이미지/컨테이너를 일괄 삭제(docker system prune)
사용하지 않는 이미지, 컨테이너, 볼륨, 네트워크를 일괄 삭제
docker system prune
docker system prune [옵션]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–all, -a | 사용하지 않는 리소스를 모두 삭제한다. |
–force, -f | 강제적으로 삭제한다. |
$ docker system prune -a
Dockerfile을 사용한 코드에 의한 서버 구축
Dockerfile을 사용한 구성 관리
베이스가 될 Docker 이미지
Docker 컨테이너 안에서 수행한 조작(명령)
환경변수 등의 설정
Docker 컨테이너 안에서 작동시켜둘 데몬 실행
Dockerfile의 기본 구문 및 작성
Dockerfile의 기본 서식
명령 인수
Dockerfile의 명령 |
명령 | 설명 |
FROM | 베이스 이미지 지정 |
RUN | 명령 실행 |
CMD | 컨테이너 실행 명령 |
LABEL | 라벨 설정 |
EXPOSE | 포트 익스포트 |
ENV | 환경변수 |
ADD | 파일/디렉토리 추가 |
COPY | 파일 복사 |
ENTRYPOINT | 컨테이너 실행 명령 |
VOLUME | 볼륨 마운트 |
USER | 사용자 지정 |
WORKDIR | 작업 디렉토리 |
ARG | Dockerfile 안의 변수 |
ONBUILD | 빌드 완료 후 실행되는 명령 |
STOPSIGNAL | 시스템 콜 시그널 설정 |
HEALTHCHECK | 컨테이너의 헬스 체크 |
SHELL | 기본 쉘 설정 |
Dockerfile 작성
FROM [이미지명]
FROM [이미지명]:[태그명]
FROM [이미지명]@[다이제스트]
Dockerfile의 빌드와 이미지 레이어
Dockerfile로부터 Docker 이미지 만들기
docker build 명령의 서식
docker build -t [생성할 이미지명]:[태그명] [Dockerfile의 위치]
$ docker build -t sample:1.0 /home/docker/sample
$ docker build -t sample -f Dockerfile.base .
Docker 이미지의 레이어 구조
멀티스테이지 빌드를 사용한 애플리케이션 개발
빌드 환경, 제품 환경이 다르므로 멀티스테이지 빌드 기능 사용
Dockerfile 만들기
# 1. Build Image
FROM golang:1.8.4-jessie AS builder
# Install dependencies
WORKDIR /go/src/github.com/alexlevine/greet
RUN go get -d -v github.com/urfave/cli
$ Build modules
COPY main.go .
RUN GOOS=linux go build -a -o greet .
# -------------------------
# 2. Production Image
FROM busybox # 기본적인 Linux 명령들을 하나로 모아 놓은 것으로, 최소한으로 필요한 Linux 쉘 환경을 제공하는 경우 이용
WORKDIR /opt/greet/bin
# Deploy modules
COPY --from=builder /go/src/github.com/alexlevine/greet/ .
ENTRYPOINT ["./greet"]
Docker 이미지의 빌드
$ docker build -t greet .
Docker 컨테이너의 시작
$ docker container run -it --rm greet alex
Hello alex
$ docker container run -it --rm greet --lang=es alex
Hola alex
명령 및 데몬 실행
Dockerfile에서 명령이나 데몬을 실행하는 방법
명령 실행(RUN 실행)
RUN [실행하고 싶은 명령]
Shell 형식으로 기술; 쉘 경유.
Exec 형식으로 기술; 쉘을 경유하지 않고 직접 실행
# Shell 형식
RUN apt-get install -y nginx
# Exec 형식
RUN ["/bin/bash", "-c", "apt-get install -y nginx"]
데몬 실행(CMD 명령)
RUN 명령은 이미지를 작성하기 위해 실행하는 명령을 기술, 이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행하려면 CMD
Dockerfile에는 하나의 CMD 명령. 여러 개 지정시 마지막 명령만 유효
CMD [실행하고 싶은 명령]
Exec 형식으로 기술
Shell 형식으로 기술
ENTRYPOINT 명령의 인수로 CMD 명령 사용
패키지 관리 시스템
YUM(Yellowdog Updater Modified); CentOS, Fedora, Red Hat 계열 → DNF(Dandified Yum)
APT(Advanced Packaging Tool); Debian, Ubuntu, Debian 계열
데몬 실행(ENTRYPOINT 명령)
ENTRYPOINT [실행하고 싶은 명령]
Exec 형식으로 기술
Shell 형식으로 기술
ENTRYPOINT vs. CMD;
CMD; 컨테이너 시작 시에 실행하고 싶은 명령을 정의해도 docker container run 명령 실행 시에 인수로 새로운 명령을 지정한 경우 이것을 우선 실행
ENTRYPOINT; 지정한 명령은 반드시 컨테이너에서 실행, 실행 시에 명령 인수를 지정하고 싶을 때는 CMD 명령과 조합하여 사용.
빌드 완료 후에 실행되는 명령(ONBUILD 명령)
시스템 콜 시그널의 설정(STOPSIGNAL 명령)
컨테이너의 헬스 체크 명령(HEALTHCHECK 명령)
HEALTHCHECK [옵션] CMD 실행할 명령
지정할 수 있는 옵션 |
옵션 | 설명 | 기본값 |
–interval=n | 헬스 체크 간격 | 30s |
–timeout=n | 헬스 체크 타임아웃 | 30s |
–retries=n | 타임아웃 횟수 | 3 |
환경 및 네트워크 설정
Dockerfile 안에서 이용할 수 있는 환경변수나 컨테이너 안에서의 작업 디렉토리 지정
환경변수 설정(ENV 명령)
ENV [key] [value]
ENV [key]=[value]
작업 디렉토리 지정(WORKDIR 명령)
WORKDIR [작업 디렉토리 경로]
RUN, CMD, ENTRYPOINT, COPY, ADD 명령에 대한 작업 디렉토리 지정
사용자 지정(USER 명령)
라벨 지정(LABEL 명령)
포트 설정(EXPOSE 명령)
Dockerfile 내 변수의 설정(ARG 명령)
기본 쉘 설정(SHELL 명령)
파일 설정
파일 및 디렉토리 추가(ADD 명령)
ADD <호스트의 파일 경로> <Docker 이미지의 파일 경로>
ADD [“<호스트의 파일 경로>” “<Docker 이미지의 파일 경로>”]
파일 복사(COPY 명령)
COPY <호스트의 파일 경로> <Docker 이미지의 파일 경로>
COPY [“<호스트의 파일 경로>” “<Docker 이미지의 파일 경로>”]
볼룸 마운트(VOLUME 명령)
Docker 이미지 공개
Docker 이미지의 자동 생성 및 공개
Docker Registry를 사용한 프라이빗 레지스트리 구축
로컬 환경에 Docker 레지스트리 구축하기; Docker Store에 공개되어 있는 공식 이미지 'registry' 사용
Docker 이미지 업로드
Docker 이미지의 다운로드와 작동 확인
클라우드 서비스를 사용한 프라이빗 레지스트리 구축
Google Container Registry 준비하기
Docker 이미지의 업로드
Docker 이미지의 다운로드와 작동 확인
여러 컨테이너의 운용 관리
Docker에서 움직이는 웹 애플리케이션을 제품 환경에서 운용할 때는 애플리케이션 서버, 로그 서버, 프록시 서버 등과 같이 여러 개의 컨테이너들을 연계하여 작동
여러 컨테이너 관리의 개요
웹 3계층 시스템 아키텍처
영구 데이터의 관리
Docker Compose
여러 컨테이너를 모아서 관리하기 위한 툴
docker-compose.yml; 컨테이너의 구성 정보를 정의함으로써 동일 호스트상의 여러 컨테이너를 일괄적으로 관리,
YAML 형식의 파일로 관리.
웹 애플리케이션을 로컬에서 움직여 보자
Compose 구성 파일의 작성; 소스 파일 확인 → 구성 정의
여러 Docker 컨테이너 시작; $ docker-compose up
docker-compose ps
여러 Docker 컨테이너 정지; $ docker-compose stop
docker-compose down; 리소스 삭제
Docker Compose를 사용한 여러 컨테이너의 구성 관리
'Docker Compose'의 구성 관리 파일인 docker-compose.yml 작성 방법
docker-compose.yml의 개요
version: 3.3
Compose 정의 파일의 버전과 DockerEngine의 버전과의 관계 |
Compose 정의 파일의 버전 | Docker Engine의 버전 |
3.3 | 17.06.0 |
3.2 | 17.04.0 |
3.1 | 1.13.1 |
3.0 | 1.13.0 |
2.3 | 17.06.0 |
2.2 | 1.130.0 |
2.1 | 1.12.0 |
2.0 | 1.10.0 |
1.0 | 1.9.1 |
# 버전을 지정
version: "3"
# 서비스 정의
services:
webserver:
image: ubuntu
ports:
- "80:80"
networks:
- webnet
redis:
image: redis
networks:
- webnet
# 네트워크 정의
networks:
webnet:
#데이터 볼륨 정의
volumes:
data-volume:
이미지 지정(image) ===
이미지 빌드(build) ===
컨테이너 안에서 작동하는 명령 지정(command/entrypoint) ===
컨테이너 간 연결(links) ===
컨테이너 간 통신(ports/expose) ===
서비스의 의존관계 정의(depends_on) ===
컨테이너 환경변수 지정(environment/env_file) ===
컨테이너 정보 설정(container_name/labels) ===
컨테이너 데이터 관리(volumes/volumes_from) ===
Docker Compose를 사용한 여러 컨테이너의 운용
Docker Compose의 버전 확인
$ docker-compose --version
Docker COmpose의 기본 명령
Docker Compose의 주요 서브 명령 |
서브 명령 | 설명 |
up | 컨테이너 생성/시작 |
ps | 컨테이너 목록 표시 |
logs | 컨테이너 로그 출력 |
run | 컨테이너 실행 |
start | 컨테이너 시작 |
stop | 컨테이너 정지 |
restart | 컨테이너 재시작 |
pause | 컨테이너 일시 정지 |
unpause | 컨테이너 재개 |
port | 공개 포트 번호 표시 |
config | 구성 확인 |
kill | 실행 중인 컨테이너 강제 정지 |
rm | 컨테이너 삭제 |
down | 리소스 삭제 |
$ docker-compose -f ./sample/docker-compose.yml up
$ docker-compose stop webserver
여러 컨테이너의 생성(up)
docker-compose up [옵션] [서비스명 .]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
-d | 백그라운드에서 실행한다. |
–no-depos | 링크 서비스를 시작하지 않는다. |
–build | 이미지를 빌드한다. |
–no-build | 이미지를 빌드하지 않는다. |
-t, –timeout | 컨테이너의 타임아웃을 초로 지정(기본 10초)한다. |
–scale SERVICE=서비스 수 | 서비스 수를 지정한다. |
docker-compose up –scale [서비스명=수]
여러 컨테이너 확인(ps/logs)
$ docker-compose ps
$ docker-compose -q
$ docker-compose logs
컨테이너에서 명령 실행(run)
$ docker-compose run server_a /bin/bash
여러 컨테이너 시작/정지/재시작(start/stop/restart)
$ docker-compose start
$ docker-compose stop
$ docker-compose restart
$ docker-compose restart server_a
여러 컨테이너 일시 정시/재개(pause/unpause)
$ docker-compose pause
$ docker-compose unpause
서비스의 구성 확인(port/config)
docker-compose port [옵션] <서비스명> <프라이빗 포트 번호>
지정할 수 있는 주요 옵션 | |
옵션 | 설명 |
–protocol=proto | 프로토콜. tcp 또는 udp |
–index=index | 컨테이너의 인덱스 수 |
$ docker-compose port webserver 80
$ docker-compose config
여러 컨테이너 강제 정지/삭제(kill/rm)
$ docker-compose kill -s SIGINT
$ docker-compose rm
Linux의 시그널;
POSIX.1-1990 규격
Docker Compose의 주요 서브 명령 |
시그널 | 설명 |
SIGHUP | 프로그램 재시작 |
SIGINT | 키보드로 인터럽트, Ctrl+C로 송신할 수 있다. |
SIGQUIT | 키보드에 의한 중지, Ctrl+\로 송신할 수 있다. |
SIGTERM | 프로세스 정상 종료 |
SIGKILL | 프로세스 강제 종료 |
SIGSTOP | 프로세스 일시 정지 |
여러 리소스의 일괄 삭제(down)
docker-compose down [옵션]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–rmi all | 모든 이미지를 삭제 |
–rmi local | 커스텀 태그가 없는 이미지만 삭제 |
-v, –volumes | Compose 정의 파일의 데이터 볼륨을 삭제 |
$ docker-compose down --rmi all
멀티호스트 환경에서 Docker 실행 환경 구축
멀티호스트 환경에서 컨테이너 관리의 개요
멀티호스트 환경과 클러스터링
Docker Machine이란?
웹 애플리케이션을 서비스 공개해 보자
Docker 실행 환경 작성
웹 애플리케이션 전개
Docker 실행 환경 삭제
Docker Machine을 사용한 실행 환경 구축
Docker Machine의 기본 명령
$ docker-machine --version
Docker Machine의 서브 명령 |
서브 명령 | 설명 |
create | 실행 환경 작성 |
ls | 실행 환경 목록 표시 |
status | 실행 환경 상태 표시 |
url | 실행 환경 URL 표시 |
ssh | 실행 환경에 대한 SSH 연결 |
start | 실행 환경 시작 |
stop | 실행 환경 정지 |
restart | 실행 환경 재시작 |
scp | 실행 환경에서 파일 다운로드 |
rm | 실행 환경 삭제 |
kill | 실행 환경 강제 정지 |
ip | 실행 환경 IP 주소 확인 |
inspect | 실행 환경 정보 확인 |
실행 환경 작성(create)
docker-machine create –driver <드라이버명> <작성할 Docker 머신명>
실행 환경 목록 표시(ls/status/url)
docker-machine ls [옵션]
지정할 수 있는 주요 옵션 |
옵션 | 설명 |
–quite, -q | 머신명만 표시한다 |
–filter | 표시할 머신을 필터링한다 |
$ docker-machine status host1
$ docker-machine url host1
실행 환경에 대한 SSH 연결(ssh)
docker-machine ssh 머신명
$ docker-machine ssh host1
실행 환경 시작/정지/재시작(start/stop/restart)
$ docker-machine start host1
$ docker-machine stop host1
$ docker-machine restart host1
실행 환경으로부터 파일 다운로드(scp)
$ docker-machine scp host1:/etc/passwd .
SCP(Secure Copy Protocol); SSH의 기능을 사용하여 파일을 전송하기 위한 명령 Secure Copy Protocol로 인증 정보와 데이터를 암호화하여 네트워크로 전송
실행 환경 삭제(rm/kill)
$ docker-machine rm -f host1
$ docker-machine kill host1
실행 환경 정보 확인(ip/inspect)
$ docker-machine ip host1
docker-machine inspect [옵션] 머신명
클라우드를 사용한 Docker 실행 환경 구축
GKE(Google Kubernetes Engine)
클라우드 환경에서 Docker 오케스트레이션하기
분산 환경에서의 컨테이너 운용 관리
Kubernetes
Docker Enging(Swarm 모드)
Apache Mesos, Marathon
퍼블릭 클라우드가 제공하는 매니지드 서비스
Amazon EC2 Container Service
Azure Container Service(AKS)
Google Kubernetes Engine(GKE)
Kubernetes의 개요
여러 서버들에서의 컨테이너 관리
컨테이너 간 네트워크 관리
컨테이너의 부하분산
컨테이너의 감시
무정지로 업데이트
Kubernetes의 서버 구성
애플리케이션 구성 관리(Pod, ReplicaSet, Deployment)
Pod(포드)
ReplicaSet(리플리카 셋)
Deployment(디플로이먼트, 전개)
네트워크 관리(Service)
Label을 사용한 리소스 식별
Kubernetes의 구조
마스터(Master);
API Server, Scheduler, Controller Manager
데이터 스토어(etcd)
노드(Node); Kubelet
GCP를 사용한 Docker 애플리케이션 개발
애플리케이션 개발 흐름
소스코드 관리(Cloud Source Repositories)
Docker 이미지 빌드(Cloud Container Builder)
GCP를 사용한 Docker 애플리케이션 실행 환경 구축
Kubernetes 클러스터 구축
애플리케이션의 설정 정보 관리(ConfigMap, Secrets)
앱의 전개(Deployment)
서비스 공개(Service)
앱의 버전업(Blue-Green Deployment)
배치 잡 실행(CronJob)
클라우드를 사용한 Docker 실행 환경의 운용 관리
시스템 운용의 기초 지식
가용성 관리
수용성(Capacity) 관리
시스템 감시
머신의 활동 감시
서비스의 가동 감시
서버/네트워크의 리소스 감시
잡 감시
장애 대응
GKE를 사용한 Docker 실행 환경의 운용
Kubernetes의 스테이터스 확인
클러스터의 상태 확인
노드의 스테이터스 확인
Pod의 상태 확인
서비스 확인
Kubernetes의 Pod 관리
Kubernetes의 노드 관리
Kubernetes의 리소스 작성/삭제/변경
Kubernetes의 업그레이드/다운그레이드
Stackdriver에서 로그 확인
node docker image
$ docker exec -it node bash
nginx-php-fpm docker image
richarvey/nginx-php-fpm
$ docker run --name ngx-php -d richarvey/nginx-php-fpm
$ docker exec -e 'DOMAIN=theta5912.net' -e 'GIT_EMAIL=alex@theta5912.net' -e 'WEBROOT=/var/www/html' -t ngx-php /usr/bin/letsencrypt-setup
$ docker exec -t -i ngx-php /bin/bash
$ docker exec -e 'DOMAIN=theta5912.net'
$ docker exec -e 'GIT_EMAIL=alex@theta5912.net'
$ docker exec -t ngx-php /usr/bin/letsencrypt-setup (90days)
$ docker exec -t ngx-php /usr/bin/letsencrypt-renew
$ docker exec -e ‘DOMAIN=theta5912.net’ -t ngx-php /usr/bin/letsencrypt-renew
$ docker start ngx-php
$ docker commit -a “Alex Levine<alex@theta5912.net>” -m “update dokuwiki, December 29, 2017. Friday” ngx-php
---
setting the timezone
# apk add tzdata
# ls /usr/share/zoneinfo
# cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime
# echo “Asia/Seoul” > /etc/timezone
# date
# apk del tzdata
in dokuwiki
dokuwiki/inc/init.php 88
date_default_timezone_set("Asia/Seoul");
---
# apk update
# apk upgrade
# rm -rf /var/cache/apk/*
---
# export DOMAIN=theta5912.net
# export GIT_EMAIL=alex@theta5912.net
# export WEBROOT=/var/www/html
# /usr/bin/letsencrypt-setup
---
# wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz
# tar xvf dokuwiki-stable.tgz --strip 1
---
cp
host -> container
$ docker cp /path/foo.txt mycontainer:/path/foo.txt
container -> host
$ docker cp mycontainer:/path/foo.txt /path/foo.txt
---
$ docker run -i -t ---name <container name> -v <host directory>
A.1 계정 등록
A.2 프로젝트 작성과 삭제
A.3 Cloud Console 사용법
A.4 Cloud Shell 사용법
A.5 Cloud SDK 설치하기