Docker를 사용하면 더 빠르게 코드를 제공하고, 더 빠르게 테스트하고, 더 빠르게 배송하므로 코드 작성과 코드 실행 사이의 주기를 단축할 수 있음
Hello World
docker run 명령어를 통해 hello-world 컨테이너를 실행 docker 데몬은 hello-world 이미지를 검색하지만 로컬에서 이미지를 찾지 못하므로 Docker Hub이라는 공용 레지스트리에서 이미지를 가져와서 해당 이미지에서 컨테이너를 생성하고 컨테이너를 실행
hello-world 컨테이너 실행
Docker Hub에서 가져온 컨테이너 이미지를 살펴보기 이미지 ID로 SHA256 해시 형식을 가지며 이 필드는 프로비저닝된 Docker 이미지를 지정함
컨테이너 이미지를 살펴보기
다시 hello-word 컨테이너를 실행 두 번째로 hello-world를 실행할 때는 docker 데몬은 로컬 레지스트리에서 이미지를 찾고 컨테이너를 실행함
hello-word 컨테이너를 실행
실행 중인 컨테이너를 확인 이전에 실행한 hello-word 컨테이너는 이미 종료되었으므로 실행 중인 컨테이너가 없음
실행 중인 컨테이너를 확인
실행이 완료된 컨테이너를 포함하여 확인 모든 컨테이너가 보이므로 hello-world가 보이게 되며 컨테이너를 식별하기 위해 Docker에서 생성한 UUID 및 실행에 대한 추가 메타데이터가 표시되게 됨
실행이 완료된 컨테이너를 포함하여 확인
Build
노드 애플리케이션을 기반으로 하는 Docker 이미지를 빌드하기 위해 test 폴더를 만들고 위치 전환
test 폴더를 만들고 위치 전환
Dockerfile 생성 이 파일은 이미지를 빌드하는 방법을 Docker 데몬에 지시함 (1) 기본 상위 이미지를 지정 (2) 컨테이너의 작업(현재) 디렉토리를 설정 (3) 현재 디렉토리의 내용을 컨테이너에 추가 (4) 컨테이너의 포트를 노출하여 해당 포트에서 연결을 수락 (5) node 명령을 실행하여 애플리케이션을 시작
Dockerfile 생성
노드 애플리케이션 작성 포트 80에서 수신 대기하고 "Hello World"를 반환하는 간단한 HTTP 서비스
노드 애플리케이션 작성
이미지를 빌드 -t와 name:tag구문으로 이미지에 이름을 지정하고 태그를 지정할 수 있어 이미지를 구별하는데 도움을 줌 예) -t node-app:0.1 : 이미지의 이름은 node-app, 태그는 0.1
이미지를 빌드
빌드한 이미지 확인 node는 node-app 이미지의 기본 이미지이며, node-app을 먼저 제거해야 node를 지울 수 있으며 노드 이미지를 더 줄이는 버전인 node:slim이나 node:alpine이 존재
빌드한 이미지 확인
Run
빌드한 이미지를 기반으로 컨테이너를 실행 --name 플래그를 사용하면 원하는 컨테이너의 이름을 지정할 수 있고 포트 매핑이 없으면 localhost의 컨테이너에 연결할 수 없으므로 -p의 경우 호스트의 포트를 컨테이너의 포트에 매핑하도록 Docker에 지시
빌드한 이미지를 기반으로 컨테이너를 실행
서버 테스트 초기 터미널이 실행되는 동안 다른 터미널을 열고 컨테이너가 실행되는지 확인
서버 테스트 (컨테이너가 실행되는지 확인)
초기 터미널을 닫고 컨테이너를 중지하고 제거한 후, 두 번째 터미널에서 컨테이너를 백그라운드에서 시작하고 실행과 로그 확인
컨테이너를 중지하고 제거컨테이너를 백그라운드에서 시작하고 실행로그 확인
애플리케이션을 수정하고 저장 텍스트 편집기를 열어 "Hello World"를 "Welcome to Cloud"로 변경하고 새 이미지를 빌드하고 태그를 0.2로 지정
애플리케이션을 수정저장이미지를 빌드
새 이미지 버전으로 새로운 컨테이너 실행 및 서버 테스트 호스트의 포트를 4000:80에서 8080:80으로 매핑하도록 설정하여 컨테이너를 실행한 후 서버 테스트 첫 번째 컨테이너 4000을 확인하면 여전히 "Hello World"이고, 방금 시작한 컨테이너 8080은 "Welcome to Cloud"
새 이미지 버전으로 새로운 컨테이너 실행서버 테스트
Debug
컨테이너의 로그 보기
컨테이너의 로그 보기
실행 중인 컨테이너 내에서 대화형 Bash 세션 시작 -it 플래그를 사용하면 pseudo-tty를 할당하고 표준 입력을 열린 상태로 유지하여 컨테이너와 상호 작용 가능
Bash 세션 시작
Docker insepect를 사용해 Docker에서 컨테이너의 메타데이터를 검사하기 반환된 JSON에서 특정 필드를 검사하는데 --format 사용
메타데이터를 검사메타데이터의 특정 필드 검사
Publish
이미지를 Google Container Registry(gcr)에 푸시 gcr에서 호스팅하는 비공개 레지스트리에 이미지를 푸시하려면 이미지에 레지스트리 이름을 태그해야 함 (1) [hostname] : gcr.io (2) [project-id] : 프로젝트 ID (3) [image] : 이미지 이름 (4) [tag] : 선택한 문자열 태그
이미지를 Google Container Registry(gcr)에 푸시
웹 브라우저에서 이미지 레지스트리를 방문하여 이미지가 gcr에 있는지 확인
이미지가 gcr에 있는지 확인
이미지를 테스트하기 새 VM을 시작하고 해당 VM에 ssh를 실행할 수 있고 gcloud를 설치할 수 있며 단순하게 테스트하기 위해 모든 컨테이너와 이미지를 제거하고 새로운 환경에서 시뮬레이션을 진행하도록 함