public:computer:docker

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
public:computer:docker [2021/08/04 22:11] alexpublic:computer:docker [2021/08/08 21:00] (current) – [A.3 Cloud Console 사용법] alex
Line 106: Line 106:
  
 ===== 컨테이너 기술과 Docker 개요 ===== ===== 컨테이너 기술과 Docker 개요 =====
-  * 컨테이너 +  * 컨테이너; 호스트 OS 상에 논리적인 구획(컨테이너)을 만들고, 애플리케이션을 작동시키기 위해 필요한 라이브러리나 애플리케이션 등을 하나로 모아, 마치 별도의 서비인 것처럼 사용할 수 있게 만든 것. 
-  * Docker+  * 서버 가상화 
 +    * 호스트형 서버 가상화; Oracle VM Virtual Box, VMware VMware Workstation player 등 
 +    * 하이퍼바이저형 서버 가상화; Microsoft Windows Server의 'Hyper-V', Citrix 'XenServer' 
 +  * Docker; 애플리케이션의 실행에 필요한 환경을 하나의 이미지로 모아두고, 그 이미지를 사용하여 다양한 환경에서 애플리케이션 실행 환경을 구축 및 운용하기 위한 오픈소스 플랫폼. https://www.docker.com/ 
 +  * 웹 시스템 개발 시 애플리케이션을 제품 환경에서 가동시키기 위해 필요한 요소 
 +    * 애플리케이션의 실행 모듈(프로그램 본체) 
 +    * 미들웨어나 라이브러리군 
 +    * OS/네트워크 등과 같은 인프라 환경 설정
   * Docker 기능;   * Docker 기능;
     * Docker 이미지를 만드는 기능(Build)     * Docker 이미지를 만드는 기능(Build)
     * Docker 이미지를 공유하는 기능 (Ship)     * Docker 이미지를 공유하는 기능 (Ship)
     * Docker 컨테이너를 작동시키는 기능 (Run)     * Docker 컨테이너를 작동시키는 기능 (Run)
 +  * Docker 컴포넌트
 +    * Docker Enging; Docker의 핵심 기능
 +    * Docker Registry; 이미지 공개 및 공유
 +    * Docker Compose; 컨테이너 일원 관리
 +    * Docker Machine; Docker 실행 환경 구축
 +    * Docker Swarm; 클러스터 관리
   * Docker의 작동 구조   * Docker의 작동 구조
-    * 컨테이너를 구획하는 장치 (namespace) +    * 컨테이너를 구획하는 장치 (namespace); PID namespace, Network namespace, UID namespace, MOUNT namespace, UTS namespace, IPC namespace 
-    * 릴리스 관리 장치 (cgroups)+    * 릴리스 관리 장치 (cgroups)
     * 네트워크 구성(가상 브리지/가상 NIC)     * 네트워크 구성(가상 브리지/가상 NIC)
-    * Docker 이미지의 데이터 관리 장치+    * Docker 이미지의 데이터 관리 장치; AUFS, Btrfs, Device Mapper, OverlayFS, ZFS
  
 +  * NAT(Network Address Translation); 프라이빗 네트워크 상의 컴퓨터와 인터넷 상의 서버간 통신이 성립되도록 변환하는 기술 글로벌 IP 주소와 프라이빗 IP 주소를 1:1로 변환.
 +  * NAPT(Network Address Port Translation) (IP 마스커레이드); 프라이빗 IP 주소와 함께 포트 번호도 함께 변환하는 기술
  
 ===== Getting started docker ===== ===== Getting started docker =====
Line 128: Line 143:
   * nginx 동작 예제; docker 이미지 다운로드 -> nginx 작동 -> nginx 작동 확인 -> nginx 기동 정지   * nginx 동작 예제; docker 이미지 다운로드 -> nginx 작동 -> nginx 작동 확인 -> nginx 기동 정지
    
 +<grid>
 +<col sm="8">
 +<panel type="default" title="'hello world' on docker" no-body="true">
 +<well>docker containder run <Docker 이미지명> <실행할 명령></well>
 +<cli prompt="$ " comment="# ">
 +$ docker containder run ubuntu:latest /bin/echo 'Hello world'  # ubuntu 이미지를 바탕으로 docker 컨테이너를 작성 및 실행한 후 작성한 컨테이너 안에서 "Hello world" 표시
 +$ docker version  # docker 버전, go 언어 버전, os, 아키텍처 등을 확인
 +$ docker system info  # docker 실행 환경의 상세 설정 표시
 +$ docker system df  # docker가 사용하고 있는 디스크의 이용 상황 표시
 +</cli>
 +</panel>
 +</col>
 +</grid>
 +
 +<grid>
 +<col sm="8">
 +<panel type="default" title="nginx 작동 예제" no-body="true">
 +<cli prompt="$ " comment="# ">
 +$ docker pull nginx  # nginx 이미지 다운로드
 +$ docker image ls  # 다운로드 한 이미지 확인
 +$ docker container run --name webserver -d -p 80:80 nginx  # 이미지를 사용하여 nginx 서버를 가동, 웹 브라우저에서 http://localhost:80 으로 접속하여 작동 확인
 +$ docker container ps  # nginx 서버의 상태를 확인
 +$ docker container stats webserver  # 컨테이너 가동 확인
 +$ docker stop webserver  # 컨테이너 정지
 +$ docker start webserver  # 컨테이너 기동
 +</cli>
 +</panel>
 +</col>
 +</grid>
  
 ---- ----
Line 135: Line 179:
   * https://hub.docker.com   * https://hub.docker.com
 === 이미지 다운로드(docker image pull) === === 이미지 다운로드(docker image pull) ===
 +> docker hub에서 이미지 다운로드
 <grid> <grid>
 <col sm="8"> <col sm="8">
Line 151: Line 196:
 </col> </col>
 </grid> </grid>
 +
 === 이미지 목록 표시(docker image ls) === === 이미지 목록 표시(docker image ls) ===
 +> 취득한 이미지의 목록 표시
 <grid> <grid>
 <col sm="8"> <col sm="8">
Line 178: Line 225:
 </col> </col>
 </grid> </grid>
 +
 +  * DCT(Docker Content Trust)
 +<grid>
 +<col sm="8">
 +<cli prompt="$ " comment="# ">
 +$ export DOCKER_CONTENT_TRUST = 1  # DCT 기능의 유효화, 서명 된 이미지를 다운로드 할 때 이미지 작성자의 공개키를 사용하여 이미지가 진짜인지 아닌지 확인. 만일 변조된 경우 그 이미지를 무효로 만듦. 이 공개키를 Tagging Key라고 함.
 +$ export DOCKER_CONTENT_TRUST = 0  # DCT 기능의 무효화
 +</cli>
 +</col>
 +</grid>
 +
 === 이미지 상세 정보 확인(docker image inspect) === === 이미지 상세 정보 확인(docker image inspect) ===
 +> 이미지 상세 정보 확인
 +<grid>
 +<col sm="8">
 +<cli prompt="$ " comment="# ">
 +$ docker image inspect centos: # centos:7 이미지 상세 정보 확인
 +$ docker image inspect --format="{{ .Os}}" centos: # OS 정보 취득
 +$ docker image inspect --format="{{ .ContainderConfig.Image }}" centos: # image 정보 취득 
 +</cli>
 +</col>
 +</grid>
 +  * 결과는 JSON(JavaScrip Object Notation) 형식으로 표시
 +    - 이미지 ID
 +    - 작성일
 +    - Docker 버전
 +    - CPU 아키텍처
 +
  
 === 이미지 태그 설정(docker image tag) === === 이미지 태그 설정(docker image tag) ===
 +> 이미지에 표식이 되는 태그를 붙임
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker image tag" no-body="true">
 +<panel-body>
 +<cli prompt="$ " comment="# ">
 +<Docker Hub 사용자명>/이미지명:[태그명]
 +</cli>
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker image tag nginx alexlevine/webserver:1.0  # alexlevine 사용자명의 webserver 이미지에 1.0의 태그 설정
 +</cli>
 +</panel>
 +</col>
 +</grid>
  
 === 이미지 검색(docker search) === === 이미지 검색(docker search) ===
 +> docker hub에 공개되어 있는 이미지 검색
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker search" no-body="true">
 +<panel-body>
 +<cli prompt="$ " comment="# ">
 +docker search [옵션] <검색 키워드>
 +</cli>
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --no-trunc  | 결과를 모두 표시  |
 +| --limit  | n건의 검색 결과를 표시  |
 +| --fileter=stars=n  | 즐겨찾기의 수(n 이상)를 지정  |
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker search nginx  # Docker Hub에 공개되어 있는 이미지 검색
 +</cli>
 +^  docker search 명령 결과  ^^
 +^ 항목  ^ 설명  ^
 +| NAME  | 이미지 이름  |
 +| DESCRIPTION  | 이미지 설명  |
 +| STARS  | 즐겨찾기 수  |
 +| OFFICIAL  | 공식 이미지인지 아닌지  |
 +| AUTOMATED  | Dockerfile을 바탕으로 자동 생성된 이미지인지 아닌지  |
 +</panel>
 +</col>
 +</grid>
  
 === 이미지 삭제(docker image rm) === === 이미지 삭제(docker image rm) ===
 +> 작성한 이미지 삭제
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker image rm" no-body="true">
 +<panel-body>
 +<cli prompt="$ " comment="# ">
 +docker image rm [옵션] 이미지명 [이미지명]
 +</cli>
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --force, -f  | 이미지를 강제로 삭제  |
 +| --no-prune  | 중간 이미지를 삭제하지 않음  |
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker image rm nginx  # nginx 이미지 삭제
 +</cli>
 +</panel>
 +</col>
 +</grid>
 +
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker image prune" no-body="true">
 +<panel-body>
 +  * 사용하지 않은 Docker 이미지 삭제
 +<cli prompt="$ " comment="# ">
 +docker image prune [옵션]
 +</cli>
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --all, -a  | 사용하지 않은 이미지를 모두 삭제  |
 +| --force, -f  | 이미지를 강제로 삭제  |
 +</panel-body>
 +</panel>
 +</col>
 +</grid>
  
 === Docker Hub에 로그인(docker login) === === Docker Hub에 로그인(docker login) ===
 +> docker 리포지토리에 업로드하기 위해 docker에 로그인
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker login" no-body="true">
 +<panel-body>
 +<cli prompt="$ " comment="# ">
 +docker login [옵션] [서버]
 +</cli>
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명 ^
 +| --password, -p  | 비밀번호  |
 +| --username, -u  | 사용자명  |
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker login
 +Username: [등록한 사용자명]
 +Password: [등록한 비밀번호]
 +Login Succeeded
 +</cli>
 +</panel>
 +</col>
 +</grid>
  
 === 이미지 업로드(docker image push) === === 이미지 업로드(docker image push) ===
 +> docker hub에 이미지 업로드
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker image push" no-body="true">
 +<panel-body>
 +<cli prompt="$ " comment="# ">
 +docker image push 이미지명[:태그명]
 +</cli>
 +  * 이미지명; <Docker Hub 사용자명>/이미지명:[태그명]
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker image push alexlevine/webserver:1.0
 +</cli>
 +</panel>
 +</col>
 +</grid>
  
 === Docker Hub에서 로그아웃(docker logout) === === Docker Hub에서 로그아웃(docker logout) ===
 +> docker hub에서 로그아웃 
 +<grid> 
 +<col sm="8"> 
 +<panel type="default" title="docker logout" no-body="true"> 
 +<panel-body> 
 +<cli prompt="$ " comment="# "> 
 +docker logout [서버명] 
 +</cli> 
 +</panel-body> 
 +</panel> 
 +</col> 
 +</grid>
  
  
