Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

ssuperjun 님의 블로그

[과제6-6] 고도화: MyMon Dev환경 세팅(웹 소스코드 도커라이징) 본문

인턴

[과제6-6] 고도화: MyMon Dev환경 세팅(웹 소스코드 도커라이징)

ssuperjun 2026. 2. 5. 15:07

[6-1] user script로 명령어 단순화(docker 설치, env파일 생성, docker 컨테이너 실행)

[user-script]

#!/bin/bash
# ========== Ubuntu EC2 초기 설정 ==========

# 1. Docker 설치
apt-get update -y
# 중략
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 2. Docker를 sudo 없이 사용하도록 설정
usermod -aG docker ubuntu

# 3. start-mymon-web.sh 스크립트 생성 (컨테이너 실행용)
cat << 'EOF' > /home/ubuntu/start-mymon-web.sh
#!/bin/bash

echo "▶ Docker 이미지 로드 중..."
docker load -i ./mymon-web-image.tar
# 중략

# 4. .env 파일 예시로 생성(보안상 민감한 정보는 user script에 넣지 않음)
cat << 'EOF' > /home/ubuntu/.env
# 중략

# 5. 안내 메시지 작성
cat << 'EOF' > /home/ubuntu/README_ENV.txt
============================================================
✅ Docker 설치 및 환경 준비 완료!

📄 .env 파일은 /home/ubuntu/.env 에 저장되어 있습니다.
🔧 환경 설정이 변경되면 이 파일을 vi로 수정하세요.

📦 Docker 이미지 파일(mymon-web-image.tar)을 아래 경로에 업로드하세요:
  /home/ubuntu/

🚀 컨테이너를 실행하려면 다음 명령어를 입력하세요:

  cd /home/ubuntu
  ./start-mymon-web.sh

============================================================
 

인스턴스 실행 시

env파일 내용 일부 수정 및 start-mymon-web.sh 명령만으로

mymon-web 환경이 구축되도록 구현

[6-2] .env 파일에 실수로 공백이 포함된 경우, strip()함수 사용해 오류 방지

-> 실제로 env파일에 공백을 넣어 오류가 발생했을 때, 오류를 찾느라 몇 시간 날린 일이 있었음

DJANGO_DEBUG= True
DEBUG = os.getenv("DJANGO_DEBUG", "True").strip() == "True"

수정한 파일

main/config/settings/base.py
mymon-web-docker/main/config/settings/debug.py
mymon-web-docker/main/config/settings/deploy.py
mymon-web-docker/main/config/settings/settings.py
mymon-web-docker/main/view/api/wget_view.py
mymon-web-docker/main/view/user/login_view.py
mymon-web-docker/main/asgi.py
mymon-web-docker/main/wsgi.py
mymon-web-docker/manage.py

 

[6-3] 빌드한 docker image를 윈도우(amd64 아키텍처)에도, 맥os(arm64 아키텍처)에도 배포해야 하는 상황에서 작업 간편화

[6-3-1] docker image 저장소 활용 방식은 간단함

docker buildx build \

  --platform linux/amd64,linux/arm64 \

  -t myrepo/mymon-web-image:latest \

  --push .

배포 환경에서:

docker pull myrepo/mymon-web-image:latest

docker run -d --env-file .env -p 15361:15361 --name mymon-web-prod mymon-web-image

[6-3-2] 하지만 여기선 docker image 저장소 없이 빌드 및 배포를 간편화 함

amd64 이미지 빌드 및 배포 방법

docker buildx build --platform linux/amd64 -t mymon-web-image:amd --load .

docker save mymon-web-image:amd -o mymon-web-image-amd.tar

scp -i checkmate.pem mymon-web-image-amd.tar ubuntu@IP:/home/ubuntu/

 

새 인스턴스에서

docker load -i mymon-web-image-amd.tar

docker run -d --env-file .env -p 15361:15361 --name mymon-web-prod mymon-web-image:amd

 

arm64 이미지 빌드 및 배포 방법

docker buildx build --platform linux/arm64 -t mymon-web-image:arm --load .

docker save mymon-web-image:arm -o mymon-web-image-arm.tar

scp -i checkmate.pem mymon-web-image-arm.tar ubuntu@IP:/home/ubuntu/

 

새 인스턴스에서

docker load -i mymon-web-image-arm.tar

docker run -d --env-file .env -p 15361:15361 --name mymon-web-prod mymon-web-image:arm

지금까지의 명령어들 간편화 작업 수행

위 여러 줄의 명령어를 상황에 맞게 간편하게 실행할 수 있도록

build_send_image.sh를 만들어

./build_send_image.sh IP주소 amd64

./build_send_image.sh IP주소 arm64

만으로 amd64 혹은 amd64 이미지 빌드 및 배포가 완료되도록 함

실행 화면

이미지 빌드 및 배포

받은 이미지 확인, 도커 실행


추가 과제

1.docker에서 docker가 띄워진 인스턴스에 있는 스크립트 호출 테스트

2. 인스턴스에서 docker 내부에 있는 스크립트 호출

 

해석하면

CMI(새 인스턴스)에서

  1. 컨테이너 안에서, 컨테이너 외부에 있는 스크립트를 호출해라
  2. 컨테이너 외부에서, 컨테이너 내부에 있는 스크립트를 호출해라

왜?

docker web 내부에 크론 스크립트 하나 등록 시켜서

ca/cb 서버쪽 /home1/irteam/docker-test.txt 파일에

계속 한줄씩 아무거나 로깅 하도록 구현 성공해보면 좋을 것 같아서

=> 크론 스크립트는 컨테이너 내부에 있고, 컨테이너 내부에서 크론 스크립트를 돌리면 컨테이너 외부의 파일에 로그가 찍히도록.

혹은 크론 스크립트, 로그파일 모두 컨테이너 외부에 있고, 컨테이너 내부에서 크론 스크립트(외부)를 실행하면 로그파일(외부)에 로그가 찍힌다.

 

컨테이너 외부와 바로 연결 가능한 인스턴스가 컨테이너 내부와는 연결이 불가능하다.

이 인스턴스와 컨테이너 내부를 연결할 때, 컨테이너 외부의 주소를 이용해 인스턴스 <-> 컨테이너 내부를 연결하도록 함으로써

다양한 인스턴스에서 컨테이너 내부로 크론잡 등 실행 명령을 내릴 수 있다.

 

해결 방법

1번은 docker volume으로 해결 가능. 2번은 docker exec 하면 손쉽게 호출됨.

 

실행 과정

mymon-web-docker 디렉토리 내에 docker-test.txt, log-writer.sh 생성

touch docker-test.txt && chmod 666 docker-test.txt

vi log-writer.sh

#!/bin/bash

# 로그를 10초마다 외부 파일에 작성
while true; do
  echo "$(date) - log from container" >> /home/mymon-web-docker/docker-test.txt
  sleep 10
done

 

Dockerfile에 아래줄 추가

RUN chmod +x /home/mymon-web-docker/log-writer.sh

 

도커 빌드 및 실행

docker build -t mymon-web-image:v2 .

 

docker run -it --env-file .env -p 15361:15361 --name mymon-web-prod2 -v /home1/irteam/mymon-web-docker-v2/docker-test.txt:/home/mymon-web-docker/docker-test.txt mymon-web-image:v2

컨테이너 외부에서 컨테이너 내부에 있는 크론 스크립트 실행

docker exec -it mymon-web-prod2 bash /home/mymon-web-docker/log-writer.sh

 

=> 컨테이너 내부의 크론 스크립트는 컨테이너 외부 docker-test.txt 내용을 작성함