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/08 01:47] alexpublic:computer:docker [2021/08/08 21:00] (current) – [A.3 Cloud Console 사용법] alex
Line 1080: 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 1096: 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 1165: 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 1197: 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: 
- +   
-=== 컨테너 환경변수 지(environment/env_file) === +#데터 볼륨  
- +volumes: 
-=== 컨테이너 정보 설정(container_name/labels) ===+  data-volume:   
 +</cli>
  
-=== 컨테이너 데이터 관리(volumes/volumes_from) ===+  - 이미지 지정(image) === 
 +  - 이미지 빌드(build) === 
 +  - 컨테이너 안에서 작동하는 명령 지정(command/entrypoint) === 
 +  - 컨테이너 간 연결(links) === 
 +  - 컨테이너 간 통신(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 1262: 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 1301: 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 1321: Line 1880:
  
 === Kubernetes의 구조 === === Kubernetes의 구조 ===
 +  * 마스터(Master); API Server, Scheduler, Controller Manager
 +  * 데이터 스토어(etcd)
 +  * 노드(Node); Kubelet
  
 ==== GCP를 사용한 Docker 애플리케이션 개발 ==== ==== GCP를 사용한 Docker 애플리케이션 개발 ====
Line 1329: 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 1354: 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 1368: Line 1956:
  
 === Kubernetes의 리소스 작성/삭제/변경 === === Kubernetes의 리소스 작성/삭제/변경 ===
 +  * 리소스 작성
 +  * 리소스 삭제
 +  * 리소스 변경
  
 === Kubernetes의 업그레이드/다운그레이드 === === Kubernetes의 업그레이드/다운그레이드 ===
Line 1458: 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.1628354853.txt.gz
  • Last modified: 2021/08/08 01:47
  • by alex