Docker #4 자신의 Frontend (HTML, JS, CSS) 개발 코드를 컨테이너로 만들고 이것을 실행시켜 보자 #
#2025-08-04
#조건
- nginx:alpine 이미지를 사용
- 노출 Port는80
- nginx를실행하는방식은 -nginx -g daemon off;
- nginx의 routing 설정은 default.conf에설정한다.
#path
$ pwd
/Users/yshmbid/rde/config/workspace/exec-template
$ ls
Dockerfile default.conf deploy deploy.yaml docker-build.sh docker-push.sh service.yaml src
#
1. docker-build.sh와 docker-push.sh 복사 #
$ pwd
/Users/yshmbid/rde/config/workspace/container/05.webserver
$ ls
Dockerfile default.conf deploy docker-build.sh docker-push.sh src
# docker-build.sh
#!/bin/bash
NAME=sk019
IMAGE_NAME="healthcheck-server" #IMAGE_NAME="webserver"
VERSION="1.0.0"
CPU_PLATFORM=arm64 #amd64
# Docker 이미지 빌드
docker build \
--tag ${NAME}-${IMAGE_NAME}:${VERSION} \
--file Dockerfile \
--platform linux/${CPU_PLATFORM} \
${IS_CACHE} .
docker-build.sh에서 amd였던걸 arm으로 바꿔줫고
# docker-push.sh
#!/bin/bash
NAME=sk019
IMAGE_NAME="healthcheck-server" #IMAGE_NAME="webserver"
VERSION="1.0.0"
DOCKER_REGISTRY="amdp-registry.skala-ai.com/skala25a"
DOCKER_REGISTRY_USER="robot\$skala25a"
DOCKER_REGISTRY_PASSWORD="1qB9cyusbNComZPHAdjNIFWinf52xaBJ"
DOCKER_CACHE="--no-cache"
# 1. Docker 레지스트리에 로그인 (옵션: 이 스크립트를 실행하기 전에 미리 로그인해두어도 됩니다)
echo ${DOCKER_REGISTRY_PASSWORD} | docker login ${DOCKER_REGISTRY} \
-u ${DOCKER_REGISTRY_USER} --password-stdin \
|| { echo "Docker 로그인 실패"; exit 1; }
# 2. harbor 로 push 하기 위해 tag 추가
#docker tag ${NAME}-${IMAGE_NAME}.amd64:${VERSION} ${DOCKER_REGISTRY}/${NAME}-${IMAGE_NAME}.amd64:${VERSION}
docker tag ${NAME}-${IMAGE_NAME}.arm64:${VERSION} ${DOCKER_REGISTRY}/${NAME}-${IMAGE_NAME}.arm64:${VERSION}
# Docker 이미지 푸시
#docker push ${DOCKER_REGISTRY}/${NAME}-${IMAGE_NAME}.amd64:${VERSION}
docker push ${DOCKER_REGISTRY}/${NAME}-${IMAGE_NAME}.arm64:${VERSION}
docker-push.sh에서 마찬가지 amd를 arm으로 바꿔줌.
#
2. Dockerfile과 default.conf 작성 #
# Dockerfile
# nginx 기반 이미지 사용
FROM nginx:alpine
# 커스텀 nginx 설정 파일 복사
COPY default.conf /etc/nginx/conf.d/
# index.html을 /usr/share/nginx/html/ 경로에 복사 << 추가
COPY src/ /usr/share/nginx/html/
# nginx 포트 노출
EXPOSE 80
# nginx 실행 (기본 CMD가 이미 설정되어 있음)
CMD ["nginx", "-g", "daemon off;"]
원래 코드에 COPY src/ /usr/share/nginx/html/
이 없었는데 필요한거아닌가 싶어서 넣어줬다.
# default.conf
server {
listen 80;
# 정적 파일 서빙
location /sk019 {
alias /usr/share/nginx/html/;
try_files $uri $uri/ /index.html;
}
}
#
3. 파일 구조 #
/workspace
└── exec-template
├── Dockerfile
├── default.conf
├── docker-build.sh
├── docker-push.sh
├── deploy/
└── src/
├── index.html
└── media/
index.html이랑 이미지 디렉토리 media는 src 디렉토리에 넣었다.
#
4. 이미지 push build + docker run #
$ sudo ./docker-push.sh
$ sudo ./docker-build.sh
$ sudo docker run -d --name posts-get --network bridge -p 8888:80 sk019-posts-get.arm64:1.0
마찬가지 run 주소도 arm으로 넣어줌.
잘 나온다 ㅎㅎㅎ
#
5. 헷갈리는점 #
- docker-build.sh에서
- IMAGE_NAME을 healthcheck-server로 바꿔주라고 ppt에 나와있었는데 안바꾸고 webserver를 썼는데 마지막에
sudo docker run -d --name posts-get --network bridge -p 8888:80 sk019-posts-get.arm64:1.0
했을때 제대로 나왔다. - 근데 chatgpt 치니까 IMAGE_NAME=“healthcheck-server” 해놓고
sudo docker run -d --name posts-get
해버리면 안된다고나옴 빌드한 이미지와 실행한 이미지 이름이 다르다고 근데 원래는 달랐는데 잘되던데… 확인 필요할듯.
#
- default.conf는 사실 아래 코드로 바꿔넣어줬었다. index.html;을 추가한것임.
#server {
# listen 80;
# location /sk019/ {
# alias /usr/share/nginx/html/;
# index index.html;
# try_files $uri $uri/ /index.html;
# }
#}
이부분도 확인 필요.
#
*1에 추가: env.properties에서 SERVICE_NAME=“posts-get"가 나오긴한데 docker-build.sh와 docker-push.sh 가 앞에 source ./env.properties가 붙는 식으로 진행되면 IMAGE_NAME=“posts-get"이 적용되고 이미지 이름이 sk019-posts-get:1.0.0으로 만들어지고, run/push 시 모두 일관성이 유지되는게 맞는데?
env.properties를 불러오지도 않고, IMAGE_NAME에 healthcheck-server이 하드코딩 대있어서 연관성을찾기 어려운상태.