JINIers
220630_Introduction to Docker 본문
220630_Introduction to Docker
도커 소개
[개요]
Docker
- 애플리케이션 개발, 배송 및 실행하기 위한 개방형 플랫폼
- 도커를 사용하면 인프라에서 애플리케이션을 분리하고 인프라를 관리되는 애플리케이션처럼 취급할 수 있음
- 커널 컨테이너화 기능을 애플리케이션 관리 및 배포에 도움이 되는 워크플로 및 도구와 결합하여 수행함
- Docker container는 Kubernetes에서 직접 사용할 수 있으므로 Kubernetes Engine에서 쉽게 실행 할 수 있음
[중점사항]
- Docker 컨테이너를 빌드, 실행 및 디버그 하는 방법
- Docker hub 및 google container registry에서 docker 이미지를 가져오는 법
- Docker 이미지를 google container registry에 푸시하는 법
1. hello world!
# hello-world 컨테이너 실행
docker run hello-world
# docker 컨테이너 이미지 확인
docker images
* 프로비저닝된 docker 이미지를 지정
** docker 데몬이 로컬에서 이미지를 찾을 수 없으면 기본적으로 공개 레지스트리에서 이미지를 검색함.
# docker 컨테이너 재실행
docker run hello-world
# 실행중인 컨테이너 확인
docker ps
# 모든 컨테이너 보기
docker ps -a
2. build
#test 디렉토리 생성 및 이동
mkdir test && cd test
# Dockerfile 생성
cat > Dockerfile <<EOF
# 공식 노드 런타임을 상위 이미지로 사용합니다.
FROM node:6
# 컨테이너의 작업 디렉토리를 /app으로 설정합니다.
WORKDIR /app
# 현재 디렉토리 내용을 /app에 있는 컨테이너에 복사합니다.
ADD . /app
# 컨테이너의 포트 80을 외부에 공개합니다.
EXPOSE 80
# 컨테이너가 시작될 때 노드를 사용하여 app.js를 실행합니다.
CMD ["node", "app.js"]
EOF
docker 데몬에 이미지 빌드방법 지시
- 기본 상위 이미지 지정 : node:6
- 컨테이너의 (현재) 작업 디렉토리 설정
- 현재 디렉토리의 내용("."으로 표시함)을 컨테이너에 추가
- 컨테이너 포트 공개, 공개 컨테이너포트의 연결 허용, 노드명령어 실행하여 애플리케이션 시작
# 노드 애플리케이션 생성
cat > app.js <<EOF
const http = require('http');
const hostname = '0.0.0.0';
const port = 80;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log('Server running at http://%s:%s/', hostname, port);
});
process.on('SIGINT', function() {
console.log('Caught interrupt signal and will exit');
process.exit();
});
EOF
http 서버로 port 80 수신, 'hello world' 반환
# 이미지 빌드
docker build -t node-app:0.1 .
-t : name:tag 구문을 사용하여 이미지의 이름과 태그 지정
* docker 이미지를 빌드할 때에는 태그를 사용하는 것이 좋음 / 안그러면 최신 이미지로 지정되어 기존 이미지와 구분하기 어려움
# 빌드한 이미지 확인
docker images
- node : 기본이미지
- node-app : 사용자가 빌드한 이미지
- * node 제거 시 node-app 선제거 필요
3. run
# 빌드한 이미지 컨테이너 실행
docker run -p 4000:80 --name my-app node-app:0.1
- --name : 사용 시 컨테이너 이름 지정 가능
- -p : docker가 컨테이너의 port 80에 호스트 포트 4000을 매핑하도록 지시하는 옵션
- * 포트 매핑이 없으면 localhost에서 컨테이너에 접속할 수 없음
+ 을 눌러 새 터미널에서 진행한다.
# 서버 테스트
curl http://localhost:4000
# 컨테이너 중단 & 삭제
docker stop my-app && docker rm my-app
# 백그라운드에서 컨테이너 시작
docker run -p 4000:80 --name my-app -d node-app:0.1
docker ps
# 실행중인 도커 로그 확인
docker logs [container_id]
# 어플리케이션 내용 수정
vi app.js
'hello world' → ' hello 000'
# 새 이미지 빌드 및 0.2 태그 지정
docker build -t node-app:0.2 .
# 다른 컨테이너 실행
docker run -p 8080:80 --name my-app-2 -d node-app:0.2
docker ps
# 컨테이너 테스트
curl http://localhost:8080
# 첫번째 컨테이너 테스트
curl http://localhost:4000
4. debug
# 컨테이너 로그 보기
docker logs -f [container_id]
- -f : 컨테이너가 실행 중일 때 로그 결과를 확인하려면 -f 옵션 사용
# 대화식 bash 세션 시작
docker exec -it [container_id] bash
-it : pseudo-tt를 할당하고 stdin을 열린 상태로 유지하여 컨테이너와 상호작용할 수 있도록 한다.
dockerfile의 지정된 workdir에서 bash가 실행된 것을 확인할 수 있음
# bash test
ls와 cat으로 파일 리스트와 내용 확인 후 exit
# 컨테이너 메타데이터 검토
docker inspect [container_id]
docker inspect : 컨테이너와 이미지의 세부정보를 가져오는 명령어로 기본 출력은 json형태이다.
# --format을 사용하여 반환된 JSON의 특정 필드 검사
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_id]
5. publish
이미지를 GCR( Google Container Registry)로 푸시
# 프로젝트 id 찾기
gcloud config list project
# 프로젝트에 node-app:0.2 태그
docker tag node-app:0.2 gcr.io/[project-id]/node-app:0.2
# 이미지 GCR로 푸시
docker push gcr.io/[project-id]/node-app:0.2
container registry > node-app 눌러서 이미지 확인
# 모든 컨테이너 중지 및 제거
docker stop $(docker ps -q)
docker rm $(docker ps -aq)
# 노드 하위 이미지 제거
docker rmi node-app:0.2 gcr.io/[project-id]/node-app node-app:0.1
docker rmi node:6
docker rmi $(docker images -aq) # remove remaining images
docker images
# 이미지 푸시 및 실행 & 확인
docker pull gcr.io/[project-id]/node-app:0.2
docker run -p 4000:80 -d gcr.io/[project-id]/node-app:0.2
curl http://localhost:4000
'GCP > Qwiklabs' 카테고리의 다른 글
220830_Terraform Fundamentals (0) | 2022.08.31 |
---|---|
220704_Kubernetes Engine: Qwik Start (0) | 2022.07.04 |
220608_Loading Taxi Data into Google Cloud SQL 2.5 (0) | 2022.06.09 |
220609_Loading data into BigQuery (0) | 2022.06.09 |
220607_Using BigQuery to do Analysis (0) | 2022.06.07 |