본문 바로가기

kubernetes

구글 스터디잼 쿠버네티스 입문반 스터디 - 03

728x90
반응형

직접 만든 이미지를 실행해볼 차례가 왔다. 

 

1) docker run

docker run -p 4000:80 --name my-app node-app:0.1

만든 도커파일로 생성한 이미지 node-app:0.1을 실행하는 명령어이다. 이름은 my-app으로 지정하여 도커 컨테이너를 실행한다. 

-p 옵션은 호스트의 포트 4000을 도커 컨테이너의 포트 80과 매핑하도록 지시하는 명렁어이다. 

로컬 환경에서 도커 컨테이너를 실행하고 있으므로 http://localhost:4000을 통해서 서버에 연결할 수 있다. 포트 매핑이 없으면 로컬호스트에서 컨테이너에 연결할 수 없다. 

 

도커 컨테이너는 가상 컨테이너 내부 네트워크를 사용하여 통신하기 때문에 기본적으로 호스트 시스템에서 컨테이너에 직접 엑세스 할 수 없다. 그렇기 때문에 -p 옵션을 사용하여 호스트 시스템의 포트와 컨테이너의 포트를 매핑해서 로컬호스트에서 컨테이너에 연결할 수 있게 된다. 

 

그렇기 때문에 현재는 localhost:4000을 통해 도커컨테이너와 연결될 수 있다. 

Server running at http://0.0.0.0:80/

명령어를 실행하면 위와 같은 output을 얻는다. 

 

curl http://localhost:4000

로컬에서 접근이 가능한 상태이므로 curl 명령어를 사용하여 접속해본다. 

그러면 app.js파일에 명시한대로 

Hello World

를 출력하는 것을 확인해 볼 수 있다. 

 

 

2) docker stop

docker stop my-app && docker rm my-app

도커 컨테이너를 스탑하고 컨테이너를 지우는 명령어이다. 

 

docker stop my-app && docker rm my-app
my-app
my-app

실행하면 멈추고 지워진 컨테이너명이 뜬다.

 

 

3) 백그라운드에서 실행

docker run -p 4000:80 --name my-app -d node-app:0.1
docker ps

같은 이미지를 가지고 이번엔 백그라운드에서 실행을 해본다. -d 옵션을 통해 도커 컨테이너를 백그라운드로 실행해 볼 수 있다. 

 

docker logs [container_id]

컨테이너 이미지로 로그를 확인할 수 있다. 

docker logs 75d913e1921b
Server running at http://0.0.0.0:80/

컨테이너 아이디를 넣어서 확인해보니 아래줄과 같은 로그가 남아있는것을 확인 할 수 있다. 

 

3) docker image version up

도커 이미지 버전을 업그레이드 해주기 위해서 app.js의 내용을 조금 수정한다. 

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('나는 짱이다 푸하하.\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();
});

위처럼 변경해주었다. 참고로 나는 node.js 문법 모른다. 그래서 그냥 헬로월드 부분만 수정했다.

근데 뭐 대충 보면 그냥 80포트 열어서 웹서버 실행하고 콘솔에 찍는게 전부인 코드라서 그정도만 알아도 될거 같다. 

 

여튼 애플리케이션의 변경이 있었으니 버전을 올려서 도커 이미지를 새로 빌드해준다. 

docker build -t node-app:0.2 .
test docker build -t node-app:0.2 .
[+] Building 1.9s (8/8) FINISHED
 => [internal] load build definition from Dockerfile                                                                                   0.0s
 => => transferring dockerfile: 37B                                                                                                    0.0s
 => [internal] load .dockerignore                                                                                                      0.0s
 => => transferring context: 2B                                                                                                        0.0s
 => [internal] load metadata for docker.io/library/node:lts                                                                            1.8s
 => [1/3] FROM docker.io/library/node:lts@sha256:671ee8d49ce2a691fc3082203c5deb9522e0c80042aa0ff40c07f4a25e63668a                      0.0s
 => [internal] load build context                                                                                                      0.0s
 => => transferring context: 544B                                                                                                      0.0s
 => CACHED [2/3] WORKDIR /app                                                                                                          0.0s
 => [3/3] ADD . /app                                                                                                                   0.0s
 => exporting to image                                                                                                                 0.0s
 => => exporting layers                                                                                                                0.0s
 => => writing image sha256:99e25c5089ede080a9ef99f2141c7e09ed845e1a95ad7a921dde2929ae667139                                           0.0s
 => => naming to docker.io/library/node-app:0.2                                                                                        0.0s

아까 0.1 버전과 동일하게 이미지를 빌드 했는데 차이점이 있다. 

base image가 되는 node:lts 이미지가 이미 로컬에 있기 때문에 cache된 레이어를 사용한다. 그 뒤 스텝부터는 app.js의 내용이 달라졌기 때문에 수정이 일어나게 된다. 

docker run -p 8080:80 --name my-app-2 -d node-app:0.2
docker ps

이미 4000포트를 사용하고 있기 때문에 8080포트로 도커 컨테이너를 실행한다. 

CONTAINER ID   IMAGE          COMMAND                  CREATED                  STATUS                  PORTS                  NAMES
62de398ddb39   node-app:0.2   "docker-entrypoint.s…"   Less than a second ago   Up Less than a second   0.0.0.0:8080->80/tcp   my-app-2
75d913e1921b   node-app:0.1   "docker-entrypoint.s…"   12 minutes ago           Up 12 minutes           0.0.0.0:4000->80/tcp   my-app

두개의 컨테이너가 실행되고 있다. 

 

다시 curl을 날려준다. 이번에는 새로 올린 컨테이너에 연결하는 8080포트로 접속한다. 

curl http://localhost:8080
나는 짱이다 푸하하.

아까 변경한 문구대로 잘 나온다. 

 

다시 4000번 포트로 curl을 날리면 

curl http://localhost:4000
Hello World

hello world가 나온다. 도커 컨테이너가 아직 실행되고 있으니 당연한 결과이다. 

728x90
반응형