체크포인트
Publish your container image to Container Registry
/ 100
Docker 소개
GSP055
개요
Docker는 애플리케이션을 개발, 출시, 실행하는 데 사용하는 개방형 플랫폼입니다. Docker를 사용하면 인프라에서 애플리케이션을 분리하고 인프라를 관리형 애플리케이션처럼 취급할 수 있습니다. Docker는 코드를 더욱 빠르게 출시, 테스트, 배포하고 코드 작성과 실행 주기를 단축하는 데 도움이 됩니다.
이는 Docker가 커널 컨테이너화 기능을 애플리케이션 관리 및 배포를 지원하는 워크플로 및 도구와 결합하기 때문입니다.
Docker 컨테이너는 Kubernetes에서 직접 사용할 수 있으므로 Kubernetes Engine에서 쉽게 실행할 수 있습니다. Docker의 핵심 내용을 학습하면 Kubernetes 및 컨테이너 애플리케이션 개발을 시작하는 데 필요한 기술을 갖출 수 있습니다.
목표
이 실습에서 학습할 작업 수행 방법은 다음과 같습니다.
- Docker 컨테이너 빌드, 실행, 디버그하기
- Docker Hub 및 Google Artifact Registry에서 Docker 이미지 가져오기
- Google Artifact Registry에 Docker 이미지 푸시하기
기본 요건
이 실습은 입문용이며, Docker 및 컨테이너 사용 경험이 거의 없거나 전혀 없는 사용자를 대상으로 합니다. Cloud Shell 및 명령줄을 잘 안다면 좋지만 필수 사항은 아닙니다.
설정 및 요건
실습 시작 버튼을 클릭하기 전에
다음 안내를 확인하세요. 실습에는 시간 제한이 있으며 일시중지할 수 없습니다. 실습 시작을 클릭하면 타이머가 시작됩니다. 이 타이머에는 Google Cloud 리소스를 사용할 수 있는 시간이 얼마나 남았는지 표시됩니다.
실무형 실습을 통해 시뮬레이션이나 데모 환경이 아닌 실제 클라우드 환경에서 직접 실습 활동을 진행할 수 있습니다. 실습 시간 동안 Google Cloud에 로그인하고 액세스하는 데 사용할 수 있는 새로운 임시 사용자 인증 정보가 제공됩니다.
이 실습을 완료하려면 다음을 준비해야 합니다.
- 표준 인터넷 브라우저 액세스 권한(Chrome 브라우저 권장)
- 실습을 완료하기에 충분한 시간---실습을 시작하고 나면 일시중지할 수 없습니다.
실습을 시작하고 Google Cloud 콘솔에 로그인하는 방법
-
실습 시작 버튼을 클릭합니다. 실습 비용을 결제해야 하는 경우 결제 수단을 선택할 수 있는 팝업이 열립니다. 왼쪽에는 다음과 같은 항목이 포함된 실습 세부정보 패널이 있습니다.
- Google Cloud 콘솔 열기 버튼
- 남은 시간
- 이 실습에 사용해야 하는 임시 사용자 인증 정보
- 필요한 경우 실습 진행을 위한 기타 정보
-
Google Cloud 콘솔 열기를 클릭합니다(Chrome 브라우저를 실행 중인 경우 마우스 오른쪽 버튼으로 클릭하고 시크릿 창에서 링크 열기를 선택합니다).
실습에서 리소스가 가동되면 다른 탭이 열리고 로그인 페이지가 표시됩니다.
팁: 두 개의 탭을 각각 별도의 창으로 나란히 정렬하세요.
참고: 계정 선택 대화상자가 표시되면 다른 계정 사용을 클릭합니다. -
필요한 경우 아래의 사용자 이름을 복사하여 로그인 대화상자에 붙여넣습니다.
{{{user_0.username | "Username"}}} 실습 세부정보 패널에서도 사용자 이름을 확인할 수 있습니다.
-
다음을 클릭합니다.
-
아래의 비밀번호를 복사하여 시작하기 대화상자에 붙여넣습니다.
{{{user_0.password | "Password"}}} 실습 세부정보 패널에서도 비밀번호를 확인할 수 있습니다.
-
다음을 클릭합니다.
중요: 실습에서 제공하는 사용자 인증 정보를 사용해야 합니다. Google Cloud 계정 사용자 인증 정보를 사용하지 마세요. 참고: 이 실습에 자신의 Google Cloud 계정을 사용하면 추가 요금이 발생할 수 있습니다. -
이후에 표시되는 페이지를 클릭하여 넘깁니다.
- 이용약관에 동의합니다.
- 임시 계정이므로 복구 옵션이나 2단계 인증을 추가하지 않습니다.
- 무료 체험판을 신청하지 않습니다.
잠시 후 Google Cloud 콘솔이 이 탭에서 열립니다.
Cloud Shell 활성화
Cloud Shell은 다양한 개발 도구가 탑재된 가상 머신으로, 5GB의 영구 홈 디렉터리를 제공하며 Google Cloud에서 실행됩니다. Cloud Shell을 사용하면 명령줄을 통해 Google Cloud 리소스에 액세스할 수 있습니다.
- Google Cloud 콘솔 상단에서 Cloud Shell 활성화 를 클릭합니다.
연결되면 사용자 인증이 이미 처리된 것이며 프로젝트가 PROJECT_ID로 설정됩니다. 출력에 이 세션의 PROJECT_ID를 선언하는 줄이 포함됩니다.
gcloud
는 Google Cloud의 명령줄 도구입니다. Cloud Shell에 사전 설치되어 있으며 명령줄 자동 완성을 지원합니다.
- (선택사항) 다음 명령어를 사용하여 활성 계정 이름 목록을 표시할 수 있습니다.
-
승인을 클릭합니다.
-
다음과 비슷한 결과가 출력됩니다.
출력:
- (선택사항) 다음 명령어를 사용하여 프로젝트 ID 목록을 표시할 수 있습니다.
출력:
출력 예시:
gcloud
전체 문서는 Google Cloud에서 gcloud CLI 개요 가이드를 참조하세요.
작업 1. Hello World
- 시작하려면 Cloud Shell에서 다음 명령어를 입력하여 Hello World 컨테이너를 실행합니다.
(명령어 결과)
이 간단한 컨테이너는 화면에 Hello from Docker!
를 반환합니다. 명령어는 간단하지만 출력된 결과에서 실행된 단계의 수에 주목하세요. Docker 데몬이 hello-world 이미지를 검색했으나 로컬에서 이미지를 찾지 못했고, Docker Hub라는 공개 레지스트리에서 이미지를 가져오고, 가져온 이미지에서 컨테이너를 생성하고, 컨테이너를 실행했습니다.
- 다음 명령어를 실행하여 Docker Hub에서 가져온 컨테이너 이미지를 확인하세요.
(명령어 결과)
Docker Hub 공개 레지스트리에서 가져온 이미지입니다. 이미지 ID는 SHA256 해시 형식입니다. 이 필드에서는 프로비저닝된 Docker 이미지를 지정합니다. Docker 데몬이 로컬에서 이미지를 찾을 수 없으면 기본적으로 공개 레지스트리에서 이미지를 검색합니다.
- 컨테이너를 다시 실행합니다.
(명령어 결과)
두 번째 실행했을 때 Docker 데몬이 로컬 레지스트리에서 이미지를 찾은 뒤 이 이미지에서 컨테이너를 실행하였음을 확인할 수 있습니다. Docker 데몬이 반드시 Docker Hub에서 이미지를 가져올 필요는 없습니다.
- 마지막으로 다음 명령어를 실행하여 실행 중인 컨테이너를 확인합니다.
(명령어 결과)
실행 중인 컨테이너가 없습니다. 전에 실행한 hello-world 컨테이너를 이미 종료했습니다.
- 실행이 완료된 컨테이너를 포함하여 모든 컨테이너를 보려면
docker ps -a
를 실행하세요.
(명령어 결과)
여기에는 Docker가 컨테이너를 식별하기 위해 생성한 UUID인 CONTAINER ID
와 실행에 관한 추가 메타데이터가 표시됩니다. 또한 컨테이너 Names
도 무작위로 생성되지만 docker run --name [container-name] hello-world
를 사용하여 지정할 수 있습니다.
작업 2. 빌드
이 섹션에서는 간단한 노드 애플리케이션을 기반으로 한 Docker 이미지를 빌드합니다.
- 다음 명령어를 실행하여
test
라는 이름의 폴더를 만들고 이 폴더로 전환합니다.
-
Dockerfile
만들기
이 파일에서는 Docker 데몬에 이미지를 빌드하는 방법을 안내합니다.
- 첫 번째 줄은 기본 상위 이미지를 지정합니다. 이 경우 기본 상위 이미지는 노드 버전 장기적 지원(LTS)의 공식 Docker 이미지입니다.
- 두 번째 줄에서 컨테이너의 (현재) 작업 디렉터리를 설정합니다.
- 세 번째 줄에서는 현재 디렉터리의 콘텐츠(
"."
로 표시)를 컨테이너에 추가합니다. - 그런 다음 컨테이너의 포트를 공개하여 해당 포트에서의 연결을 허용하고 마지막으로 노드 명령어를 실행하여 애플리케이션을 시작합니다.
Dockerfile
의 각 줄을 숙지하세요. 이제 노드 애플리케이션을 작성한 다음 이미지를 빌드해 보겠습니다.
- 다음 명령어를 실행하여 노드 애플리케이션을 생성합니다.
포트 80에서 수신 대기하고 'Hello World'를 반환하는 간단한 HTTP 서버입니다.
이제 이미지를 빌드합니다.
- 다음 명령어를 Dockerfile이 있는 디렉터리에서 실행해야 합니다. 현재 디렉터리를 의미하는
"."
에 다시 한번 유의하세요.
이 명령어를 완전히 실행하는 데는 몇 분 정도 걸릴 수 있습니다. 실행이 끝나면 다음과 유사한 결과가 출력됩니다.
-t
는 name:tag
문법을 사용하여 이미지의 이름과 태그를 지정하는 역할을 합니다. 이미지 이름은 node-app
이고 태그
는 0.1
입니다. Docker 이미지를 빌드할 때는 태그를 사용하는 것이 좋습니다. 태그를 지정하지 않으면 태그가 기본값인 latest
로 지정되어 최신 이미지와 기존 이미지를 구분하기 어려워집니다. 또한 이미지를 빌드할 때 위 Dockerfile
의 각 행을 통해 중간 컨테이너 레이어가 만들어지는 방식을 확인하세요.
- 이제 다음 명령어를 실행하여 빌드한 이미지를 봅니다.
다음과 유사한 결과가 출력됩니다.
node
는 기본 이미지이고 node-app
은 빌드한 이미지입니다. node
를 삭제하려면 우선 node-app
을 삭제해야 합니다. 이미지의 크기는 VM에 비해 상대적으로 작습니다. node:slim
및 node:alpine
과 같은 노드 이미지의 다른 버전을 사용하면 더 작은 이미지를 제공하여 이식성을 높일 수 있습니다. 컨테이너 크기 줄이기에 관해서는 고급 주제에서 자세히 설명하겠습니다. 노드의 공식 저장소에서 모든 버전을 확인할 수 있습니다.
작업 3. 실행
- 다음 코드를 사용하여 빌드한 이미지를 기반으로 하는 컨테이너를 실행합니다.
(명령어 결과)
--name
플래그를 사용하면 원하는 경우 컨테이너 이름을 지정할 수 있습니다. -p
는 Docker가 컨테이너의 포트 80에 호스트의 포트 4000을 매핑하도록 지시하는 플래그입니다. 이제 http://localhost:4000
에서 서버에 접속할 수 있습니다. 포트 매핑이 없으면 localhost에서 컨테이너에 접속할 수 없습니다.
- 다른 터미널을 열고(Cloud Shell에서
+
아이콘을 클릭) 서버를 테스트합니다.
(명령어 결과)
초기 터미널이 실행되는 동안 컨테이너가 실행됩니다. 컨테이너를 터미널 세션에 종속시키지 않고 백그라운드에서 실행하려면 -d
플래그를 지정해야 합니다.
- 초기 터미널을 닫은 후 다음 명령어를 실행하여 컨테이너를 중지하고 삭제합니다.
- 이제 다음 명령어를 실행하여 백그라운드에서 컨테이너를 시작합니다.
(명령어 결과)
-
docker ps
의 출력된 결과에서 컨테이너가 실행 중임을 확인할 수 있습니다.docker logs [container_id]
를 실행하면 로그를 볼 수 있습니다.
17bcaca6f....
인 경우 docker logs 17b
를 실행할 수 있습니다. (명령어 결과)
이제 애플리케이션을 수정합니다.
- Cloud Shell에서 앞서 실습에서 만든 테스트 디렉터리를 엽니다.
- 원하는 텍스트 편집기(예: nano 또는 vim)로
app.js
를 편집하고 'Hello World'를 다른 문자열로 바꿉니다.
- 이 새 이미지를 빌드하고
0.2
로 태그를 지정합니다.
(명령어 결과)
2단계에서 기존 캐시 레이어를 사용하고 있음을 확인할 수 있습니다. 3단계 이후부터는 app.js
를 변경했기 때문에 레이어가 수정되었습니다.
- 새 이미지 버전으로 다른 컨테이너를 실행합니다. 이때 호스트 포트를 80 대신 8080으로 매핑하는 방법을 확인하세요. 호스트 포트 4000은 이미 사용 중이므로 사용할 수 없습니다.
(명령어 결과)
- 컨테이너를 테스트합니다.
(명령어 결과)
- 이제 처음 작성한 컨테이너를 테스트합니다.
(명령어 결과)
작업 4. 디버그
컨테이너 빌드와 실행을 숙지했으니 이제 몇 가지 디버깅 사례를 살펴보겠습니다.
-
docker logs [container_id]
를 사용하여 컨테이너의 로그를 볼 수 있습니다. 컨테이너가 실행 중일 때 로그 출력을 확인하려면-f
옵션을 사용합니다.
(명령어 결과)
실행 중인 컨테이너에서 대화형 Bash 세션을 시작해야 할 수 있습니다.
- 이 경우
docker exec
를 사용합니다. 다른 터미널을 열고(Cloud Shell에서 + 아이콘을 클릭) 다음 명령어를 입력합니다.
-it
플래그는 pseudo-tty를 할당하고 stdin을 열린 상태로 유지하여 컨테이너와 상호작용할 수 있도록 합니다. Dockerfile
에 지정된 WORKDIR
디렉터리(/app)에서 bash가 실행된 것을 확인할 수 있습니다. 이제 디버깅할 컨테이너 내에서 대화형 셸 세션을 사용할 수 있습니다.
(명령어 결과)
- 디렉터리 확인
(명령어 결과)
- Bash 세션을 종료합니다.
- Docker inspect를 통해 Docker에서 컨테이너의 메타데이터를 검토할 수 있습니다.
(명령어 결과)
-
--format
을 사용하여 반환된 JSON의 특정 필드를 검사합니다. 예를 들면 다음과 같습니다.
(출력 예시)
디버깅에 대한 자세한 내용은 다음 Docker 문서 리소스를 확인하세요.
작업 5. 게시
이제 이미지를 Google Artifact Registry로 푸시합니다. 그런 다음 모든 컨테이너와 이미지를 삭제하여 새로운 환경을 시뮬레이션하고 컨테이너를 가져와서 실행합니다. 이를 통해 Docker 컨테이너의 이식성을 확인할 수 있습니다.
Artifact Registry에서 호스팅하는 비공개 레지스트리에 이미지를 푸시하려면 이미지에 레지스트리 이름으로 태그를 지정해야 합니다. 형식은 <regional-repository>-docker.pkg.dev/my-project/my-repo/my-image
입니다.
대상 Docker 저장소 만들기(Cloud 콘솔 사용)
이미지를 푸시하려면 먼저 저장소를 만들어야 합니다. 이미지를 푸시해도 저장소 만들기가 트리거되지 않으며 Cloud Build 서비스 계정에는 저장소를 만들 권한이 없습니다.
-
탐색 메뉴의 CI/CD에서 Artifact Registry > 저장소로 이동합니다.
-
저장소 옆에 있는 +저장소 만들기 아이콘을 클릭합니다.
-
my-repository
를 저장소 이름으로 지정합니다. -
형식으로 Docker를 선택합니다.
-
'위치 유형'에서 리전을 선택한 후
위치를 선택합니다. -
만들기를 클릭합니다.
인증 구성하기
이미지를 푸시하거나 가져오려면 먼저 Docker가 Artifact Registry에 대한 요청을 인증하는 데 Google Cloud CLI를 사용하도록 구성해야 합니다.
-
리전의 Docker 저장소에 인증을 설정하려면 Cloud Shell에서 다음 명령어를 실행합니다.
- 메시지가 표시되면
Y
를 입력합니다.
이 명령어는 Docker 구성을 업데이트합니다. 이제 Google Cloud 프로젝트의 Artifact Registry와 연결하여 이미지를 푸시하고 가져올 수 있습니다.
Artifact Registry 저장소 만들기(CLI 사용)
- 다음 명령어를 실행하여 아티팩트 저장소를 만듭니다.
컨테이너를 Artifact Registry로 푸시하기
- Dockerfile이 포함된 디렉터리로 변경합니다.
- 명령어를 실행하여
node-app:0.2
에 태그를 지정합니다.
- 다음 명령어를 실행하여 빌드된 Docker 이미지를 확인합니다.
(명령어 결과)
- 이 이미지를 Artifact Registry로 푸시합니다.
명령어 결과(사용자마다 다를 수 있음):
-
푸시가 완료되면 탐색 메뉴의 CI/CD에서 Artifact Registry > 저장소로 이동합니다.
-
my-repository를 클릭합니다.
node-app
Docker 컨테이너가 생성된 것을 볼 수 있습니다.
이미지 테스트하기
새로운 VM을 시작하고 SSH로 새 VM에 접속한 다음 gcloud를 설치할 수도 있지만 여기서는 간단하게 모든 컨테이너와 이미지를 삭제하여 새로운 환경을 시뮬레이션하겠습니다.
- 모든 컨테이너를 중지하고 삭제합니다.
노드 이미지를 삭제하기 전에 (node:lts
의) 하위 이미지를 삭제해야 합니다.
- 다음 명령어를 실행하여 Docker 이미지를 모두 삭제합니다.
(명령어 결과)
이제 새로운 환경이나 다름없습니다.
- 이미지를 가져와서 실행합니다.
- 실행 중인 컨테이너에 대해 curl을 실행합니다.
(명령어 결과)
완료된 작업 테스트하기
내 진행 상황 확인하기를 클릭하여 실행한 작업을 확인합니다. 컨테이너 이미지를 Artifact Registry에 게시하면 평가 점수가 표시됩니다.
여기서는 컨테이너의 이식성을 시연하였습니다. Docker가 호스트(온프레미스 또는 VM)에 설치되어 있을 경우, 공개 또는 비공개 레지스트리에서 이미지를 가져와서 이 이미지를 기반으로 컨테이너를 실행할 수 있습니다. Docker를 제외하면 호스트에 설치해야 하는 애플리케이션 종속 항목이 없습니다.
수고하셨습니다
수고하셨습니다. 이 실습에서는 Docker Hub의 공개 이미지에 기반하여 컨테이너를 실행하는 등 다양한 실제 활동에 참여하셨습니다. 또한 자체 컨테이너 이미지를 빌드하여 Google Artifact Registry에 성공적으로 푸시했습니다. 뿐만 아니라, 실습을 통해 실행 중인 컨테이너를 효과적으로 디버그할 수 있는 기술을 갖추게 되었습니다. 이와 함께, Google Artifact Registry에서 가져온 이미지에 기반하여 컨테이너를 실행하는 경험을 얻어 Docker에 대한 이해와 숙련도를 높였습니다.
다음 단계/더 학습하기
- Dockerfile 참조
- Docker Hub
- 공식 문서를 통해 Docker 자세히 알아보기
- Artifact Registry 문서
Google Cloud 교육 및 자격증
Google Cloud 기술을 최대한 활용하는 데 도움이 됩니다. Google 강의에는 빠른 습득과 지속적인 학습을 지원하는 기술적인 지식과 권장사항이 포함되어 있습니다. 기초에서 고급까지 수준별 학습을 제공하며 바쁜 일정에 알맞은 주문형, 실시간, 가상 옵션이 포함되어 있습니다. 인증은 Google Cloud 기술에 대한 역량과 전문성을 검증하고 입증하는 데 도움이 됩니다.
설명서 최종 업데이트: 2024년 2월 29일
실습 최종 테스트: 2024년 2월29일
Copyright 2024 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.