Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
public:computer:docker [2021/08/07 17:02] – alex | public:computer:docker [2021/08/08 21:00] (current) – [A.3 Cloud Console 사용법] alex | ||
---|---|---|---|
Line 179: | Line 179: | ||
* https:// | * https:// | ||
=== 이미지 다운로드(docker image pull) === | === 이미지 다운로드(docker image pull) === | ||
+ | > docker hub에서 이미지 다운로드 | ||
< | < | ||
<col sm=" | <col sm=" | ||
Line 195: | Line 196: | ||
</ | </ | ||
</ | </ | ||
+ | |||
=== 이미지 목록 표시(docker image ls) === | === 이미지 목록 표시(docker image ls) === | ||
+ | > 취득한 이미지의 목록 표시 | ||
< | < | ||
<col sm=" | <col sm=" | ||
Line 234: | Line 237: | ||
=== 이미지 상세 정보 확인(docker image inspect) === | === 이미지 상세 정보 확인(docker image inspect) === | ||
+ | > 이미지 상세 정보 확인 | ||
< | < | ||
<col sm=" | <col sm=" | ||
Line 251: | Line 255: | ||
=== 이미지 태그 설정(docker image tag) === | === 이미지 태그 설정(docker image tag) === | ||
+ | > 이미지에 표식이 되는 태그를 붙임 | ||
< | < | ||
<col sm=" | <col sm=" | ||
Line 265: | Line 270: | ||
</ | </ | ||
</ | </ | ||
+ | |||
=== 이미지 검색(docker search) === | === 이미지 검색(docker search) === | ||
+ | > docker hub에 공개되어 있는 이미지 검색 | ||
< | < | ||
<col sm=" | <col sm=" | ||
Line 294: | Line 301: | ||
=== 이미지 삭제(docker image rm) === | === 이미지 삭제(docker image rm) === | ||
+ | > 작성한 이미지 삭제 | ||
< | < | ||
<col sm=" | <col sm=" | ||
Line 331: | Line 339: | ||
=== Docker Hub에 로그인(docker login) === | === Docker Hub에 로그인(docker login) === | ||
+ | > docker 리포지토리에 업로드하기 위해 docker에 로그인 | ||
< | < | ||
<col sm=" | <col sm=" | ||
Line 354: | Line 363: | ||
=== 이미지 업로드(docker image push) === | === 이미지 업로드(docker image push) === | ||
+ | > docker hub에 이미지 업로드 | ||
< | < | ||
<col sm=" | <col sm=" | ||
Line 371: | Line 381: | ||
=== Docker Hub에서 로그아웃(docker logout) === | === Docker Hub에서 로그아웃(docker logout) === | ||
+ | > docker hub에서 로그아웃 | ||
< | < | ||
<col sm=" | <col sm=" | ||
Line 387: | 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) === | ||
+ | > 컨테이너의 생성 및 시작 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | docker container run [옵션] 이미지명[: | ||
+ | </ | ||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --attach, -a | 표준 입력(STDIN), | ||
+ | | --cidfile | ||
+ | | --detach, -d | 컨테이너를 생성하고 백그라운드에서 실행한다. | ||
+ | | --interactive, | ||
+ | | --try, -t | 단말기 디바이스를 사용한다. | ||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker container run -it --name " | ||
+ | # docker container run; 컨테이너를 생성 및 실행 | ||
+ | # -it; 콘솔에 결과를 출력하는 옵션 | ||
+ | # --name " | ||
+ | # centos; 이미지명 | ||
+ | # /bin/cal; 컨테이너에서 실행할 명령 | ||
+ | |||
+ | $ docker container run -it --name " | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
=== 컨테이너의 백그라운드 실행(docker container run) === | === 컨테이너의 백그라운드 실행(docker container run) === | ||
+ | > docker를 이용하는 경우의 대부분은 컨테이너에 서버 기능을 가지게 해서 실행하는 경우, 대화식이 아닌 백그라운드에서 실행 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --detach, -d | 백그라운드에서 실행 | ||
+ | | --user, -u | 사용자명을 지정 | ||
+ | | --restart=[no%%|%%on-failure%%|%%on-failure: | ||
+ | | --rm | 명령 실행 완료 후에 컨테이너를 자동으로 삭제 | ||
+ | |||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ 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 | ||
+ | | on-failure: | ||
+ | | always | ||
+ | | unless-stopped | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker container run -it --restart=always centos / | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
=== 컨테이너의 네트워크 설정(docker container run) === | === 컨테이너의 네트워크 설정(docker container run) === | ||
+ | > 컨테이너의 네트워크를 설정 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | ^ 지정할 수 있는 옵션 | ||
+ | ^ 옵션 | ||
+ | | --add-host=[호스트명: | ||
+ | | --dns=[IP 주소] | ||
+ | | --expose | ||
+ | | --mac-address=[MAC 주소] | ||
+ | | --net=[bridge%%|%%none%%|%%container:< | ||
+ | | --hostname, -h | 컨테이너 자신의 호스트명을 지정 | ||
+ | | --publish, -p[호스트의 포트 번호]: | ||
+ | | --publish-all, | ||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker container run -d --dns 192.168.1.1 nginx # 컨테이너의 DNS 서버 지정 | ||
+ | $ docker container run -d --mac-address=" | ||
+ | 2a4f6cf4da30a... | ||
+ | $ docker container inspect --format=" | ||
+ | 92: | ||
+ | $ docker container run -it --add-host test.com: | ||
+ | $ docker container run -it --hostname www.test.com --add-host node1.test.com: | ||
+ | </ | ||
+ | |||
+ | ^ --net 옵션의 지정 | ||
+ | ^ 설정값 | ||
+ | | bridge | ||
+ | | none | 네트워크에 연결하지 않는다. | ||
+ | | container: | ||
+ | | host | 컨테이너가 호스트 OS의 네트워크를 사용한다. | ||
+ | | NETWORK | ||
+ | |||
+ | * 사용자 정의 네트워크 작성 | ||
+ | <cli prompt=" | ||
+ | $ docker network create -d bridge webap-net | ||
+ | $ docker container run --net=webap-net -it centos | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
=== 자원을 지정하여 컨테이너 생성 및 실행(docker container run) === | === 자원을 지정하여 컨테이너 생성 및 실행(docker container run) === | ||
+ | > CPU나 메모리와 같은 자원을 지정하여 컨테이너를 생성 및 실행 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | | --cpu-shares, | ||
+ | | --memory, -m | 사용할 메모리를 제한하여 실행 \\ (단위는 b, k, m, g 중 하나) | ||
+ | | --volume=[호스트의 디렉토리]: | ||
+ | </ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker container run --cpu-shares=512 --memory=1g centos | ||
+ | $ docker container run -v / | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
=== 컨테이너를 생성 및 시작하는 환경을 지정(docker container run) === | === 컨테이너를 생성 및 시작하는 환경을 지정(docker container run) === | ||
+ | > 컨테이너의 환경변수나 컨테이너 안의 작업 디렉토리 등을 지정하여 컨테이너를 생성/ | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --env=[환경변수], | ||
+ | | --evn-file=[파일명] | ||
+ | | --read-only=[true%%|%%false] | ||
+ | | --workdir=[패스], | ||
+ | | -u, --user=[사용자명] | ||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker container run -it -e foo=bar centos / | ||
+ | |||
+ | $ cat env_list | ||
+ | hoge=fuga | ||
+ | foo=bar | ||
+ | |||
+ | $ docker container run -it --env-file=env_list centos / | ||
+ | |||
+ | $ docker container run -it -w=/ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
=== 가동 컨테이너 목록 표시(docker container ls) === | === 가동 컨테이너 목록 표시(docker container ls) === | ||
+ | > docker 상에서 작동하는 컨테이너의 가동상태를 확인 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --all, -a | 실행 중/정지 중인 것도 포함하여 모든 컨테이너를 표시 | ||
+ | | --filter, -f | 표시할 컨테이너의 필터링 | ||
+ | | --format | ||
+ | | --last, -n | 마지막으로 실행된 n건의 컨테이너만 표시 | ||
+ | | --latest, -l | 마지막으로 실행된 컨테이너만 표시 | ||
+ | | --no-trunc | ||
+ | | --quiet, -q | 컨테이너 ID만 표시 | ||
+ | | --size, -s | 파일 크기 표시 | ||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ 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 | ||
+ | | PORTS | 할당된 포트 | ||
+ | | NAMES | 컨테이너 이름 | ||
+ | |||
+ | ^ --formate 옵션; 출력 형식의 지정 | ||
+ | ^ 플레이스 홀더 | ||
+ | | .ID | 컨테이너 ID | | ||
+ | | .Image | ||
+ | | .Command | ||
+ | | .CreatedAt | ||
+ | | .RunningFor | ||
+ | | .Ports | ||
+ | | .Status | ||
+ | | .Size | 컨테이너 디스크 크기 | ||
+ | | .Names | ||
+ | | .Mounts | ||
+ | | .Networks | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker container ls -a --format " | ||
+ | $ docker container ls -a --format "table {{.Names}}\t{{.Status}}\t {{.Mounts}}" | ||
+ | </ | ||
+ | |||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
=== 컨테이너 가동 확인(docker container stats) === | === 컨테이너 가동 확인(docker container stats) === | ||
+ | > docker 상에서 작동하는 컨테이너 가동 상태를 확인 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | </ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker container stats webserver | ||
+ | </ | ||
+ | |||
+ | ^ docker container stats 명령 결과 | ||
+ | ^ 항목 | ||
+ | | CONTAINER ID | 컨테이너 식별자 | ||
+ | | NAME | 컨테이너명 | ||
+ | | CPU % | CPU 사용률 | ||
+ | | MEM USAGE/ | ||
+ | | MEM % | 메모리 사용률 | ||
+ | | NET I/O | 네트워크 I/O | | ||
+ | | BLOCK I/O | 블록 I/O | | ||
+ | | PIDS | PID(Windows 컨테이너 제외) | ||
+ | * Ctrl + C; 명령 종료 | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker container top webserver | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
=== 컨테이너 시작(docker container start) === | === 컨테이너 시작(docker container start) === | ||
+ | > 정지하고 있는 컨테이너 시작 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --attach, -a | 표준 출력, 표준 오류 출력을 연다. | ||
+ | | --interactive, | ||
+ | |||
+ | |||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker container start dbb4bbe0f470 | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
=== 컨테이너 정지(docker container stop) === | === 컨테이너 정지(docker container stop) === | ||
+ | > 실행 중인 컨테이너를 정지 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --time, -t | 컨테이너의 정지 시간을 지정(기본값은 10초) | ||
+ | |||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker container stop -t 2 dbb4bbe0f470 | ||
+ | </ | ||
+ | |||
+ | * docker container kill; 강제적으로 컨테이너를 정지시킬 때 | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
=== 컨테이너 재시작(docker container restart) === | === 컨테이너 재시작(docker container restart) === | ||
+ | > 컨테이너를 재시작 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --time, -t | 컨테이너의 재시작 시간을 지정(기본값은 10초) | ||
+ | |||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker container restart -t 2 webserver | ||
+ | </ | ||
+ | |||
+ | * docker container run --restart; 컨테이너 안에서 실행하는 명령의 종료 스테이터스(정상 종료되었는지 아닌지)에 따라 컨테이너를 자동으로 재시작하고 싶은 경우. | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
=== 컨테이너 삭제(docker container rm) === | === 컨테이너 삭제(docker container rm) === | ||
+ | > 정지하고 있는 컨테이너를 삭제 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --force, -f | 실행 중인 컨테이너를 강제로 삭제 | ||
+ | | --volumes, -v | 할당한 볼륨을 삭제 | ||
+ | |||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker container rm dbb4bbe0f470 | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
=== 컨테이너 중단/ | === 컨테이너 중단/ | ||
+ | > 실행중인 컨테이너에서 작동 중인 프로세스를 모두 중단 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker container pause webserver | ||
+ | $ docker container unpause wbserver | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
Line 417: | Line 775: | ||
==== 컨테이너 네트워크 ==== | ==== 컨테이너 네트워크 ==== | ||
+ | * docker 컨테이너 끼리 통신을 할 때는 docker 네트워크를 통해 수행 | ||
+ | |||
+ | |||
=== 네트워크 목록 표시(docker network ls) === | === 네트워크 목록 표시(docker network ls) === | ||
+ | > docker 네트워크의 목록 확인 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | -f, --filter=[] | ||
+ | | --no-trunc | ||
+ | | -q, --quiet | ||
+ | |||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker network ls | ||
+ | </ | ||
+ | |||
+ | ^ 필터링에서 이용할 수 있는 키 ^^ | ||
+ | ^ 값 ^ 설명 | ||
+ | | driver | ||
+ | | id | 네트워크 ID | | ||
+ | | label | 네트워크에 설정된 라벨(label=< | ||
+ | | name | 네트워크명 | ||
+ | | scope | 네트워크의 스코프(swarm/ | ||
+ | | type | 네트워크의 타입(사용자 정의 네트워크 custom/ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker network ls -q --filter driver=bridge | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | * 오버레이 네트워크(overlay network); 물리 네트워크 상에서 소프트웨어적으로 에뮬레이트한 네트워크. 물리 네트워크를 덮듯이 가상 네트워크가 구성된다는 점에서 가상 네트워크라라고도 함. 물리 네트워크의 구조가 은폐되어 그 아래에 있는 물리 계층의 형태나 제어 방식 등을 의식하지 않고 이용할 수 있다는 것이 특징. 예를 들어 여러 개의 호스트에 걸친 네트워크를 구성할 때 사용. 소프트웨어로 구성된 네트워크이므로 물리 작업을 수반하지 않고 자유롭게 구성을 변경할 수 있다는 장점. | ||
=== 네트워크 작성(docker network create) === | === 네트워크 작성(docker network create) === | ||
+ | > 새로운 네트워크 작성 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --driver, -d | 네트워크 브리지 또는 오버레이(기본값은 bridge) | ||
+ | | --ip-range | ||
+ | | --subnet | ||
+ | | --ipv6 | ||
+ | | -label | ||
+ | |||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker network create --driver=bridge web-network | ||
+ | # docker network ls --filter driver=bridge | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
=== 네트워크 연결(docker network connect/ | === 네트워크 연결(docker network connect/ | ||
+ | > docker 컨테이너를 docker 네트워크에 연결/ | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --ip | IPv4 주소 | ||
+ | | --ip6 | IPv6 주소 | ||
+ | | --alias | ||
+ | | --link | ||
+ | |||
+ | </ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ 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) === | ||
+ | > 네트워크 상세 정보를 확인 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker network inspect web-network | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
=== 네트워크 삭제(docker network rm) === | === 네트워크 삭제(docker network rm) === | ||
+ | > docker 네트워크 삭제 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker network rm web-network | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
Line 432: | Line 909: | ||
==== 가동중인 컨테이너 조작 ==== | ==== 가동중인 컨테이너 조작 ==== | ||
+ | > 실제 환경에서 운용할 때 이미 가동 중인 컨테이너의 상태를 확인하거나 임의의 프로세스를 실행시킬 때 하는 조작 | ||
+ | |||
+ | |||
=== 가동 컨테이너 연결(docker container attach) === | === 가동 컨테이너 연결(docker container attach) === | ||
+ | > 가동 중인 컨테이너에 연결할 때. 연결한 컨테이너를 종료하려면 Ctrl+C, 컨테이너를 시작한 채로 컨테이너 안에서 움직이는 프로세스만 종료하려면 Ctrl+P, Ctrl+Q 입력. | ||
+ | |||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker container attach sample | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
=== 가동 컨테이너에서 프로세스 실행(docker container exec) === | === 가동 컨테이너에서 프로세스 실행(docker container exec) === | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --detach, -d | 명령을 백그라운드에서 실행한다. | ||
+ | | --interactive, | ||
+ | | --tty, -t | tty(단말 디바이스)를 사용한다. | ||
+ | | --user, -u | 사용자명을 지정한다. | ||
+ | |||
+ | </ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker container exec -it webserver / | ||
+ | $ docker container exec -it webserver /bin/echo "Hello world" | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
=== 가동 컨테이너의 프로세스 확인(docker container top) === | === 가동 컨테이너의 프로세스 확인(docker container top) === | ||
+ | > 가동 중인 컨테이너에서 실행되고 있는 프로세스 확인 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker container top webserver | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
=== 가동 컨테이너의 포트 전송 확인(docker container port) === | === 가동 컨테이너의 포트 전송 확인(docker container port) === | ||
+ | > 가동 중인 컨테이너에서 실행되고 있는 프로세스가 전송되고 있는 포트를 확인 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker container port webserver | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ^ 주요 Linux 배포판에서의 잘 알려진 포트 | ||
+ | ^ 번호 | ||
+ | | 20 | TCP | FTP(데이터) | ||
+ | | 21 | TCP | FTP(제어) | ||
+ | | 22 | TCP/ | ||
+ | | 23 | TCP | Telnet | ||
+ | | 25 | TCP/ | ||
+ | | 43 | TCP | WHOIS | 도메인 정보 검색 | ||
+ | | 53 | TCP/ | ||
+ | | 80 | TCP/ | ||
+ | | 88 | TCP/ | ||
+ | | 110 | TCP | POP3 | 메일 수신 | ||
+ | | 123 | UDP | NTP | 시간 조정 | ||
+ | | 135 | TCP | Microsoft RPC | Microsoft의 원격 액세스 | ||
+ | | 143 | TCP/ | ||
+ | | 161 | TCP/ | ||
+ | | 162 | TCP/ | ||
+ | | 389 | TCP/ | ||
+ | | 443 | TCP/ | ||
+ | | 465 | TCP | SMTPS | SMTP의 암호화 통신 | ||
+ | | 514 | UDP | syslog | ||
+ | | 989 | TCP/ | ||
+ | | 990 | TCP/ | ||
+ | | 992 | TCP/ | ||
+ | | 993 | TCP | IMAPS | IMAP의 암호화 통신 | ||
+ | | 995 | TCP | POP3S | POP3의 암호화 통신 | ||
+ | |||
=== 컨테이너 이름 변경(docker container rename) === | === 컨테이너 이름 변경(docker container rename) === | ||
+ | > 컨테이너 이름 변경 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker container rename old new | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
=== 컨테이너 안의 파일을 복사(docker container cp) === | === 컨테이너 안의 파일을 복사(docker container cp) === | ||
+ | > 컨테이너 안의 파일을 호스트에 복사 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | <alert type=" | ||
+ | |||
+ | </ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker container cp webserver:/ | ||
+ | $ docker container cp ./test.txt webserver:/ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
=== 컨테이너 조작의 차분 확인(docker container diff) === | === 컨테이너 조작의 차분 확인(docker container diff) === | ||
+ | > 컨테이너 안에서 어떤 조작을 하여 컨테이너가 이미지로부터 생성되었을 때와 달라진 점(차분)을 확인 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 변경의 구분 | ||
+ | ^ 구분 | ||
+ | | A | 파일 추가 | ||
+ | | D | 파일 삭제 | ||
+ | | C | 파일 수정 | ||
+ | |||
+ | </ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker container diff test | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
Line 452: | Line 1080: | ||
==== 이미지 생성 ==== | ==== 이미지 생성 ==== | ||
+ | > docker 컨테이너를 바탕으로 docker 이미지 작성 | ||
+ | |||
=== 컨테이너로부터 이미지 작성(docker container commit) === | === 컨테이너로부터 이미지 작성(docker container commit) === | ||
+ | > 컨테이너로부터 이미지 작성 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | </ | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --author, -a | 작성자를 지정한다(ex; | ||
+ | | --message, -m | 메시지를 지정한다. | ||
+ | | --change, -c | 커밋 시 Dockerfile 명령을 지정한다. | ||
+ | | --pause, -p | 컨테이너를 일시 정지하고 커밋한다. | ||
+ | |||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker container commit -a "Alex Levine" | ||
+ | $ docker image inspect alexlevine/ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
=== 컨테이너를 tar 파일로 출력(docker container export) === | === 컨테이너를 tar 파일로 출력(docker container export) === | ||
+ | > 가동 중인 컨테이너의 디렉토리/ | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | </ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker container export webserver > latest.tar | ||
+ | $ tar -tf latest.tar | ||
+ | $ tar tf latest.tar | more | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
=== tar 파일로부터 이미지 작성(docker image import) === | === tar 파일로부터 이미지 작성(docker image import) === | ||
+ | > Linux OS 이미지의 디렉토리/ | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | * docker image import 명령으로 지정할 수 있는 아카이브 파일; tar, tar.gz, tgz, bzip, tar.xz, txz | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | <cli prompt=" | ||
+ | $ cat latest.tar | docker image import - alexlevine/ | ||
+ | $ docker image ls # 이미지 확인 | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
=== 이미지 저장(docker image save) === | === 이미지 저장(docker image save) === | ||
+ | > docker 이미지를 tar로 저장 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | </ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker image save -o export.tar tensorflow | ||
+ | $ ls -l | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
=== 이미지 읽어 들이기(docker image load) === | === 이미지 읽어 들이기(docker image load) === | ||
+ | > tar 이미지로부터 이미지를 읽음 | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | </ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker image load -i export.tar | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | * docker container export <-> docker container import | ||
+ | * docker image save <-> docker image load | ||
=== 불필요한 이미지/ | === 불필요한 이미지/ | ||
+ | > 사용하지 않는 이미지, 컨테이너, | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --all, -a | 사용하지 않는 리소스를 모두 삭제한다. | ||
+ | | --force, -f | 강제적으로 삭제한다. | ||
+ | </ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker system prune -a # 불필요한 리소스 삭제 | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
Line 468: | Line 1219: | ||
---- | ---- | ||
===== Dockerfile을 사용한 코드에 의한 서버 구축 ===== | ===== Dockerfile을 사용한 코드에 의한 서버 구축 ===== | ||
+ | * Dockerfile; 베이스가 되는 이미지에 각종 미들웨어를 설치 및 설정하고, | ||
==== Dockerfile을 사용한 구성 관리 ==== | ==== Dockerfile을 사용한 구성 관리 ==== | ||
+ | - 베이스가 될 Docker 이미지 | ||
+ | - Docker 컨테이너 안에서 수행한 조작(명령) | ||
+ | - 환경변수 등의 설정 | ||
+ | - Docker 컨테이너 안에서 작동시켜둘 데몬 실행 | ||
- | === Dockerfile이란? | ||
- | === Dockerfile의 기본 구문 === | ||
- | === Dockerfile 작성 === | + | === Dockerfile의 기본 구문 및 작성 === |
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ Dockerfile의 명령 | ||
+ | ^ 명령 | ||
+ | | FROM | 베이스 이미지 지정 | ||
+ | | RUN | 명령 실행 | ||
+ | | CMD | 컨테이너 실행 명령 | ||
+ | | LABEL | 라벨 설정 | ||
+ | | EXPOSE | ||
+ | | ENV | 환경변수 | ||
+ | | ADD | 파일/ | ||
+ | | COPY | 파일 복사 | ||
+ | | ENTRYPOINT | ||
+ | | VOLUME | ||
+ | | USER | 사용자 지정 | ||
+ | | WORKDIR | ||
+ | | ARG | Dockerfile 안의 변수 | ||
+ | | ONBUILD | ||
+ | | STOPSIGNAL | ||
+ | | HEALTHCHECK | ||
+ | | SHELL | 기본 쉘 설정 | ||
+ | |||
+ | * 주석; # | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <panel type=" | ||
+ | < | ||
+ | * FROM 명령 | ||
+ | |||
+ | <alert type=" | ||
+ | <alert type=" | ||
+ | <alert type=" | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
==== Dockerfile의 빌드와 이미지 레이어 ==== | ==== Dockerfile의 빌드와 이미지 레이어 ==== | ||
=== Dockerfile로부터 Docker 이미지 만들기 === | === Dockerfile로부터 Docker 이미지 만들기 === | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | </ | ||
+ | <cli prompt=" | ||
+ | $ docker build -t sample:1.0 / | ||
+ | $ docker build -t sample -f Dockerfile.base . # Dockerfile.base 파일 빌드 | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
=== Docker 이미지의 레이어 구조 === | === Docker 이미지의 레이어 구조 === | ||
+ | * Dockerfile의 명령 한 줄마다 이미지 작성 | ||
==== 멀티스테이지 빌드를 사용한 애플리케이션 개발 ==== | ==== 멀티스테이지 빌드를 사용한 애플리케이션 개발 ==== | ||
+ | > 빌드 환경, 제품 환경이 다르므로 멀티스테이지 빌드 기능 사용 | ||
=== Dockerfile 만들기 === | === Dockerfile 만들기 === | ||
+ | <sxh> | ||
+ | # 1. Build Image | ||
+ | FROM golang: | ||
+ | |||
+ | # Install dependencies | ||
+ | WORKDIR / | ||
+ | RUN go get -d -v github.com/ | ||
+ | |||
+ | $ Build modules | ||
+ | COPY main.go . | ||
+ | RUN GOOS=linux go build -a -o greet . | ||
+ | |||
+ | # ------------------------- | ||
+ | # 2. Production Image | ||
+ | FROM busybox | ||
+ | WORKDIR / | ||
+ | |||
+ | # Deploy modules | ||
+ | COPY --from=builder / | ||
+ | ENTRYPOINT [" | ||
+ | </ | ||
=== Docker 이미지의 빌드 === | === Docker 이미지의 빌드 === | ||
+ | <cli prompt=" | ||
+ | $ docker build -t greet . | ||
+ | </ | ||
=== Docker 컨테이너의 시작 === | === Docker 컨테이너의 시작 === | ||
+ | <cli prompt=" | ||
+ | $ docker container run -it --rm greet alex | ||
+ | Hello alex | ||
+ | |||
+ | $ docker container run -it --rm greet --lang=es alex | ||
+ | Hola alex | ||
+ | </ | ||
+ | |||
==== 명령 및 데몬 실행 ==== | ==== 명령 및 데몬 실행 ==== | ||
+ | > Dockerfile에서 명령이나 데몬을 실행하는 방법 | ||
=== 명령 실행(RUN 실행) === | === 명령 실행(RUN 실행) === | ||
+ | <alert type=" | ||
+ | |||
+ | - Shell 형식으로 기술; 쉘 경유. | ||
+ | - Exec 형식으로 기술; 쉘을 경유하지 않고 직접 실행 | ||
+ | |||
+ | |||
+ | <sxh> | ||
+ | # Shell 형식 | ||
+ | RUN apt-get install -y nginx | ||
+ | |||
+ | # Exec 형식 | ||
+ | RUN ["/ | ||
+ | </ | ||
+ | |||
+ | * RUN 명령을 여러 개 지정하면 명령 줄만큼의 레이어 생성 | ||
+ | * RUN 명령을 한 줄로 지정하면 하나의 레이어 생성; RUN 명령의 줄 바꿈은 \ | ||
=== 데몬 실행(CMD 명령) === | === 데몬 실행(CMD 명령) === | ||
+ | * RUN 명령은 이미지를 작성하기 위해 실행하는 명령을 기술, 이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행하려면 CMD | ||
+ | * Dockerfile에는 하나의 CMD 명령. 여러 개 지정시 마지막 명령만 유효 | ||
+ | |||
+ | <alert type=" | ||
+ | |||
+ | - 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=" | ||
+ | |||
+ | - Exec 형식으로 기술 | ||
+ | - Shell 형식으로 기술 | ||
+ | |||
+ | * ENTRYPOINT vs. CMD; | ||
+ | * CMD; 컨테이너 시작 시에 실행하고 싶은 명령을 정의해도 docker container run 명령 실행 시에 인수로 새로운 명령을 지정한 경우 이것을 우선 실행 | ||
+ | * ENTRYPOINT; 지정한 명령은 반드시 컨테이너에서 실행, 실행 시에 명령 인수를 지정하고 싶을 때는 CMD 명령과 조합하여 사용. | ||
=== 빌드 완료 후에 실행되는 명령(ONBUILD 명령) === | === 빌드 완료 후에 실행되는 명령(ONBUILD 명령) === | ||
+ | |||
+ | <alert type=" | ||
=== 시스템 콜 시그널의 설정(STOPSIGNAL 명령) === | === 시스템 콜 시그널의 설정(STOPSIGNAL 명령) === | ||
+ | <alert type=" | ||
=== 컨테이너의 헬스 체크 명령(HEALTHCHECK 명령) === | === 컨테이너의 헬스 체크 명령(HEALTHCHECK 명령) === | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 옵션 | ||
+ | ^ 옵션 | ||
+ | | --interval=n | ||
+ | | --timeout=n | ||
+ | | --retries=n | ||
+ | |||
==== 환경 및 네트워크 설정 ==== | ==== 환경 및 네트워크 설정 ==== | ||
+ | > Dockerfile 안에서 이용할 수 있는 환경변수나 컨테이너 안에서의 작업 디렉토리 지정 | ||
=== 환경변수 설정(ENV 명령) === | === 환경변수 설정(ENV 명령) === | ||
+ | <alert type=" | ||
+ | <alert type=" | ||
=== 작업 디렉토리 지정(WORKDIR 명령) === | === 작업 디렉토리 지정(WORKDIR 명령) === | ||
+ | <alert type=" | ||
+ | |||
+ | * RUN, CMD, ENTRYPOINT, COPY, ADD 명령에 대한 작업 디렉토리 지정 | ||
=== 사용자 지정(USER 명령) === | === 사용자 지정(USER 명령) === | ||
+ | * RUN, CMD, ENTRYPOINT 명령을 실행하기 위한 사용자 지정 | ||
+ | |||
+ | <alert type=" | ||
+ | |||
=== 라벨 지정(LABEL 명령) === | === 라벨 지정(LABEL 명령) === | ||
+ | * 이미지에 버전 정보나 작성자 정보, 코멘트 등과 같은 정보를 제공할 때 사용 | ||
+ | |||
+ | <alert type=" | ||
+ | |||
=== 포트 설정(EXPOSE 명령) === | === 포트 설정(EXPOSE 명령) === | ||
+ | * 컨테이너의 공개 포트 번호를 지정 | ||
+ | |||
+ | <alert type=" | ||
=== Dockerfile 내 변수의 설정(ARG 명령) === | === Dockerfile 내 변수의 설정(ARG 명령) === | ||
+ | * Dockerfile 안에서 사용할 변수를 정의할 때 사용 | ||
+ | |||
+ | <alert type=" | ||
+ | |||
=== 기본 쉘 설정(SHELL 명령) === | === 기본 쉘 설정(SHELL 명령) === | ||
+ | * 쉘 형식으로 명령을 실행할 때 기본 쉘 설정 | ||
+ | |||
+ | <alert type=" | ||
==== 파일 설정 ==== | ==== 파일 설정 ==== | ||
=== 파일 및 디렉토리 추가(ADD 명령) === | === 파일 및 디렉토리 추가(ADD 명령) === | ||
+ | * 이미지에 호스트 상의 파일이나 디렉토리를 추가할 때 사용 | ||
+ | |||
+ | <alert type=" | ||
+ | <alert type=" | ||
+ | |||
+ | * 빌드에 불필요한 파일 제외; .dockerignore 파일 작성 | ||
+ | |||
=== 파일 복사(COPY 명령) === | === 파일 복사(COPY 명령) === | ||
+ | * 이미지에 호스트 상의 파일이나 디렉토리를 복사할 때 사용 | ||
+ | |||
+ | <alert type=" | ||
+ | <alert type=" | ||
+ | |||
+ | * Dockerfile의 저장 위치; 빌드에 필요 없는 파일은 Dockerfile과 똑같은 디렉토리에 두지 않도록 주의 | ||
=== 볼룸 마운트(VOLUME 명령) === | === 볼룸 마운트(VOLUME 명령) === | ||
+ | * 이미지에 볼륨을 할당 | ||
+ | |||
+ | <alert type=" | ||
Line 537: | Line 1474: | ||
==== Docker 이미지의 자동 생성 및 공개 ==== | ==== Docker 이미지의 자동 생성 및 공개 ==== | ||
- | === Automated Build의 흐름 | + | * Automated Build의 흐름; Docker Hub에는 버전 관리 툴인 GitHub 및 Bitbucket과 연결하여 Dockerfile로부터 Docker 이미지를 자동으로 생성하는 ' |
- | + | | |
- | === GitHub에 공개하기 | + | |
- | + | | |
- | === Docker Hub의 링크 설정 | + | |
- | + | ||
- | === Dockerfile의 빌드 | + | |
- | + | ||
- | === Docker 이미지 확인 | + | |
==== Docker Registry를 사용한 프라이빗 레지스트리 구축 ==== | ==== Docker Registry를 사용한 프라이빗 레지스트리 구축 ==== | ||
- | === 로컬 환경에 Docker 레지스트리 구축하기 | + | - 로컬 환경에 Docker 레지스트리 구축하기; Docker Store에 공개되어 있는 공식 이미지 ' |
- | + | | |
- | === Docker 이미지 업로드 | + | |
- | + | ||
- | === Docker 이미지의 다운로드와 작동 확인 | + | |
==== 클라우드 서비스를 사용한 프라이빗 레지스트리 구축 ==== | ==== 클라우드 서비스를 사용한 프라이빗 레지스트리 구축 ==== | ||
- | === Google Container Registry 준비하기 | + | * GCP(Google Cloud Platform)은 Docker 이미지를 프라이빗으로 관리할 수 있는 ' |
- | + | - Google Container Registry 준비하기 | |
- | === Docker 이미지의 업로드 | + | |
- | + | | |
- | === Docker 이미지의 다운로드와 작동 확인 | + | |
Line 569: | 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; | ||
==== 웹 애플리케이션을 로컬에서 움직여 보자 ==== | ==== 웹 애플리케이션을 로컬에서 움직여 보자 ==== | ||
- | === Compose 구성 파일의 작성 | + | - Compose 구성 파일의 작성; 소스 파일 확인 -> 구성 정의 |
+ | - 여러 Docker 컨테이너 시작; $ docker-compose up | ||
+ | - docker-compose ps | ||
+ | - 여러 Docker 컨테이너 정지; $ docker-compose stop | ||
+ | - docker-compose down; 리소스 삭제 | ||
- | === 여러 | + | ==== Docker Compose를 사용한 |
+ | > ' | ||
- | === 여러 Docker 컨테이너 정지 === | + | * YAML |
- | ==== Docker Compose를 사용한 여러 컨테이너의 구성 관리 ==== | ||
=== docker-compose.yml의 개요 === | === docker-compose.yml의 개요 === | ||
+ | * 버전 | ||
+ | <cli> | ||
+ | version: 3.3 | ||
+ | </ | ||
- | === 이미지 지정(image) === | + | ^ Compose |
+ | ^ Compose 정의 파일의 버전 | ||
+ | | 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: " | ||
- | === 컨테이너 안에서 작동하는 명령 지정(command/ | + | # 서비스 |
+ | services: | ||
+ | webserver: | ||
+ | image: ubuntu | ||
+ | ports: | ||
+ | - " | ||
+ | networks: | ||
+ | - webnet | ||
- | === 컨테이너 간 연결(links) === | + | redis: |
+ | image: redis | ||
+ | networks: | ||
+ | - webnet | ||
- | === 컨테이너 간 통신(ports/expose) === | + | # 네트워크 정의 |
+ | networks: | ||
+ | webnet: | ||
+ | |||
+ | #데이터 볼륨 정의 | ||
+ | volumes: | ||
+ | data-volume: | ||
+ | </cli> | ||
- | === 서비스의 의존관계 정의(depends_on) === | + | - 이미지 지정(image) |
- | + | - 이미지 빌드(build) === | |
- | === 컨테이너 환경변수 지정(environment/ | + | - 컨테이너 안에서 작동하는 명령 지정(command/ |
- | + | - 컨테이너 간 연결(links) === | |
- | === 컨테이너 정보 설정(container_name/ | + | - 컨테이너 간 통신(ports/ |
- | + | - 서비스의 의존관계 정의(depends_on) === | |
- | === 컨테이너 데이터 관리(volumes/ | + | |
+ | | ||
+ | | ||
==== Docker Compose를 사용한 여러 컨테이너의 운용 ==== | ==== Docker Compose를 사용한 여러 컨테이너의 운용 ==== | ||
=== Docker Compose의 버전 확인 === | === Docker Compose의 버전 확인 === | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker-compose --version | ||
+ | </ | ||
=== Docker COmpose의 기본 명령 === | === Docker COmpose의 기본 명령 === | ||
+ | |||
+ | ^ Docker Compose의 주요 서브 명령 | ||
+ | ^ 서브 명령 | ||
+ | | up | 컨테이너 생성/ | ||
+ | | ps | 컨테이너 목록 표시 | ||
+ | | logs | 컨테이너 로그 출력 | ||
+ | | run | 컨테이너 실행 | ||
+ | | start | 컨테이너 시작 | ||
+ | | stop | 컨테이너 정지 | ||
+ | | restart | ||
+ | | pause | 컨테이너 일시 정지 | ||
+ | | unpause | ||
+ | | port | 공개 포트 번호 표시 | ||
+ | | config | ||
+ | | kill | 실행 중인 컨테이너 강제 정지 | ||
+ | | rm | 컨테이너 삭제 | ||
+ | | down | 리소스 삭제 | ||
+ | |||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker-compose -f ./ | ||
+ | $ docker-compose stop webserver | ||
+ | </ | ||
+ | |||
=== 여러 컨테이너의 생성(up) === | === 여러 컨테이너의 생성(up) === | ||
+ | < | ||
+ | <col sm=" | ||
+ | <panel type=" | ||
+ | < | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | -d | 백그라운드에서 실행한다. | ||
+ | | --no-depos | ||
+ | | --build | ||
+ | | --no-build | ||
+ | | -t, --timeout | ||
+ | | --scale SERVICE=서비스 수 | 서비스 수를 지정한다. | ||
+ | |||
+ | </ | ||
+ | <alert type=" | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
=== 여러 컨테이너 확인(ps/ | === 여러 컨테이너 확인(ps/ | ||
+ | <cli prompt=" | ||
+ | $ docker-compose ps # 여러 컨테이너의 상태 확인 | ||
+ | $ docker-compose -q # 컨테이너 ID 확인 | ||
+ | $ docker-compose logs # docker 령령을 사용한 로그 확인 | ||
+ | </ | ||
=== 컨테이너에서 명령 실행(run) === | === 컨테이너에서 명령 실행(run) === | ||
+ | <cli prompt=" | ||
+ | $ docker-compose run server_a /bin/bash | ||
+ | </ | ||
=== 여러 컨테이너 시작/ | === 여러 컨테이너 시작/ | ||
+ | * 컨테이너 일관 시작/ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker-compose start | ||
+ | $ docker-compose stop | ||
+ | $ docker-compose restart | ||
+ | </ | ||
+ | |||
+ | * 특정 컨테이너 재시작 | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker-compose restart server_a | ||
+ | </ | ||
=== 여러 컨테이너 일시 정시/ | === 여러 컨테이너 일시 정시/ | ||
+ | <cli prompt=" | ||
+ | $ docker-compose pause # 컨테이너 일시 정지 | ||
+ | $ docker-compose unpause | ||
+ | </ | ||
=== 서비스의 구성 확인(port/ | === 서비스의 구성 확인(port/ | ||
+ | |||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --protocol=proto | ||
+ | | --index=index | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker-compose port webserver 80 # 공개 포트 확인 | ||
+ | </ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker-compose config | ||
+ | </ | ||
+ | |||
=== 여러 컨테이너 강제 정지/ | === 여러 컨테이너 강제 정지/ | ||
+ | <cli prompt=" | ||
+ | $ docker-compose kill -s SIGINT | ||
+ | </ | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker-compose rm # 여러 컨테이너 일괄 삭제 | ||
+ | </ | ||
+ | |||
+ | * Linux의 시그널; POSIX.1-1990 규격 | ||
+ | |||
+ | ^ Docker Compose의 주요 서브 명령 | ||
+ | ^ 시그널 | ||
+ | | SIGHUP | ||
+ | | SIGINT | ||
+ | | SIGQUIT | ||
+ | | SIGTERM | ||
+ | | SIGKILL | ||
+ | | SIGSTOP | ||
=== 여러 리소스의 일괄 삭제(down) === | === 여러 리소스의 일괄 삭제(down) === | ||
+ | |||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --rmi all | 모든 이미지를 삭제 | ||
+ | | --rmi local | 커스텀 태그가 없는 이미지만 삭제 | ||
+ | | -v, --volumes | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker-compose down --rmi all # 여러 이미지 삭제 | ||
+ | </ | ||
Line 634: | Line 1732: | ||
---- | ---- | ||
===== 멀티호스트 환경에서 Docker 실행 환경 구축 ===== | ===== 멀티호스트 환경에서 Docker 실행 환경 구축 ===== | ||
- | |||
==== 멀티호스트 환경에서 컨테이너 관리의 개요 ==== | ==== 멀티호스트 환경에서 컨테이너 관리의 개요 ==== | ||
=== 멀티호스트 환경과 클러스터링 === | === 멀티호스트 환경과 클러스터링 === | ||
+ | * 클러스터링; | ||
+ | * 가용성(Availability); | ||
+ | * 확장성(Scalability); | ||
+ | |||
=== Docker Machine이란? | === Docker Machine이란? | ||
+ | * 호스트 머신/ | ||
+ | * https:// | ||
+ | |||
==== 웹 애플리케이션을 서비스 공개해 보자 ==== | ==== 웹 애플리케이션을 서비스 공개해 보자 ==== | ||
- | === Docker 실행 환경 작성 | + | - Docker 실행 환경 작성 |
- | + | | |
- | === 웹 애플리케이션 전개 | + | |
- | + | ||
- | === Docker 실행 환경 삭제 | + | |
==== Docker Machine을 사용한 실행 환경 구축 ==== | ==== Docker Machine을 사용한 실행 환경 구축 ==== | ||
=== Docker Machine의 기본 명령 === | === Docker Machine의 기본 명령 === | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker-machine --version | ||
+ | </ | ||
+ | |||
+ | ^ Docker Machine의 서브 명령 | ||
+ | ^ 서브 명령 | ||
+ | | create | ||
+ | | ls | 실행 환경 목록 표시 | ||
+ | | status | ||
+ | | url | 실행 환경 URL 표시 | ||
+ | | ssh | 실행 환경에 대한 SSH 연결 | ||
+ | | start | 실행 환경 시작 | ||
+ | | stop | 실행 환경 정지 | ||
+ | | restart | ||
+ | | scp | 실행 환경에서 파일 다운로드 | ||
+ | | rm | 실행 환경 삭제 | ||
+ | | kill | 실행 환경 강제 정지 | ||
+ | | ip | 실행 환경 IP 주소 확인 | ||
+ | | inspect | ||
+ | |||
=== 실행 환경 작성(create) === | === 실행 환경 작성(create) === | ||
+ | <alert type=" | ||
+ | |||
+ | * Docker Machine에서 이용할 수 있는 드라이버 목록; https:// | ||
+ | |||
=== 실행 환경 목록 표시(ls/ | === 실행 환경 목록 표시(ls/ | ||
+ | <alert type=" | ||
+ | |||
+ | ^ 지정할 수 있는 주요 옵션 | ||
+ | ^ 옵션 | ||
+ | | --quite, -q | 머신명만 표시한다 | ||
+ | | --filter | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker-machine status host1 # 실행 환경의 스테이터스 확인 | ||
+ | $ docker-machine url host1 # 실행 환경의 URL 확인 | ||
+ | </ | ||
=== 실행 환경에 대한 SSH 연결(ssh) === | === 실행 환경에 대한 SSH 연결(ssh) === | ||
+ | <alert type=" | ||
+ | |||
+ | <cli prompt=" | ||
+ | $ docker-machine ssh host1 | ||
+ | </ | ||
+ | |||
=== 실행 환경 시작/ | === 실행 환경 시작/ | ||
+ | <cli prompt=" | ||
+ | $ docker-machine start host1 # 실행 환경 시작 | ||
+ | $ docker-machine stop host1 # 실행 환경 정지 | ||
+ | $ docker-machine restart host1 # 실행 환경 재시작 | ||
+ | </ | ||
=== 실행 환경으로부터 파일 다운로드(scp) === | === 실행 환경으로부터 파일 다운로드(scp) === | ||
+ | <cli prompt=" | ||
+ | $ docker-machine scp host1:/ | ||
+ | </ | ||
+ | |||
+ | * SCP(Secure Copy Protocol); SSH의 기능을 사용하여 파일을 전송하기 위한 명령 Secure Copy Protocol로 인증 정보와 데이터를 암호화하여 네트워크로 전송 | ||
=== 실행 환경 삭제(rm/ | === 실행 환경 삭제(rm/ | ||
+ | <cli prompt=" | ||
+ | $ docker-machine rm -f host1 # 실행 환경 삭제 | ||
+ | $ docker-machine kill host1 # 실행 환경 강제 정지 | ||
+ | </ | ||
=== 실행 환경 정보 확인(ip/ | === 실행 환경 정보 확인(ip/ | ||
+ | <cli prompt=" | ||
+ | $ docker-machine ip host1 # IP 주소 확인 | ||
+ | </ | ||
+ | <alert type=" | ||
Line 673: | 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 693: | Line 1880: | ||
=== Kubernetes의 구조 === | === Kubernetes의 구조 === | ||
+ | * 마스터(Master); | ||
+ | * 데이터 스토어(etcd) | ||
+ | * 노드(Node); | ||
==== GCP를 사용한 Docker 애플리케이션 개발 ==== | ==== GCP를 사용한 Docker 애플리케이션 개발 ==== | ||
Line 701: | 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 726: | 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 740: | Line 1956: | ||
=== Kubernetes의 리소스 작성/ | === Kubernetes의 리소스 작성/ | ||
+ | * 리소스 작성 | ||
+ | * 리소스 삭제 | ||
+ | * 리소스 변경 | ||
=== Kubernetes의 업그레이드/ | === Kubernetes의 업그레이드/ | ||
Line 830: | 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 사용법 ==== | ||