직접 만든 이미지를 실행해볼 차례가 왔다.
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가 나온다. 도커 컨테이너가 아직 실행되고 있으니 당연한 결과이다.
'kubernetes' 카테고리의 다른 글
구글 스터디잼 쿠버네티스 입문반 스터디 - 04 (0) | 2023.04.16 |
---|---|
구글 스터디잼 쿠버네티스 입문반 스터디 - 02 (1) | 2023.04.16 |
구글 스터디잼 쿠버네티스 입문반 스터디 - 01 (0) | 2023.04.16 |