Line 197: Line 398:
 ==== 컨테이너 생성/시작/정지 ==== ==== 컨테이너 생성/시작/정지 ====
 === Docker 컨테이너의 라이프 사이클 === === Docker 컨테이너의 라이프 사이클 ===
 +  * 컨테이너 생성; docker container create
 +  * 컨테이너 생성 및 시작; docker container run
 +  * 컨테이너 시작; docker container start
 +  * 컨테이너 정지; docker container stop
 +  * 컨테이너 삭제; docker container rm
  
 === 컨테이너 생성 및 시작(docker container run) === === 컨테이너 생성 및 시작(docker container run) ===
 +> 컨테이너의 생성 및 시작
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container run" no-body="true">
 +<panel-body>
 +<alert type="info">
 +docker container run [옵션] 이미지명[:태그명] [인수]
 +</alert>
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --attach, -a  | 표준 입력(STDIN), 표준 출력(STDOUT), 표준 오류 출력(STDERR)에 어태치한다.  |
 +| --cidfile  | 컨테이너 ID를 파일로 출력한다.  |
 +| --detach, -d  | 컨테이너를 생성하고 백그라운드에서 실행한다.  |
 +| --interactive, -i  | 컨테이너의 표준 입력을 연다.  |
 +| --try, -t  | 단말기 디바이스를 사용한다.  |
 +</panel-body>
 +<cli prompt="$ " comment="  # ">
 +$ 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  # bash 실행
 +</cli>
 +</panel>
 +</col>
 +</grid>
  
 === 컨테이너의 백그라운드 실행(docker container run) === === 컨테이너의 백그라운드 실행(docker container run) ===
 +> docker를 이용하는 경우의 대부분은 컨테이너에 서버 기능을 가지게 해서 실행하는 경우, 대화식이 아닌 백그라운드에서 실행
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container run" no-body="true">
 +<panel-body>
 +<alert type="info">docker container run [실행 옵션] 이미지명[:태그명] [인수]</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --detach, -d  | 백그라운드에서 실행  |
 +| --user, -u  | 사용자명을 지정  |
 +| --restart=[no%%|%%on-failure%%|%%on-failure:횟수n%%|%%always%%|%%unless-stopped]  | 명령의 실행 결과에 따라 재시작을 하는 옵션  |
 +| --rm  | 명령 실행 완료 후에 컨테이너를 자동으로 삭제  |
 +
 +</panel-body>
 +<cli prompt="$ " comment="  # ">
 +$ docker container run -d centos /bin/ping localhost
 +  # docker container run; 컨테이너를 생성 및 실행
 +  # -d; 백그라운드에서 실행하는 옵션
 +  # centos; 이미지명
 +  # /bin/ping localhost; 컨테이너에서 실행할 명령
 +fbcdab0e9417.....
 +$ docker container logs -t fbcdab0e9417  # 컨테이너의 로그 확인
 +</cli>
 +^  restart 옵션  ^^
 +^ 설정값  ^ 설명  ^
 +| no  | 재시작하지 않는다.  |
 +| on-failure  | 종료 스테이터스가 0이 아닐 때 재시작한다.  |
 +| on-failure:횟수n  | 종료 스테이터스가 0이 아닐 때 n번 재시작한다.  |
 +| always  | 항상 재시작한다.  |
 +| unless-stopped  | 최근 컨테이너가 정지 상태가 아니라면 항상 재시작한다.  |
 +
 +<cli prompt="$ " comment="#  ">
 +$ docker container run -it --restart=always centos /bin/bash  # 컨테이너를 항상 재시작
 +</cli>
 +</panel>
 +</col>
 +</grid>
  
 === 컨테이너의 네트워크 설정(docker container run) === === 컨테이너의 네트워크 설정(docker container run) ===
 +> 컨테이너의 네트워크를 설정
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container run" no-body="true">
 +<panel-body>
 +<alert type="info">docker container run [네트워크 옵션]: 이미지명[:태그명] [인수]</alert>
 +^  지정할 수 있는 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --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  | 호스트의 임의의 포트를 컨테이너에 할당  |
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker container run -d --dns 192.168.1.1 nginx  # 컨테이너의 DNS 서버 지정
 +$ docker container run -d --mac-address="92:d0:c6:0a:29:33" centos  # MAC 주소 지정
 +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  # 호스트명과 IP 주소 정의
 +$ docker container run -it --hostname www.test.com --add-host node1.test.com:6 192.168.1.1 centos  # 호스트명 설정
 +</cli>
 +
 +^  --net 옵션의 지정  ^^
 +^ 설정값  ^ 설명  ^
 +| bridge  | 브리지 연결(기본값)을 사용한다.  |
 +| none  | 네트워크에 연결하지 않는다.  |
 +| container:[name%%|%%id]  | 다른 컨테이너의 네트워크를 사용한다.  |
 +| host  | 컨테이너가 호스트 OS의 네트워크를 사용한다.  |
 +| NETWORK  | 사용자 정의 네트워크를 사용한다.  |
 +
 +  * 사용자 정의 네트워크 작성
 +<cli prompt="$ " comment="# ">
 +$ docker network create -d bridge webap-net
 +$ docker container run --net=webap-net -it centos
 +</cli>
 +</panel>
 +</col>
 +</grid>
  
 === 자원을 지정하여 컨테이너 생성 및 실행(docker container run) === === 자원을 지정하여 컨테이너 생성 및 실행(docker container run) ===
 +> CPU나 메모리와 같은 자원을 지정하여 컨테이너를 생성 및 실행
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container run" no-body="true">
 +<panel-body>
 +<alert type="info">docker container run [자원 옵션] 이미지명[:태그명] [인수]</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +| --cpu-shares, -c  | CPU의 사용 배분(비율)  |
 +| --memory, -m  | 사용할 메모리를 제한하여 실행 \\ (단위는 b, k, m, g 중 하나)  |
 +| --volume=[호스트의 디렉토리]:[컨테이너의 디렉토리], -v  | 호스트와 컨테이너의 디렉토리를 공유 
 +</panel-body>
 +
 +<cli prompt="$ " comment="# ">
 +$ docker container run --cpu-shares=512 --memory=1g centos  # CPU 시간의 상대 비율과 메모리 사용량을 지정
 +$ docker container run -v /Users/alex/webap:/usr/share/nginx/html nginx  # 디렉토리 공유
 +</cli>
 +</panel>
 +</col>
 +</grid>
  
 === 컨테이너를 생성 및 시작하는 환경을 지정(docker container run) === === 컨테이너를 생성 및 시작하는 환경을 지정(docker container run) ===
 +> 컨테이너의 환경변수나 컨테이너 안의 작업 디렉토리 등을 지정하여 컨테이너를 생성/실행
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container run" no-body="true">
 +<panel-body>
 +<alert type="info">docker container run [환경설정 옵션] 이미지명[:태그명] [인수]</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --env=[환경변수], -e  | 환경변수를 설정한다.  |
 +| --evn-file=[파일명]  | 환경변수를 파일로부터 설정한다.  |
 +| --read-only=[true%%|%%false]  | 컨테이너의 파일 시스템을 읽기 전용으로 만든다.  |
 +| --workdir=[패스], -w  | 컨테이너의 작업 디렉토리를 지정한다.  |
 +| -u, --user=[사용자명]  | 사용자명 또는 UID를 지정한다.  |
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker container run -it -e foo=bar centos /bin/bash  # 환경변수 foo 설정
 +
 +$ cat env_list  # env_list 파일 생성
 +hoge=fuga
 +foo=bar
 +
 +$ docker container run -it --env-file=env_list centos /bin/bash  # evn_list 파일로 환경변수의 일괄 설정
 +
 +$ docker container run -it -w=/tensorflow centos /bin/bash  # 작업 디렉토리 설정
 +</cli>
 +</panel>
 +</col>
 +</grid>
  
 === 가동 컨테이너 목록 표시(docker container ls) === === 가동 컨테이너 목록 표시(docker container ls) ===
 +> docker 상에서 작동하는 컨테이너의 가동상태를 확인
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container ls" no-body="true">
 +<panel-body>
 +<alert type="info">docker container ls [옵션]</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --all, -a  | 실행 중/정지 중인 것도 포함하여 모든 컨테이너를 표시  |
 +| --filter, -f  | 표시할 컨테이너의 필터링  |
 +| --format  | 표시 포맷을 지정  |
 +| --last, -n  | 마지막으로 실행된 n건의 컨테이너만 표시  |
 +| --latest, -l  | 마지막으로 실행된 컨테이너만 표시  |
 +| --no-trunc  | 정보를 생략하지 않고 표시  |
 +| --quiet, -q  | 컨테이너 ID만 표시  |
 +| --size, -s  | 파일 크기 표시  |
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker container ls  # 컨테이너 목록 표시
 +$ docker container ls -a -f name=test1  # 컨테이너 목록의 필터링
 +$ docker container ls -a -f exited=0
 +</cli>
 +
 +^  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  | 네트워크명  |
 +
 +<cli prompt="$ " comment="# ">
 +$ docker container ls -a --format "{{.Names}}: {{.Status}}"  # 컨테이너 목록의 출력 형식 지정
 +$ docker container ls -a --format "table {{.Names}}\t{{.Status}}\t {{.Mounts}}"  # 컨테이너 목록을 표 형식으로 출력
 +</cli>
 +
 +
 +</panel>
 +</col>
 +</grid>
 +
 +
  
 === 컨테이너 가동 확인(docker container stats) === === 컨테이너 가동 확인(docker container stats) ===
 +> docker 상에서 작동하는 컨테이너 가동 상태를 확인
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container stats" no-body="true">
 +<panel-body>
 +<alert type="info">docker container stats [컨테이너 식별자]</alert>
 +</panel-body>
 +
 +<cli prompt="$ " comment="# ">
 +$ docker container stats webserver  # 컨테이너 가동 확인
 +</cli>
 +
 +^  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; 명령 종료
 +
 +<cli prompt="$ " comment="# ">
 +$ docker container top webserver  # 프로세스 확인
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
  
 === 컨테이너 시작(docker container start) === === 컨테이너 시작(docker container start) ===
 +> 정지하고 있는 컨테이너 시작 
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container start" no-body="true">
 +<panel-body>
 +<alert type="info">docker container start [옵션] <컨테이너 식별자> [컨테이너 식별자]</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --attach, -a  | 표준 출력, 표준 오류 출력을 연다.  |
 +| --interactive, -i  | 컨테이너의 표준 입력을 연다.  |
 +
 +
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker container start dbb4bbe0f470  # 컨테이너 ID가 dbb4bbe0f470인 컨테이너 시작
 +</cli>
 +</panel>
 +</col>
 +</grid>
  
 === 컨테이너 정지(docker container stop) === === 컨테이너 정지(docker container stop) ===
 +> 실행 중인 컨테이너를 정지
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container stop" no-body="true">
 +<panel-body>
 +<alert type="info">docker container stop [옵션] <컨테이너 식별자> [컨테이너 식별자]</alert>
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --time, -t  | 컨테이너의 정지 시간을 지정(기본값은 10초)  |
 +
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker container stop -t 2 dbb4bbe0f470
 +</cli>
 +
 +  * docker container kill; 강제적으로 컨테이너를 정지시킬 때
 +</panel>
 +</col>
 +</grid>
  
 === 컨테이너 재시작(docker container restart) === === 컨테이너 재시작(docker container restart) ===
 +> 컨테이너를 재시작
 +<grid>
 +<col sm="8">
 +<panel type="default" title="" no-body="true">
 +<panel-body>
 +<alert type="info">docker container restart [옵션] <컨테이너 식별자> [컨테이너 식별자]</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --time, -t  | 컨테이너의 재시작 시간을 지정(기본값은 10초)  |
 +
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker container restart -t 2 webserver
 +</cli>
 +
 +  * docker container run --restart; 컨테이너 안에서 실행하는 명령의 종료 스테이터스(정상 종료되었는지 아닌지)에 따라 컨테이너를 자동으로 재시작하고 싶은 경우.
 +</panel>
 +</col>
 +</grid>
  
 === 컨테이너 삭제(docker container rm) === === 컨테이너 삭제(docker container rm) ===
 +> 정지하고 있는 컨테이너를 삭제
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container rm" no-body="true">
 +<panel-body>
 +<alert type="info">docker container rm [옵션] <컨테이너 식별자> [컨테이너 식별자]</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --force, -f  | 실행 중인 컨테이너를 강제로 삭제  |
 +| --volumes, -v  | 할당한 볼륨을 삭제  |
 +
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker container rm dbb4bbe0f470  # 컨테이너 삭제
 +</cli>
 +</panel>
 +</col>
 +</grid>
  
 === 컨테이너 중단/재개(docker container pause/docker container unpause) === === 컨테이너 중단/재개(docker container pause/docker container unpause) ===
 +> 실행중인 컨테이너에서 작동 중인 프로세스를 모두 중단
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container pause/docker container unpause" no-body="true">
 +<panel-body>
 +<alert type="info">docker container pause <컨테이너 식별자></alert>
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker container pause webserver  # 컨테이너 중단
 +$ docker container unpause wbserver  # 중단 컨테이너 재개
 +</cli>
 +</panel>
 +</col>
 +</grid>
 +
  
  
