Docker 소개

JOY·2022년 7월 10일
0

Docker 개념

  • 애플리케이션을 개발, 출시, 실행하는데 사용하는 개방형 플랫폼
  • 인프라를 관리형 애플리케이션처럼 처리 가능
  • 도커 컨테이너는 쿠버네티스에서 직접 사용 가능하므로 쿠버네티스 엔진에서 쉽게 사용할 수 있음
  • 장점
    - 코드를 더욱 빠르게 출시, 테스트, 배포
    - 코드 작성과 실행 주기 단축

GCP Cloud Shell 활성화

  • gcloud : Google Cloud Platfrom 명령줄 도구
  • 사용 중인 계정 이름 목록 표시
gcloud auth list
  • 프로젝트 ID 목록 표시
gcloud config list project
  • hello world 컨테이너 실행
docker run hello-world

컨테이너 이름 지정 가능

docker run --name [container-name] hello-world
  • 컨테이너 이미지 확인
docker images
  • 실행 중인 컨테이너 확인
docker ps
  • 실행이 완료된 컨테이너 포함하여 모든 컨테이너 확인
docker ps -a

Docker 이미지 빌드

  • 폴더 생성
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
  • 노드 애플리케이션 생성 : HTTP 서버로 포트 80 수신하고 'Hello World' 반환
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
  • 이미지 빌드

Dockerfile이 있는 디렉토리에서 실행해야 함

docker build -t node-app:0.1 .

-t : name:tag 구문을 사용하여 이미지의 이름(node-app)과 태그(0.1) 지정
- 도커 이미지를 빌드할 때 태그 지정하는 것이 좋음. 그렇지 않으면 기본값인 latest로 지정되서 최신 이미지와 기존 이미지 구분이 어려워짐

실행

  • 빌드한 이미지를 기반으로 하는 컨테이너 실행
docker run -p 4000:80 --name my-app node-app:0.1

--name : 컨테이너 이름 지정
-p : 도커가 컨테이너의 포트 80에 호스트의 포트 4000을 매핑하도록 지시하는 플래그
- 포트 매핑이 없으면 localhost에서 컨테이너 접속 불가
-d : 컨테이너를 터미널 세션에서 종속시키지 않고 백그라운드에서 컨테이너 실행

docker run -p 4000:80 --name my-app -d node-app:0.1
docker ps
  • 서버 테스트 (다른 터미널에서 열기)
curl http://localhost:4000
  • (초기 터미널 닫은 후) 컨테이너 중단 및 삭제
docker stop my-app && docker rm my-app
  • 로그 확인

컨테이너 ID 전체 작성할 필요 X (ex. 17bcaca6f -> 17b)

docker logs [container_id]

컨테이너가 실행 중일 때 로그 결과를 확인하려면 -f 옵션 사용

docker logs -f [container_id]
  • app.js 편집 후 새 이미지 빌드, 0.2로 태그 지정
docker build -t node-app:0.2 .
  • 새 이미지 버전으로 다른 컨테이너 실행 : 호스트 포트 4000은 이미 사용 중이므로 8080으로 매핑
docker run -p 8080:80 --name my-app-2 -d node-app:0.2
docker ps

디버깅

  • 실행 중인 컨테이너에서 대화식 Bash 세션 시작
docker exec -it [container_id] bash

-it : pseudo-tty(teletypewriter) 할당, stdin(standard input)을 열린 상태로 유지하여 컨테이너와 상호작용할 수 있도록 하는 플래그

  • Bash 세션 종료
exit
  • 도커에서 컨테이너의 메타데이터 검토
docker inspect [container_id]

--format을 사용하여 반환된 JSON의 특정 필드 검사 가능

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_id]

게시

  • 이미지를 Google Container Resgistry(GCR)로 푸시
    이미지에 레지스트리 이름으로 태그 지정해야 함
docker tag node-app:0.2 [hostname]/[project-id]/[image]:[tag]
  • GCR로 푸시
docker push [hostname]/[project-id]/[image]:[tag]
  • 모든 컨테이너와 이미지 제거 후 새로운 환경 구성
# 컨테이너 중지 및 제거
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
  • 이미지 pull 및 실행
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

0개의 댓글

관련 채용 정보