본문 바로가기

공부기록/클라우드

Docker 공식 튜토리얼 따라해보기(1) image build, app update

Docker 공식 홈페이지에 있는 튜토리얼을 따라해봤다.

image를 빌드하는법, container를 실행하는 법, data를 유지하고 코드에 적용하기 위해 volume을 사용하기, Docker Compose 사용법 등을 알 수 있다고 한다.

https://www.docker.com/101-tutorial

 

#LearnDocker

Play with Docker Play with Docker is an interactive playground that allows you to run Docker commands on a linux terminal, no downloads required. Log into https://labs.play-with-docker.com/ to access your PWD terminal Type the following command in your PWD

www.docker.com

터미널에서 아래의 명령어를 실행하면

docker run -d -p 80:80 docker/getting-started
  • -d : container 를 detached mode 로 실행한다. 
  • -p 80:80 : 호스트의 80번 포트를 컨테이너의 80번 포트로 mapping 한다.
  • docker/getting-started : 사용할 image

Docker Desktop에 아래와 같이 컨테이너가 하나 생성되고, 자동으로 실행된다.

이 상태에서 브라우저에 http://localhost 로 접속하면 튜토리얼을 볼 수 있다.

첫 화면에는, container 와 image에 대한 간단한 설명이 나온다.

Container 는  호스트의 프로세스들과 완전히 분리된 프로세스라고 볼 수 있으며, 컨테이너는 리눅스에 아주 옛날부터 있던 kernel namespaces 와 cgroup 기능을 활용한다.   

Image는 container 실행에 필요한 파일시스템을 제공한다. dependency, 설정, 스크립트, 바이너리, 그리고 환경변수나 기본 명령어, meta data 를 포함하기도 한다. 


튜토리얼 본격 시작!

이 튜토리얼에선, Node.js 를 활용한 Todo List 를 관리를 해본다

먼저, 튜토리얼에서 제공해주는 소스코드를 다운받은 후 VS Code 로 열고 시작한다.

App의 Container Image 빌드하기

image 를 빌드하기 위해선, Dockerfile 이 필요하다. Dockerfile은 명령어 스크립트가 모인 간단한 text-based 파일이다. 

1. pakage.json 파일과 같은 위치에 아래 코드를 포함한 Dockerfile 만들기

FROM node:12-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]

2. 아래 명령어로 container image 빌드하기

docker build -t getting-started .

이 명령어는 container image를 빌드하기 위해 Dockerfile을 사용한다. 이 명령어를 실행하고 나면 수많은 "레이어"들이 생성되는데, 이건 우리가 빌더에게 node:12-alpine image 부터 시작하라고 알려줬기 때문이다. 하지만, node:12-alpine image는 우리 로컬 컴퓨터에 없으므로, 먼저 이 image를 다운받아야한다. 

-t 플래그는, image에 태그를 붙여준다. 사람이 알아보기 쉽게 하기 위함이다. 여기서 우리가 붙인 태그는 getting-started 이다. 

명령어에서 마지막 . 은 Dockerfile 이 현재 디렉토리에 위치해있음을 알려주는 것이다.

 

* image 목록 확인하기

docker images

App Container 시작하기

image를 만들었으니, 이 image를 이용해 App 을 실행해보자!

1. 아래 명령어 입력

docker run -dp 3000:3000 getting-started

제일 처음에 입력했던 명령어랑 아주 비슷하다

-p 3000:3000 포트맵핑을 해주지 않으면 App을 실행할 수 없다고 한다.

 

2. 몇 초 후 http://localhost:3000 에 접속하면 App 실행화면을 확인할 수 있다.

3. ToDo List에 몇 가지 아이템을 추가해보자


App 수정하기

ToDo List에 item 이 하나도 없을 때 보이는 메시지를 수정하려고 한다.

 

1. src/static/js/app.js 파일의 56행을 아래와 같이 수정한다.

-        <p className="text-center">No items yet! Add one above!</p>
+        <p className="text-center">You have no todo items yet! Add one above!</p>

 

2. 업데이트 된 버전의 image를 새로 빌드한다. 

docker build -t getting-started .

Dashboard를 보면 container 가 하나 더 추가 돼 이제 3개의 container가 보인다.

 

3. 새로운 컨테이너를 실행해보자.

docker run -dp 3000:3000 getting-started

port is already allocated 에러 발생!

이는 3000 번 포트를 old container가 이미 사용하고 있기 때문에 발생하는 에러이다.

old container를 제거해야한다.

CLI 로 container 삭제하기

1. container ID 확인

docker ps

2. container 중지

docker stop <the-container-id>

3. container 삭제

docker rm <the-container-id>

* 아래 명령어로 container 중지와 삭제를 한번에 할 수 있다.

docker rm -f <the-container-id> 

수정된 App 실행하기

1. 세 번째 등장하고 있는 아래 명령어를 다시 실행한다.

docker run -dp 3000:3000 getting-started

dashboard에서 에러가 났던 container가 다시 실행될 줄 알았더니, 그 container는 그대로 있고 잘 작동하는 새로운 container가 생겼다.

 

2. http://localhost:3000 으로 가서 수정된 내용이 잘 반영되었나 확인해본다. 

이번 section에서 알 수 있는 것.

- image를 다시 빌드하고 실행하면, 원래 있던 ToDo List 아이템들이 사라진다
- 아주 작은 것을 바꾸는데 필요한 단계가 너무 많다. 

다음 단계에선, 데이터를 유지하는 방법과, 간단하게 App을 변경할 수 있는 방법을 알아볼 것이다. 

너무 길어져서 포스팅을 쪼개야겠다.