Line 227: Line 775:
  
 ==== 컨테이너 네트워크 ==== ==== 컨테이너 네트워크 ====
 +  * docker 컨테이너 끼리 통신을 할 때는 docker 네트워크를 통해 수행
 +
 +
 === 네트워크 목록 표시(docker network ls) === === 네트워크 목록 표시(docker network ls) ===
 +> docker 네트워크의 목록 확인
 +<grid>
 +<col sm="8">
 +<panel type="default" title="" no-body="true">
 +<panel-body>
 +<alert type="info">docker network ls [옵션]</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| -f, --filter=[]  | 출력을 필터링한다.  |
 +| --no-trunc  | 상세 정보를 출력한다.  |
 +| -q, --quiet  | 네트워크 ID만 표시한다.  |
 +
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker network ls
 +</cli>
 +
 +^  필터링에서 이용할 수 있는 키  ^^
 +^ 값  ^ 설명  ^
 +| driver  | 드라이버 지정  |
 +| id  | 네트워크 ID  |
 +| label  | 네트워크에 설정된 라벨(label=<key> 또는 LAbel=<key>=<value>로 지정한다)  |
 +| name  | 네트워크명  |
 +| scope  | 네트워크의 스코프(swarm/global/local)  |
 +| type  | 네트워크의 타입(사용자 정의 네트워크 custom/정의 완료 네트워크 builtin)  |
 +
 +<cli prompt="$ " comment="# ">
 +$ docker network ls -q --filter driver=bridge  # 네트워크 목록 표시의 필터링
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
 +  * 오버레이 네트워크(overlay network); 물리 네트워크 상에서 소프트웨어적으로 에뮬레이트한 네트워크. 물리 네트워크를 덮듯이 가상 네트워크가 구성된다는 점에서 가상 네트워크라라고도 함. 물리 네트워크의 구조가 은폐되어 그 아래에 있는 물리 계층의 형태나 제어 방식 등을 의식하지 않고 이용할 수 있다는 것이 특징. 예를 들어 여러 개의 호스트에 걸친 네트워크를 구성할 때 사용. 소프트웨어로 구성된 네트워크이므로 물리 작업을 수반하지 않고 자유롭게 구성을 변경할 수 있다는 장점.
  
 === 네트워크 작성(docker network create) === === 네트워크 작성(docker network create) ===
 +> 새로운 네트워크 작성
 +<grid>
 +<col sm="8">
 +<panel type="default" title="" no-body="true">
 +<panel-body>
 +<alert type="info">docker network create [옵션] 네트워크</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --driver, -d  | 네트워크 브리지 또는 오버레이(기본값은 bridge)  |
 +| --ip-range  | 컨테이너에 할당하는 IP 주소의 범위를 지정  |
 +| --subnet  | 서브넷을 CIDR 형식으로 지정  |
 +| --ipv6  | IPv6 네트워크를 유효화할지 말지(true/false)  |
 +| -label  | 네트워크에 설정하는 라벨  |
 +
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker network create --driver=bridge web-network  # web-network라는 이름의 브리지 네트워크 작성
 +# docker network ls --filter driver=bridge  # 작성한 네트워크 확인, filter=bridge
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
  
 === 네트워크 연결(docker network connect/docker network disconnect) === === 네트워크 연결(docker network connect/docker network disconnect) ===
 +> docker 컨테이너를 docker 네트워크에 연결/연결 해제 명령
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker network connect/docker network disconnet" no-body="true">
 +<panel-body>
 +<alert type="info">docker network connect [옵션] 네트워크 컨테이너</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --ip  | IPv4 주소  |
 +| --ip6  | IPv6 주소  |
 +| --alias  | 앨리어스명  |
 +| --link  | 다른 컨테이너에 대한 링크  |
 +
 +</panel-body>
 +
 +<cli prompt="$ " comment="# ">
 +$ 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  # 네트워크에 대한 연결 해제 
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
  
 === 네트워크 상세 정보 확인(docker network inspect) === === 네트워크 상세 정보 확인(docker network inspect) ===
 +> 네트워크 상세 정보를 확인
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker network inspect" no-body="true">
 +<panel-body>
 +<alert type="info">docker network inspect [옵션] 네트워크</alert>
 +
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker network inspect web-network  # 네트워크 상세 정보 표시
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
  
 === 네트워크 삭제(docker network rm) === === 네트워크 삭제(docker network rm) ===
 +> docker 네트워크 삭제
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker network rm" no-body="true">
 +<panel-body>
 +<alert type="info">docker network rm [옵션] 네트워크</alert>
 +
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker network rm web-network
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
  
  
Line 242: Line 909:
  
 ==== 가동중인 컨테이너 조작 ==== ==== 가동중인 컨테이너 조작 ====
 +> 실제 환경에서 운용할 때 이미 가동 중인 컨테이너의 상태를 확인하거나 임의의 프로세스를 실행시킬 때 하는 조작 
 +
 +
 === 가동 컨테이너 연결(docker container attach) === === 가동 컨테이너 연결(docker container attach) ===
 +> 가동 중인 컨테이너에 연결할 때. 연결한 컨테이너를 종료하려면 Ctrl+C, 컨테이너를 시작한 채로 컨테이너 안에서 움직이는 프로세스만 종료하려면 Ctrl+P, Ctrl+Q 입력.
 +
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container attach" no-body="true">
 +
 +<cli prompt="$ " comment="# ">
 +$ docker container attach sample  # 컨테이너에 연결 
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
 +
  
 === 가동 컨테이너에서 프로세스 실행(docker container exec) === === 가동 컨테이너에서 프로세스 실행(docker container exec) ===
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container exec" no-body="true">
 +<panel-body>
 +<alert type="info">docker container exec [옵션] <컨테이너 식별자> <실행할 명령> [인수]</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --detach, -d  | 명령을 백그라운드에서 실행한다.  |
 +| --interactive, -i  | 컨테이너의 표준 입력을 연다.  |
 +| --tty, -t  | tty(단말 디바이스)를 사용한다.  |
 +| --user, -u  | 사용자명을 지정한다.  |
 +
 +</panel-body>
 +
 +<cli prompt="$ " comment="# ">
 +$ docker container exec -it webserver /bin/bash  # 컨테이너에서 bash 실행
 +$ docker container exec -it webserver /bin/echo "Hello world"  # 컨테이너에서 echo 실행
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
 +
  
 === 가동 컨테이너의 프로세스 확인(docker container top) === === 가동 컨테이너의 프로세스 확인(docker container top) ===
 +> 가동 중인 컨테이너에서 실행되고 있는 프로세스 확인
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container top" no-body="true">
 +
 +<cli prompt="$ " comment="# ">
 +$ docker container top webserver  # 프로세스 확인 
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
  
 === 가동 컨테이너의 포트 전송 확인(docker container port) === === 가동 컨테이너의 포트 전송 확인(docker container port) ===
 +> 가동 중인 컨테이너에서 실행되고 있는 프로세스가 전송되고 있는 포트를 확인
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container port" no-body="true">
 +
 +<cli prompt="$ " comment="# ">
 +$ docker container port webserver 
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
 +^  주요 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/ | 인터넷 메일 액세스  |
 +| 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) ===
 +> 컨테이너 이름 변경
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container rename" no-body="true">
 +
 +<cli prompt="$ " comment="# ">
 +$ docker container rename old new 
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
  
 === 컨테이너 안의 파일을 복사(docker container cp) === === 컨테이너 안의 파일을 복사(docker container cp) ===
 +> 컨테이너 안의 파일을 호스트에 복사
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container cp" no-body="true">
 +<panel-body>
 +<alert type="info">docker container cp <컨테이너 식별자>:<컨테이너 안의 파일 경로> <호스트의 디렉토리 경로></alert>
 +<alert type="info">docker container cp <호스트 파일> <컨테이너 식별자>:<컨테이너 안의 파일 경로></alert>
 +
 +</panel-body>
 +
 +<cli prompt="$ " comment="# ">
 +$ docker container cp webserver:/etc/nginx/nginx.conf /tmp/nginx.conf  # 컨테이너에서 호스트로 파일 복사
 +$ docker container cp ./test.txt webserver:/tmp/test.txt  # 호스트에서 컨테이너로 파일 복사 
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
  
 === 컨테이너 조작의 차분 확인(docker container diff) === === 컨테이너 조작의 차분 확인(docker container diff) ===
 +> 컨테이너 안에서 어떤 조작을 하여 컨테이너가 이미지로부터 생성되었을 때와 달라진 점(차분)을 확인
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container diff" no-body="true">
 +<panel-body>
 +<alert type="info">docker container diff <컨테이너 식별자></alert>
 +
 +^  변경의 구분  ^^
 +^ 구분  ^ 설명  ^
 +| A  | 파일 추가  |
 +| D  | 파일 삭제  |
 +| C  | 파일 수정  |
 +
 +</panel-body>
 +
 +<cli prompt="$ " comment="# ">
 +$ docker container diff test
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
  
  
Line 262: Line 1080:
  
 ==== 이미지 생성 ==== ==== 이미지 생성 ====
 +> docker 컨테이너를 바탕으로 docker 이미지 작성
 +
 === 컨테이너로부터 이미지 작성(docker container commit) === === 컨테이너로부터 이미지 작성(docker container commit) ===
 +> 컨테이너로부터 이미지 작성
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container commit" no-body="true">
 +<panel-body>
 +<alert type="info">docker container commit [옵션] <컨테이너 식별자> [이미지명[:태그명]]</alert>
 +</panel-body>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --author, -a  | 작성자를 지정한다(ex; Alex Levine<alex@domain.com> |
 +| --message, -m  | 메시지를 지정한다.  |
 +| --change, -c  | 커밋 시 Dockerfile 명령을 지정한다.  |
 +| --pause, -p  | 컨테이너를 일시 정지하고 커밋한다.  |
 +
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker container commit -a "Alex Levine" webserver alexlevine/webfront:1.0  # 컨테이너로부터 이미지 작성
 +$ docker image inspect alexlevine/webfront:1.0  # 이미지 상세 정보 확인
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
  
 === 컨테이너를 tar 파일로 출력(docker container export) === === 컨테이너를 tar 파일로 출력(docker container export) ===
 +> 가동 중인 컨테이너의 디렉토리/파일들을 모아서 tar 파일 만들기
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker container export" no-body="true">
 +<panel-body>
 +<alert type="info">docker container export <컨테이너 식별자></alert>
 +</panel-body>
 +
 +<cli prompt="$ " comment="# ">
 +$ docker container export webserver > latest.tar  # 파일 출력
 +$ tar -tf latest.tar  # 생성된 tar 파일의 상세 정보 확인
 +$ tar tf latest.tar | more
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
  
 === tar 파일로부터 이미지 작성(docker image import) === === tar 파일로부터 이미지 작성(docker image import) ===
 +> Linux OS 이미지의 디렉토리/파일로부터 docker 이미지 생성
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker image import" no-body="true">
 +<panel-body>
 +<alert type="info">docker image import <파일 또는 URL> | - [이미지명[:태그명]]</alert>
 +
 +  * docker image import 명령으로 지정할 수 있는 아카이브 파일; tar, tar.gz, tgz, bzip, tar.xz, txz
 +
 +
 +</panel-body>
 +
 +
 +<cli prompt="$ " comment="# ">
 +$ cat latest.tar | docker image import - alexlevine/webfront:1.1  # 이미지 작성
 +$ docker image ls  # 이미지 확인
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
  
 === 이미지 저장(docker image save) === === 이미지 저장(docker image save) ===
 +> docker 이미지를 tar로 저장
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker image save" no-body="true">
 +<panel-body>
 +<alert type="info">docker image save [옵션] <저장 파일명> [이미지명]</alert>
 +</panel-body>
 +
 +<cli prompt="$ " comment="# ">
 +$ docker image save -o export.tar tensorflow  # 이미지 저장 -o 옵션으로 파일명 지정
 +$ ls -l
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
  
 === 이미지 읽어 들이기(docker image load) === === 이미지 읽어 들이기(docker image load) ===
 +> tar 이미지로부터 이미지를 읽음
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker image load" no-body="true">
 +<panel-body>
 +<alert type="info">docker image load [옵션]</alert>
 +</panel-body>
 +
 +<cli prompt="$ " comment="# ">
 +$ docker image load -i export.tar  # 이미지 읽음 -i 옵션으로 파일 지정
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
 +  * docker container export <-> docker container import
 +  * docker image save <-> docker image load
  
 === 불필요한 이미지/컨테이너를 일괄 삭제(docker system prune) === === 불필요한 이미지/컨테이너를 일괄 삭제(docker system prune) ===
 +> 사용하지 않는 이미지, 컨테이너, 볼륨, 네트워크를 일괄 삭제
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker system prune" no-body="true">
 +<panel-body>
 +<alert type="info">docker system prune [옵션]</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --all, -a  | 사용하지 않는 리소스를 모두 삭제한다.  |
 +| --force, -f  | 강제적으로 삭제한다.  |
 +</panel-body>
 +
 +<cli prompt="$ " comment="# ">
 +$ docker system prune -a  # 불필요한 리소스 삭제
 +</cli>
 +
 +</panel>
 +</col>
 +</grid>
 +
  
  
Line 278: Line 1219:
 ---- ----
 ===== Dockerfile을 사용한 코드에 의한 서버 구축 ===== ===== Dockerfile을 사용한 코드에 의한 서버 구축 =====
 +  * Dockerfile; 베이스가 되는 이미지에 각종 미들웨어를 설치 및 설정하고, 개발한 애플리케이션의 실행 모듈을 전개하기 위한 애플리케이션의 실행 기반의 모든 구성 정보를 기술.
  
 ==== Dockerfile을 사용한 구성 관리 ==== ==== Dockerfile을 사용한 구성 관리 ====
 +  - 베이스가 될 Docker 이미지
 +  - Docker 컨테이너 안에서 수행한 조작(명령)
 +  - 환경변수 등의 설정
 +  - Docker 컨테이너 안에서 작동시켜둘 데몬 실행
  
-=== Dockerfile이란? === 
  
-=== Dockerfile의 기본 구문 === 
  
-=== Dockerfile 작성 ===+=== Dockerfile의 기본 구문 및 작성 === 
 +<grid> 
 +<col sm="8"> 
 +<panel type="default" title="Dockerfile의 기본 서식" no-body="true"> 
 +<panel-body> 
 +<alert type="info">명령 인수</alert> 
 + 
 +^  Dockerfile의 명령  ^^ 
 +^ 명령  ^ 설명 
 +| FROM  | 베이스 이미지 지정 
 +| RUN  | 명령 실행 
 +| CMD  | 컨테이너 실행 명령 
 +| LABEL  | 라벨 설정 
 +| EXPOSE  | 포트 익스포트 
 +| ENV  | 환경변수 
 +| ADD  | 파일/디렉토리 추가 
 +| COPY  | 파일 복사 
 +| ENTRYPOINT  | 컨테이너 실행 명령 
 +| VOLUME  | 볼륨 마운트 
 +| USER  | 사용자 지정 
 +| WORKDIR  | 작업 디렉토리 
 +| ARG  | Dockerfile 안의 변수 
 +| ONBUILD  | 빌드 완료 후 실행되는 명령 
 +| STOPSIGNAL  | 시스템 콜 시그널 설정 
 +| HEALTHCHECK  | 컨테이너의 헬스 체크 
 +| SHELL  | 기본 쉘 설정 
 + 
 +  * 주석; # 
 + 
 +</panel-body> 
 +</panel> 
 + 
 +<panel type="default" title="Dockerfile 작성" no-body="true"> 
 +<panel-body> 
 +  * FROM 명령 
 + 
 +<alert type="info">FROM [이미지명]</alert> 
 +<alert type="info">FROM [이미지명]:[태그명]</alert> 
 +<alert type="info">FROM [이미지명]@[다이제스트]</alert> 
 +</panel-body> 
 + 
 +</panel> 
 +</col> 
 +</grid> 
 + 
  
 ==== Dockerfile의 빌드와 이미지 레이어 ==== ==== Dockerfile의 빌드와 이미지 레이어 ====
  
 === Dockerfile로부터 Docker 이미지 만들기 === === Dockerfile로부터 Docker 이미지 만들기 ===
 +<grid>
 +<col sm="8">
 +<panel type="default" title="docker build 명령의 서식" no-body="true">
 +<panel-body>
 +<alert type="info">docker build -t [생성할 이미지명]:[태그명] [Dockerfile의 위치]</alert>
 +</panel-body>
 +<cli prompt="$ " comment="# ">
 +$ docker build -t sample:1.0 /home/docker/sample  # Dockerfile 빌드
 +$ docker build -t sample -f Dockerfile.base .  # Dockerfile.base 파일 빌드
 +</cli>
 +</panel>
 +</col>
 +</grid>
 +
  
 === Docker 이미지의 레이어 구조 === === Docker 이미지의 레이어 구조 ===
 +  * Dockerfile의 명령 한 줄마다 이미지 작성
  
 ==== 멀티스테이지 빌드를 사용한 애플리케이션 개발 ==== ==== 멀티스테이지 빌드를 사용한 애플리케이션 개발 ====
 +> 빌드 환경, 제품 환경이 다르므로 멀티스테이지 빌드 기능 사용
  
 === Dockerfile 만들기 === === Dockerfile 만들기 ===
 +<sxh>
 +# 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"]
 +</sxh>
  
 === Docker 이미지의 빌드 === === Docker 이미지의 빌드 ===
 +<cli prompt="$ " comment="# ">
 +$ docker build -t greet .
 +</cli>
  
 === Docker 컨테이너의 시작 === === Docker 컨테이너의 시작 ===
 +<cli prompt="$ " comment="# ">
 +$ docker container run -it --rm greet alex
 +Hello alex
 +
 +$ docker container run -it --rm greet --lang=es alex
 +Hola alex
 +</cli>
 +
  
 ==== 명령 및 데몬 실행 ==== ==== 명령 및 데몬 실행 ====
 +> Dockerfile에서 명령이나 데몬을 실행하는 방법
  
 === 명령 실행(RUN 실행) === === 명령 실행(RUN 실행) ===
 +<alert type="info">RUN [실행하고 싶은 명령]</alert>
 +
 +  - Shell 형식으로 기술; 쉘 경유.
 +  - Exec 형식으로 기술; 쉘을 경유하지 않고 직접 실행
 +
 +
 +<sxh>
 +# Shell 형식
 +RUN apt-get install -y nginx
 +
 +# Exec 형식
 +RUN ["/bin/bash", "-c", "apt-get install -y nginx"]
 +</sxh>
 +
 +  * RUN 명령을 여러 개 지정하면 명령 줄만큼의 레이어 생성
 +  * RUN 명령을 한 줄로 지정하면 하나의 레이어 생성; RUN 명령의 줄 바꿈은 \
  
 === 데몬 실행(CMD 명령) === === 데몬 실행(CMD 명령) ===
 +  * RUN 명령은 이미지를 작성하기 위해 실행하는 명령을 기술, 이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행하려면 CMD
 +  * Dockerfile에는 하나의 CMD 명령. 여러 개 지정시 마지막 명령만 유효
 +
 +<alert type="info">CMD [실행하고 싶은 명령]</alert>
 +
 +  - Exec 형식으로 기술
 +  - Shell 형식으로 기술
 +  - ENTRYPOINT 명령의 인수로 CMD 명령 사용
 +
 +  * 패키지 관리 시스템
 +    * YUM(Yellowdog Updater Modified); CentOS, Fedora, Red Hat 계열 -> DNF(Dandified Yum)
 +    * APT(Advanced Packaging Tool); Debian, Ubuntu, Debian 계열
  
 === 데몬 실행(ENTRYPOINT 명령) === === 데몬 실행(ENTRYPOINT 명령) ===
 +  * ENTRYPOINT 명령에서 지정한 명령은 Dockerfile에서 빌드한 이미지로부터 Docker 컨테이너를 시작하기 때문에 docker container run 명령을 실행했을 때 실행
 +
 +<alert type="info">ENTRYPOINT [실행하고 싶은 명령]</alert>
 +
 +  - Exec 형식으로 기술
 +  - Shell 형식으로 기술
 +
 +  * ENTRYPOINT vs. CMD;
 +    * CMD; 컨테이너 시작 시에 실행하고 싶은 명령을 정의해도 docker container run 명령 실행 시에 인수로 새로운 명령을 지정한 경우 이것을 우선 실행
 +    * ENTRYPOINT; 지정한 명령은 반드시 컨테이너에서 실행, 실행 시에 명령 인수를 지정하고 싶을 때는 CMD 명령과 조합하여 사용.
  
 === 빌드 완료 후에 실행되는 명령(ONBUILD 명령) === === 빌드 완료 후에 실행되는 명령(ONBUILD 명령) ===
 +
 +<alert type="info">ONBUILD [실행하고 싶은 명령]</alert>
  
 === 시스템 콜 시그널의 설정(STOPSIGNAL 명령) === === 시스템 콜 시그널의 설정(STOPSIGNAL 명령) ===
 +<alert type="info">STOPSIGNAL [시그널]</alert>
  
 === 컨테이너의 헬스 체크 명령(HEALTHCHECK 명령) === === 컨테이너의 헬스 체크 명령(HEALTHCHECK 명령) ===
 +<alert type="info">HEALTHCHECK [옵션] CMD 실행할 명령</alert>
 +
 +^  지정할 수 있는 옵션  ^^^
 +^ 옵션  ^ 설명  ^ 기본값  ^
 +| --interval=n  | 헬스 체크 간격  | 30s  |
 +| --timeout=n  | 헬스 체크 타임아웃  | 30s  |
 +| --retries=n  | 타임아웃 횟수  | 3  |
 +
  
 ==== 환경 및 네트워크 설정 ==== ==== 환경 및 네트워크 설정 ====
 +> Dockerfile 안에서 이용할 수 있는 환경변수나 컨테이너 안에서의 작업 디렉토리 지정
  
 === 환경변수 설정(ENV 명령) === === 환경변수 설정(ENV 명령) ===
 +<alert type="info">ENV [key] [value]</alert>
 +<alert type="info">ENV [key]=[value]</alert>
  
 === 작업 디렉토리 지정(WORKDIR 명령) === === 작업 디렉토리 지정(WORKDIR 명령) ===
 +<alert type="info">WORKDIR [작업 디렉토리 경로]</alert>
 +
 +  * RUN, CMD, ENTRYPOINT, COPY, ADD 명령에 대한 작업 디렉토리 지정
  
 === 사용자 지정(USER 명령) === === 사용자 지정(USER 명령) ===
 +  * RUN, CMD, ENTRYPOINT 명령을 실행하기 위한 사용자 지정
 +
 +<alert type="info">USER [사용자명/UID]</alert>
 +
  
 === 라벨 지정(LABEL 명령) === === 라벨 지정(LABEL 명령) ===
 +  * 이미지에 버전 정보나 작성자 정보, 코멘트 등과 같은 정보를 제공할 때 사용
 +
 +<alert type="info">LABEL <키 명>=<값></alert>
 +
  
 === 포트 설정(EXPOSE 명령) === === 포트 설정(EXPOSE 명령) ===
 +  * 컨테이너의 공개 포트 번호를 지정
 +
 +<alert type="info">EXPOSE <포트 번호></alert>
  
  
 === Dockerfile 내 변수의 설정(ARG 명령) === === Dockerfile 내 변수의 설정(ARG 명령) ===
 +  * Dockerfile 안에서 사용할 변수를 정의할 때 사용
 +
 +<alert type="info">ARG <이름>[=기본값]</alert>
 +
  
 === 기본 쉘 설정(SHELL 명령) === === 기본 쉘 설정(SHELL 명령) ===
 +  * 쉘 형식으로 명령을 실행할 때 기본 쉘 설정
 +
 +<alert type="info">SHELL ["쉘의 경로", "파라미터"]</alert>
  
 ==== 파일 설정 ==== ==== 파일 설정 ====
  
 === 파일 및 디렉토리 추가(ADD 명령) === === 파일 및 디렉토리 추가(ADD 명령) ===
 +  * 이미지에 호스트 상의 파일이나 디렉토리를 추가할 때 사용
 +
 +<alert type="info">ADD <호스트의 파일 경로> <Docker 이미지의 파일 경로></alert>
 +<alert type="info">ADD ["<호스트의 파일 경로>" "<Docker 이미지의 파일 경로>"]</alert>
 +
 +  * 빌드에 불필요한 파일 제외; .dockerignore 파일 작성
 +
  
 === 파일 복사(COPY 명령) === === 파일 복사(COPY 명령) ===
 +  * 이미지에 호스트 상의 파일이나 디렉토리를 복사할 때 사용
 +
 +<alert type="info">COPY <호스트의 파일 경로> <Docker 이미지의 파일 경로></alert>
 +<alert type="info">COPY ["<호스트의 파일 경로>" "<Docker 이미지의 파일 경로>"]</alert>
 +
 +  * Dockerfile의 저장 위치; 빌드에 필요 없는 파일은 Dockerfile과 똑같은 디렉토리에 두지 않도록 주의
  
 === 볼룸 마운트(VOLUME 명령) === === 볼룸 마운트(VOLUME 명령) ===
 +  * 이미지에 볼륨을 할당
 +
 +<alert type="info">VOLUME ["/마운트 포인트"]</alert>
  
  
Line 347: Line 1474:
 ==== Docker 이미지의 자동 생성 및 공개 ==== ==== Docker 이미지의 자동 생성 및 공개 ====
  
-=== Automated Build의 흐름 === +  * Automated Build의 흐름; Docker Hub에는 버전 관리 툴인 GitHub 및 Bitbucket과 연결하여 Dockerfile로부터 Docker 이미지를 자동으로 생성하는 'Automated Build' 기능이 있음. 이 기능은 GitHub 또는 Bitbucket에서 관리되는 Dockerfile을 바탕으로 Docker 이미지를 자동으로 빌드하는 기능. 
- +    GitHub에 공개하기 
-=== GitHub에 공개하기 === +    Docker Hub의 링크 설정 
- +    Dockerfile의 빌드 
-=== Docker Hub의 링크 설정 === +    Docker 이미지 확인
- +
-=== Dockerfile의 빌드 === +
- +
-=== Docker 이미지 확인 ===+
  
 ==== Docker Registry를 사용한 프라이빗 레지스트리 구축 ==== ==== Docker Registry를 사용한 프라이빗 레지스트리 구축 ====
  
-=== 로컬 환경에 Docker 레지스트리 구축하기 === +  - 로컬 환경에 Docker 레지스트리 구축하기; Docker Store에 공개되어 있는 공식 이미지 'registry' 사용 
- +  Docker 이미지 업로드 
-=== Docker 이미지 업로드 === +  Docker 이미지의 다운로드와 작동 확인
- +
-=== Docker 이미지의 다운로드와 작동 확인 ===+
  
 ==== 클라우드 서비스를 사용한 프라이빗 레지스트리 구축 ==== ==== 클라우드 서비스를 사용한 프라이빗 레지스트리 구축 ====
  
-=== Google Container Registry 준비하기 === +  * GCP(Google Cloud Platform)은 Docker 이미지를 프라이빗으로 관리할 수 있는 'Google Container Registry'를 제공. 이 서비스는 GCP의 오브젝트 스토리지 서비스인 'Google Cloud Storage'를 데이터 저장 장소로 사용. 
- +  - Google Container Registry 준비하기 
-=== Docker 이미지의 업로드 === +  Docker 이미지의 업로드 
- +  Docker 이미지의 다운로드와 작동 확인
-=== Docker 이미지의 다운로드와 작동 확인 ===+
  
  
Line 379: Line 1499:
 ---- ----
 ===== 여러 컨테이너의 운용 관리 ===== ===== 여러 컨테이너의 운용 관리 =====
 +> Docker에서 움직이는 웹 애플리케이션을 제품 환경에서 운용할 때는 애플리케이션 서버, 로그 서버, 프록시 서버 등과 같이 여러 개의 컨테이너들을 연계하여 작동
  
 ==== 여러 컨테이너 관리의 개요 ==== ==== 여러 컨테이너 관리의 개요 ====
  
 === 웹 3계층 시스템 아키텍처 === === 웹 3계층 시스템 아키텍처 ===
 +  * 프론트 서버; 웹 프론트 서버 혹은 웹 서버, Nginx, Microsoft의 IIS(Internet Information Services) 등. 
 +  * 애플리케이션 서버; 결제 처리, 수주 처리 등 애플리케이션의 처리를 실행하는 프로그램의 실행 환경 
 +  * 데이터베이스(DB) 서버;  
 +    * RDBMS(Relational Database Management System) -> MySQL, PostgreSQL, Oracle Database 등. 
 +    * NoSQL -> KVS(Key-Value Store), 도큐먼트 지향 데이터 베이스(도큐먼트 데이터베이스) 등. 
 + 
 === 영구 데이터의 관리 === === 영구 데이터의 관리 ===
 +  * 데이터의 백업 및 복원
 +  * 로그 수집
  
 === Docker Compose === === Docker Compose ===
 +  * 여러 컨테이너를 모아서 관리하기 위한 툴
 +  * docker-compose.yml; 컨테이너의 구성 정보를 정의함으로써 동일 호스트상의 여러 컨테이너를 일괄적으로 관리, YAML 형식의 파일로 관리.
  
 ==== 웹 애플리케이션을 로컬에서 움직여 보자 ==== ==== 웹 애플리케이션을 로컬에서 움직여 보자 ====
  
-=== Compose 구성 파일의 작성 ===+  - Compose 구성 파일의 작성; 소스 파일 확인 -> 구성 정의 
 +  - 여러 Docker 컨테이너 시작; $ docker-compose up 
 +  - docker-compose ps 
 +  - 여러 Docker 컨테이너 정지; $ docker-compose stop 
 +  - docker-compose down; 리소스 삭제
  
-=== 여러 Docker 컨테이너 시작 ===+==== Docker Compose를 사용한 여러 컨테이너의 구성 관리 ===
 +> 'Docker Compose'의 구성 관리 파일인 docker-compose.yml 작성 방법
  
-=== 여러 Docker 컨테이너 정지 ===+  * YAML
  
-==== Docker Compose를 사용한 여러 컨테이너의 구성 관리 ==== 
  
 === docker-compose.yml의 개요 === === docker-compose.yml의 개요 ===
 +  * 버전
 +<cli>
 +version: 3.3
 +</cli>
  
-=== 이미지 지(image) ===+^  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  |
  
-=== 이미지 빌드(build) ===+<cli yml> 
 +# 버전을 정 
 +version: "3"
  
-=== 컨테이너 안에서 작동하는 명령 지(command/entrypoint) ===+비스 의 
 +services: 
 +  webserver: 
 +    image: ubuntu 
 +    ports: 
 +      - "80:80" 
 +    networks: 
 +      - webnet
  
-=== 컨테이너 간 연결(links) ===+  redis:  
 +    image: redis 
 +    networks: 
 +      - webnet
  
-=== 컨테이너 간 통신(ports/expose) === +# 네트워크 정의 
- +networks: 
-=== 서비스의 의존관계 정의(depends_on) ===+  webnet: 
 +   
 +#데이터 볼륨 정의 
 +volumes: 
 +  data-volume:   
 +</cli>
  
-=== 컨테이너 환경변수 지정(environment/env_file) === +  - 이미지 지정(image) === 
- +  - 이미지 빌드(build) === 
-=== 컨테이너 정보 설정(container_name/labels) === +  - 컨테이너 안에서 작동하는 명령 지정(command/entrypoint) === 
- +  - 컨테이너 간 연결(links) === 
-=== 컨테이너 데이터 관리(volumes/volumes_from) ===+  - 컨테이너 간 통신(ports/expose) === 
 +  - 서비스의 의존관계 정의(depends_on) === 
 +  - 컨테이너 환경변수 지정(environment/env_file) === 
 +  컨테이너 정보 설정(container_name/labels) === 
 +  컨테이너 데이터 관리(volumes/volumes_from) ===
  
 ==== Docker Compose를 사용한 여러 컨테이너의 운용 ==== ==== Docker Compose를 사용한 여러 컨테이너의 운용 ====
  
 === Docker Compose의 버전 확인 === === Docker Compose의 버전 확인 ===
 +
 +<cli prompt="$ " comment="# ">
 +$ docker-compose --version
 +</cli>
  
 === Docker COmpose의 기본 명령 === === Docker COmpose의 기본 명령 ===
 +
 +^  Docker Compose의 주요 서브 명령  ^^
 +^ 서브 명령  ^ 설명  ^
 +| up  | 컨테이너 생성/시작  |
 +| ps  | 컨테이너 목록 표시  |
 +| logs  | 컨테이너 로그 출력  |
 +| run  | 컨테이너 실행  |
 +| start  | 컨테이너 시작  |
 +| stop  | 컨테이너 정지  |
 +| restart  | 컨테이너 재시작  |
 +| pause  | 컨테이너 일시 정지  |
 +| unpause  | 컨테이너 재개  |
 +| port  | 공개 포트 번호 표시  |
 +| config  | 구성 확인  |
 +| kill  | 실행 중인 컨테이너 강제 정지  |
 +| rm  | 컨테이너 삭제  |
 +| down  | 리소스 삭제  |
 +
 +
 +<cli prompt="$ " comment="# ">
 +$ docker-compose -f ./sample/docker-compose.yml up  # 컨테이너 생성/시작
 +$ docker-compose stop webserver  # 특정 컨테이너 조작
 +</cli>
 +
  
 === 여러 컨테이너의 생성(up) === === 여러 컨테이너의 생성(up) ===
 +<grid>
 +<col sm="8">
 +<panel type="default" title="" no-body="true">
 +<panel-body>
 +<alert type="info">docker-compose up [옵션] [서비스명 .]</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| -d  | 백그라운드에서 실행한다.  |
 +| --no-depos  | 링크 서비스를 시작하지 않는다.  |
 +| --build  | 이미지를 빌드한다.  |
 +| --no-build  | 이미지를 빌드하지 않는다.  |
 +| -t, --timeout  | 컨테이너의 타임아웃을 초로 지정(기본 10초)한다.  |
 +| --scale SERVICE=서비스 수  | 서비스 수를 지정한다.  |
 +
 +</panel-body>
 +<alert type="info">docker-compose up --scale [서비스명=수]</alert>
 +</panel>
 +</col>
 +</grid>
  
 === 여러 컨테이너 확인(ps/logs) === === 여러 컨테이너 확인(ps/logs) ===
 +<cli prompt="$ " comment="# ">
 +$ docker-compose ps  # 여러 컨테이너의 상태 확인
 +$ docker-compose -q  # 컨테이너 ID 확인
 +$ docker-compose logs  # docker 령령을 사용한 로그 확인
 +</cli>
  
 === 컨테이너에서 명령 실행(run) === === 컨테이너에서 명령 실행(run) ===
 +<cli prompt="$ " comment="# ">
 +$ docker-compose run server_a /bin/bash
 +</cli>
  
 === 여러 컨테이너 시작/정지/재시작(start/stop/restart) === === 여러 컨테이너 시작/정지/재시작(start/stop/restart) ===
 +  * 컨테이너 일관 시작/정지/재시작
 +
 +<cli prompt="$ " comment="# ">
 +$ docker-compose start
 +$ docker-compose stop
 +$ docker-compose restart
 +</cli>
 +
 +  * 특정 컨테이너 재시작
 +
 +<cli prompt="$ " comment="# ">
 +$ docker-compose restart server_a
 +</cli>
  
 === 여러 컨테이너 일시 정시/재개(pause/unpause) === === 여러 컨테이너 일시 정시/재개(pause/unpause) ===
 +<cli prompt="$ " comment="# ">
 +$ docker-compose pause  # 컨테이너 일시 정지
 +$ docker-compose unpause  # 컨테이너 재개
 +</cli>
  
 === 서비스의 구성 확인(port/config) === === 서비스의 구성 확인(port/config) ===
 +
 +<alert type="info">docker-compose port [옵션] <서비스명> <프라이빗 포트 번호></alert>
 +
 +^  지정할 수 있는 주요 옵션  ^
 +^ 옵션  ^ 설명  ^
 +| --protocol=proto  | 프로토콜. tcp 또는 udp  |
 +| --index=index  | 컨테이너의 인덱스 수  |
 +
 +<cli prompt="$ " comment="# ">
 +$ docker-compose port webserver 80  # 공개 포트 확인
 +</cli>
 +
 +<cli prompt="$ " comment="# ">
 +$ docker-compose config  # 구성 확인
 +</cli>
 +
  
 === 여러 컨테이너 강제 정지/삭제(kill/rm) === === 여러 컨테이너 강제 정지/삭제(kill/rm) ===
 +<cli prompt="$ " comment="# ">
 +$ docker-compose kill -s SIGINT  # 컨테이너에 시그널 송신
 +</cli>
 +
 +<cli prompt="$ " comment="# ">
 +$ docker-compose rm  # 여러 컨테이너 일괄 삭제
 +</cli>
 +
 +  * Linux의 시그널; POSIX.1-1990 규격
 +
 +^  Docker Compose의 주요 서브 명령  ^^
 +^ 시그널  ^ 설명  ^
 +| SIGHUP  | 프로그램 재시작  |
 +| SIGINT  | 키보드로 인터럽트, Ctrl+C로 송신할 수 있다.  |
 +| SIGQUIT  | 키보드에 의한 중지, Ctrl+\로 송신할 수 있다.  |
 +| SIGTERM  | 프로세스 정상 종료  |
 +| SIGKILL  | 프로세스 강제 종료  |
 +| SIGSTOP  | 프로세스 일시 정지  |
  
 === 여러 리소스의 일괄 삭제(down) === === 여러 리소스의 일괄 삭제(down) ===
 +
 +<alert type="info">docker-compose down [옵션]</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --rmi all  | 모든 이미지를 삭제  |
 +| --rmi local  | 커스텀 태그가 없는 이미지만 삭제  |
 +| -v, --volumes  | Compose 정의 파일의 데이터 볼륨을 삭제  |
 +
 +<cli prompt="$ " comment="# ">
 +$ docker-compose down --rmi all  # 여러 이미지 삭제
 +</cli>
  
  
Line 444: Line 1732:
 ---- ----
 ===== 멀티호스트 환경에서 Docker 실행 환경 구축 ===== ===== 멀티호스트 환경에서 Docker 실행 환경 구축 =====
- 
 ==== 멀티호스트 환경에서 컨테이너 관리의 개요 ==== ==== 멀티호스트 환경에서 컨테이너 관리의 개요 ====
  
 === 멀티호스트 환경과 클러스터링 === === 멀티호스트 환경과 클러스터링 ===
 +  * 클러스터링; 여러 대의 서버나 하드웨어를 모아서 한 대처럼 보이게 하는 기술
 +    * 가용성(Availability); 시스템이 계속해서 가동될 수 있는 능력
 +    * 확장성(Scalability); 고부하로 인한 시스템 다운을 피하기 위해 여러 대의 컴퓨터를 클러스터화하여 처리를 분산시킴으로써 높은 처리 성능을 얻을 수 있다. 클라우드의 가상 머신의 경우는 오토스케일 기능이 제공되는 경우도 있다.
 +
  
 === Docker Machine이란? === === Docker Machine이란? ===
 +  * 호스트 머신/클라우드/가상 환경 등에 Docker의 실행 환경을 만들 수 있는 커맨드라인 툴.
 +  * https://docs.docker.com/machine
  
-==== 웹 애플리케이션을 서비스 공개해 보자 ==== 
  
-=== Docker 실행 환경 작성 === +==== 웹 애플리케이션을 서비스 공해 보자 ====
- +
-=== 웹 애플리케이션 개 ===+
  
-=== Docker 실행 환경 삭제 ===+  - Docker 실행 환경 작성 
 +  - 웹 애플리케이션 전개 
 +  - Docker 실행 환경 삭제
  
 ==== Docker Machine을 사용한 실행 환경 구축 ==== ==== Docker Machine을 사용한 실행 환경 구축 ====
  
 === Docker Machine의 기본 명령 === === Docker Machine의 기본 명령 ===
 +
 +<cli prompt="$ " comment="# ">
 +$ docker-machine --version  # Docker Machine의 버전 확인
 +</cli>
 +
 +^  Docker Machine의 서브 명령  ^^
 +^ 서브 명령  ^ 설명  ^
 +| create  | 실행 환경 작성  |
 +| ls  | 실행 환경 목록 표시  |
 +| status  | 실행 환경 상태 표시  |
 +| url  | 실행 환경 URL 표시  |
 +| ssh  | 실행 환경에 대한 SSH 연결  |
 +| start  | 실행 환경 시작  |
 +| stop  | 실행 환경 정지  |
 +| restart  | 실행 환경 재시작  |
 +| scp  | 실행 환경에서 파일 다운로드  |
 +| rm  | 실행 환경 삭제  |
 +| kill  | 실행 환경 강제 정지  |
 +| ip  | 실행 환경 IP 주소 확인  |
 +| inspect  | 실행 환경 정보 확인  |
 +
  
 === 실행 환경 작성(create) === === 실행 환경 작성(create) ===
 +<alert type="info">docker-machine create --driver <드라이버명> <작성할 Docker 머신명></alert>
 +
 +  * Docker Machine에서 이용할 수 있는 드라이버 목록; https://docs.docker.com/machine/drivers/
 +
  
 === 실행 환경 목록 표시(ls/status/url) === === 실행 환경 목록 표시(ls/status/url) ===
 +<alert type="info">docker-machine ls [옵션]</alert>
 +
 +^  지정할 수 있는 주요 옵션  ^^
 +^ 옵션  ^ 설명  ^
 +| --quite, -q  | 머신명만 표시한다  |
 +| --filter  | 표시할 머신을 필터링한다  |
 +
 +<cli prompt="$ " comment="# ">
 +$ docker-machine status host1  # 실행 환경의 스테이터스 확인
 +$ docker-machine url host1  # 실행 환경의 URL 확인
 +</cli>
  
 === 실행 환경에 대한 SSH 연결(ssh) === === 실행 환경에 대한 SSH 연결(ssh) ===
 +<alert type="info">docker-machine ssh 머신명</alert>
 +
 +<cli prompt="$ " comment="# ">
 +$ docker-machine ssh host1
 +</cli>
 +
 === 실행 환경 시작/정지/재시작(start/stop/restart) === === 실행 환경 시작/정지/재시작(start/stop/restart) ===
 +<cli prompt="$ " comment="# ">
 +$ docker-machine start host1  # 실행 환경 시작
 +$ docker-machine stop host1  # 실행 환경 정지
 +$ docker-machine restart host1  # 실행 환경 재시작
 +</cli>
  
 === 실행 환경으로부터 파일 다운로드(scp) === === 실행 환경으로부터 파일 다운로드(scp) ===
 +<cli prompt="$ " comment="# ">
 +$ docker-machine scp host1:/etc/passwd .  
 +</cli>
 +
 +  * SCP(Secure Copy Protocol); SSH의 기능을 사용하여 파일을 전송하기 위한 명령 Secure Copy Protocol로 인증 정보와 데이터를 암호화하여 네트워크로 전송
  
 === 실행 환경 삭제(rm/kill) === === 실행 환경 삭제(rm/kill) ===
 +<cli prompt="$ " comment="# ">
 +$ docker-machine rm -f host1  # 실행 환경 삭제
 +$ docker-machine kill host1  # 실행 환경 강제 정지
 +</cli>
  
 === 실행 환경 정보 확인(ip/inspect) === === 실행 환경 정보 확인(ip/inspect) ===
 +<cli prompt="$ " comment="# ">
 +$ docker-machine ip host1  # IP 주소 확인
 +</cli>
  
 +<alert type="info">docker-machine inspect [옵션] 머신명</alert>
  
  
Line 483: Line 1835:
 ---- ----
 ===== 클라우드를 사용한 Docker 실행 환경 구축 ===== ===== 클라우드를 사용한 Docker 실행 환경 구축 =====
 +> GKE(Google Kubernetes Engine)
  
 ==== 클라우드 환경에서 Docker 오케스트레이션하기 ==== ==== 클라우드 환경에서 Docker 오케스트레이션하기 ====
  
 === 분산 환경에서의 컨테이너 운용 관리 === === 분산 환경에서의 컨테이너 운용 관리 ===
 +  * Kubernetes
 +  * Docker Enging(Swarm 모드)
 +  * Apache Mesos, Marathon
 +
  
 === 퍼블릭 클라우드가 제공하는 매니지드 서비스 === === 퍼블릭 클라우드가 제공하는 매니지드 서비스 ===
 +  * Amazon EC2 Container Service
 +  * Azure Container Service(AKS)
 +  * Google Kubernetes Engine(GKE)
 +
  
 === Google Cloud Platform의 컨테이너 관련 서비스 === === Google Cloud Platform의 컨테이너 관련 서비스 ===
 +  * Google Container Builder
 +  * Google Kubernetes Enging
 +  * Google Container Registry
 +
  
 ==== Kubernetes의 개요 ==== ==== Kubernetes의 개요 ====
 +  * 여러 서버들에서의 컨테이너 관리
 +  * 컨테이너 간 네트워크 관리
 +  * 컨테이너의 부하분산
 +  * 컨테이너의 감시
 +  * 무정지로 업데이트
  
 === Kubernetes의 서버 구성 === === Kubernetes의 서버 구성 ===
 +  * 마스터 서버(Kubernetes Master)
 +  * 백엔드 데이터베이서(etcd)
 +  * 노드(Node)
 +
  
 === 애플리케이션 구성 관리(Pod, ReplicaSet, Deployment) === === 애플리케이션 구성 관리(Pod, ReplicaSet, Deployment) ===
 +  * Pod(포드)
 +  * ReplicaSet(리플리카 셋)
 +  * Deployment(디플로이먼트, 전개)
  
 === 네트워크 관리(Service) === === 네트워크 관리(Service) ===
Line 503: Line 1880:
  
 === Kubernetes의 구조 === === Kubernetes의 구조 ===
 +  * 마스터(Master); API Server, Scheduler, Controller Manager
 +  * 데이터 스토어(etcd)
 +  * 노드(Node); Kubelet
  
 ==== GCP를 사용한 Docker 애플리케이션 개발 ==== ==== GCP를 사용한 Docker 애플리케이션 개발 ====
Line 511: Line 1891:
  
 === Docker 이미지 빌드(Cloud Container Builder) === === Docker 이미지 빌드(Cloud Container Builder) ===
 +  * API 유효화하기
 +    * Google Kubernetes Engine API
 +    * Google Container Registry API
 +    * Google Cloud Build API
 +  * Docker 이미지 빌드 파일; 빌드 스텝 -> 이미지 -> 
  
 ==== GCP를 사용한 Docker 애플리케이션 실행 환경 구축 ==== ==== GCP를 사용한 Docker 애플리케이션 실행 환경 구축 ====
Line 536: Line 1921:
  
 === 가용성 관리 === === 가용성 관리 ===
 +  * 콜드 스탠바이 방식; 스탠바이 기기는 장애가 발생하면 액티브 기기와 교체
 +  * 핫 스탠바이 방식; 액티브 기기에서 장애가 발생하면 자동으로 스탠바이 기기로 교체
 +  * 헬스 체크
 +    * ICMP 감시(레이어 3); Ping 등의 응답을 확인
 +    * 포트 감시(레이어 4); 웹서비스의 경우는 80번 포트로부터 응답이 있는지 확인
 +    * 서비스 감시(레이어 7); HTTP 통신을 확인하는 경우 특정 페이지가 올바르게 표시되는지를 확인
 +  * 로드 밸런싱(load balancing)
 +
 +
 +  * Disaster Recovery System
 +    * RTO(Recovery Time Objective); 서비스를 복구할 때까지 필요한 경과 시간
 +    * RPO(Recovery Point Objective); 재해 등으로 시스템이 정지되었을 때 어떤 시점까지 거슬러 올라가서 데이터를 복구시킬지에 대한 지표
  
 === 수용성(Capacity) 관리 === === 수용성(Capacity) 관리 ===
  
 === 시스템 감시 === === 시스템 감시 ===
 +  * 머신의 활동 감시
 +  * 서비스의 가동 감시
 +  * 서버/네트워크의 리소스 감시
 +  * 잡 감시
 +  * 장애 대응
  
 ==== GKE를 사용한 Docker 실행 환경의 운용 ==== ==== GKE를 사용한 Docker 실행 환경의 운용 ====
  
 === Kubernetes의 스테이터스 확인 === === Kubernetes의 스테이터스 확인 ===
 +  * 클러스터의 상태 확인
 +  * 노드의 스테이터스 확인
 +  * Pod의 상태 확인
 +  * 서비스 확인
  
 === Kubernetes의 Pod 관리 === === Kubernetes의 Pod 관리 ===
Line 550: Line 1956:
  
 === Kubernetes의 리소스 작성/삭제/변경 === === Kubernetes의 리소스 작성/삭제/변경 ===
 +  * 리소스 작성
 +  * 리소스 삭제
 +  * 리소스 변경
  
 === Kubernetes의 업그레이드/다운그레이드 === === Kubernetes의 업그레이드/다운그레이드 ===
Line 640: Line 2049:
 ===== Google Cloud Platform 사용법 ===== ===== Google Cloud Platform 사용법 =====
 ==== A.1 계정 등록 ==== ==== A.1 계정 등록 ====
 +  * Google 계정, 신용카드 또는 은행 계좌
 +
 +  - 등록 시작
 +  - 계정 정보 등록
  
-[1] 등록 시작 
-[2] 계정 정보 등록 
 ==== A.2 프로젝트 작성과 삭제 ==== ==== A.2 프로젝트 작성과 삭제 ====
  
-[1] 프로젝트 작성 +  - 프로젝트 작성 
-[2] 프로젝트명 설정 +  프로젝트명 설정 
-[3] 프로젝트 삭제+  프로젝트 삭제
 ==== A.3 Cloud Console 사용법 ==== ==== A.3 Cloud Console 사용법 ====
  
- 툴과 서비스 +  * 툴과 서비스 
- 대시보드+  대시보드 
 ==== A.4 Cloud Shell 사용법 ==== ==== A.4 Cloud Shell 사용법 ====
  
  • public/computer/docker.1628082677.txt.gz
  • Last modified: 2021/08/04 22:11
  • by alex