Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

JINIers

220630_Introduction to Docker 본문

GCP/Qwiklabs

220630_Introduction to Docker

JINIers 2022. 7. 1. 17:22

220630_Introduction to Docker
도커 소개


[개요]

Docker

  • 애플리케이션 개발, 배송 및 실행하기 위한 개방형 플랫폼
  • 도커를 사용하면 인프라에서 애플리케이션을 분리하고 인프라를 관리되는 애플리케이션처럼 취급할 수 있음
  • 커널 컨테이너화 기능을 애플리케이션 관리 및 배포에 도움이 되는 워크플로 및 도구와 결합하여 수행함
  • Docker container는 Kubernetes에서 직접 사용할 수 있으므로 Kubernetes Engine에서 쉽게 실행 할 수 있음

[중점사항]

  1. Docker 컨테이너를 빌드, 실행 및 디버그 하는 방법
  2. Docker hub 및 google container registry에서 docker 이미지를 가져오는 법
  3. 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 데몬에 이미지 빌드방법 지시

  1. 기본 상위 이미지 지정 : node:6
  2. 컨테이너의 (현재) 작업 디렉토리 설정
  3. 현재 디렉토리의 내용("."으로 표시함)을 컨테이너에 추가
  4. 컨테이너 포트 공개, 공개 컨테이너포트의 연결 허용, 노드명령어 실행하여 애플리케이션 시작



# 노드 애플리케이션 생성

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' 반환

파일 생성 후 list 확인

# 이미지 빌드

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

tag 및 images 확인


# 이미지 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

Comments