self-signed certificate를 이용한 node.js https 웹서버 이미지를 Dockerfile을 이용해 만들어 봄.

 

우선 웹서버 역할을 담당할 index.js 파일을 아래처럼 만들어서 저장.

const fs = require('fs');
 
const opt = {
    key: fs.readFileSync('../certs/server.key'),
    cert: fs.readFileSync('../certs/server.crt')
};
 
require('https').createServer(opt, (req, res) => {
    res.end('hello world\n');
}).listen(443);

 

Dockerfile은 아래처럼 만들어서 저장

# node.js 최신 이미지
FROM node:latest
 
# 인증서 저장용 디렉토리 생성
RUN mkdir -p /webserver/certs
# self-signed certificate 생성
WORKDIR /webserver/certs
RUN openssl genrsa -des3 -passout pass:asdf1234 -out server.pass.key 2048 &&\
    openssl rsa -passin pass:asdf1234 -in server.pass.key -out server.key &&\
    rm -rf server.pass.key &&\
    openssl req -new -key server.key -out server.csr -subj '/C=KO/ST=None/L=None/O=None/CN=bloodguy' &&\
    openssl x509 -req -sha256 -days 36500 -in server.csr -signkey server.key -out server.crt
 
# 웹서버용 디렉토리 생성
RUN mkdir /webserver/www
# index.js 복사
COPY index.js /webserver/www
 
# 443번 포트 개방
EXPOSE 443
 
# 웹서버 실행
CMD /usr/local/bin/node /webserver/www/index.js

 

아래처럼 빌드해서 실행 후 접속 확인까지 해봄

// 빌드
[root@localhost]# docker build -t bloodguy/nodejs-webserver:latest .
 
 
// 확인
[root@localhost]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
bloodguy/nodejs-webserver   latest              3a86039539b6        12 seconds ago       942MB
 
 
// 실행
[root@localhost]# docker run -d -p 443:443 bloodguy/nodejs-webserver:latest
 
 
// 확인
[root@localhost]# docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                  NAMES
527146449a96        bloodguy/nodejs-webserver:latest   "docker-entrypoint.s…"   2 minutes ago      Up 2 minutes       0.0.0.0:443->443/tcp   sharp_shirley
 
 
// 포트 개방 확인
[root@localhost]# netstat -nltp | grep 443
tcp6       0      0 :::443                  :::*                    LISTEN      20592/docker-proxy
 
 
// 접속 확인
[root@localhost]# curl --insecure https://localhost
hello world

 

 

 

.

Posted by bloodguy
,