예전에 만들어놨던 node.js 기반의 포트폴리오 사이트가 있는데 수정해서 jenkins에 등록해놓고 사용하려고 한다.
프론트 프로젝트는 최대한 aws에 올리려고 한다. 그래서 우선 network부터 다시 세팅해야한다.
docker network create --gateway 172.18.0.1 --subnet 172.18.0.0/16 portfolio
FROM node:slim
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . /app
EXPOSE 3000
CMD [ "npm", "run", "start"]
다음과 같이 작성해주었고 docker는 java와 다르게 jar만 던지는게 아니라 소스 전체를 다 가져가야한다. 그래서 package만 이동 후 install해주고 그 후에 모든 소스를 복사해가는 형식이였다.
node_modules
package-lock.json
그리고 node는 해당 파일은 최초 install 시에 생성되는 파일들인데 이 파일들까지 같이 옮겨버리면 에러가 발생한다. .dockerignore
파일을 root에 만들어서 COPY할 때 제외되도록 설정해주자.
docker build -t ililil9482/portfolio:1.0 .
이미지를 생성해주었고 정상적으로 실행되었음을 확인할 수 있다.
이전에는 해당 파일을 hub에 푸시를 jenkins에서 진행했지만 aws와 window는 서로 충돌이 발생하지 않으므로 바로 local에서 hub로 푸시한다.
docker push ililil9482/portfolio:1.0
docker hub로 푸시하고
정상적으로 올라갔다.
version: '3.7'
services:
portfolio:
image: "ililil9482/portfolio:1.0"
container_name: portfolio
expose:
- 3000
networks:
default:
external:
name: portfolio
aws
서버에 yml 파일을 작성해주자.
aws 키를 하나 추가해주어야한다.
aws라는 이름으로 추가해주었다.
pipeline {
agent any
stages {
stage('Down') {
steps {
sshPublisher(publishers: [
sshPublisherDesc(configName: 'aws',
transfers: [
sshTransfer(cleanRemote: false,
excludes: '',
execCommand: 'cd /project/portfolio && sudo docker-compose down',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '')
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)
])
}
}
stage('Pull') {
steps {
sshPublisher(publishers: [
sshPublisherDesc(configName: 'aws',
transfers: [
sshTransfer(cleanRemote: false,
excludes: '',
execCommand: 'sudo docker pull ililil9482/portfolio:1.0',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '')
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)
])
}
}
stage('Up') {
steps {
sshPublisher(publishers: [
sshPublisherDesc(configName: 'aws',
transfers: [
sshTransfer(cleanRemote: false,
excludes: '',
execCommand: 'cd /project/portfolio && sudo docker-compose up -d',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '')
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)
])
}
}
}
}
파이프 라인을 다음과 같이 작성 후
컨테이너가 실행된 것을 확인할 수 있다.
FROM nginx:latest
COPY nginx.conf /etc/nginx/nginx.conf
CMD ["nginx", "-g", "daemon off;"]
EXPOSE 80
Dockerfile을 작성해주고
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80;
location / {
proxy_pass http://portfolio:3000;
}
}
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#include /etc/nginx/conf.d/*.conf;
}
nginx.conf 파일도 작성해준다.
version: '3.7'
services:
nginx:
container_name: nginx
image: my-nginx:1.0
ports:
- 80:80
networks:
default:
external:
name: portfolio
마지막 docker-compose.yml 파일까지 작성해서 실행시키면
접속이 잘 되는 것을 확인할 수 있었다.