AWS Cloud School 13기 62일차

Forever 김·2026년 3월 30일

AWS Cloud School

목록 보기
59/97

TIL

배운 내용

컨테이너의 이름을 주소처럼 사용 가능하다. tomcat-mysql을 연동할때 항상 mysql의 컨테이너 IP를 조회해서 찾아가는 건 너무 번거롭다.

사용 예시

  1. link를 당할 컨테이너를 생성한다.
root@contem:~# docker run -d --name dbdb -e MYSQL_ROOT_PASSWORD=1234 mysql:8
  1. 위에서 생성한 컨테이너의 이름을 --link로 명시하여 컨테이너 생성
root@contem:~# docker run -it --name tom --link dbdb tomcat:latest bash

tomcat 웹 루트 디렉토리 : /usr/local/tomcat/webapps/ROOT


사설저장소 컨테이너 생성

나만의 Docker hub를 생성한다고 생각하면 된다.

실습

wp:1를 내가 만든 사설저장소에 push
1. 레지스트리 주소를 포함한 이미지를 빌드하거나 변경.

root@contem:~# docker tag wp:1 211.183.3.100:5000/wp:1

이때 우리는 HTTP 통신을 하기 때문에 daemon.json을 생성해서 경고를 수정해준다.

root@contem:/docker/wp# vi /etc/docker/daemon.json
{
        "insecure-registries": ["211.183.3.100:5000"]
}

다양한 웹 배포

  • 웹 애플리케이션 : 웹에서 동작하는 애플리케이션
  • 프레임워크 : "앱을 만들려면 이렇게 만들면 돼" 하는 일종의 가이드 혹은 Tool

자바 - spring,springboot
=> 빌드된 앱 + openjdk(런타임) + tomcat이 필요

파이썬 - flask,Django,fastapi
=> python(런타임) 및 의존성파일 설치

자바스크립트 - nodejs(엄밀히 따지면 프레임워크는 아니다)
=> nodejs 및 npm, 의존성파일 설치

SpringBoot 배포

  1. springboot 소스코드가 있는 git clone해서 가져온다,
  2. README.md를 통해 버전과 포트 확인
  3. 자바 설치
  4. 빌드 툴 (maven) 설치
  5. 빌드
root@contem:~/sb_code# mvn clean package
  1. 해당 앱을 실행
root@contem:~/sb_code# java -jar target/springbootApp.jar

이제 컨테이너 화 해보겠다
1. 호스트에서 빌드한 다음 app파일을 컨테이너이미지에 넣어서 실행

FROM adoptopenjdk/openjdk8
WORKDIR /app
COPY target/springbootApp.jar app.jar
CMD ["java","-jar","app.jar"]
  1. 소스코드를 컨테이너 이미지에서 빌드 하고 배포.
root@contem:/docker# git clone https://github.com/oolralra/sb_code
# 배포할 소스코드를 준비.

root@contem:/docker# cd sb_code/

root@contem:/docker/sb_code# vi Dockerfile
# 소스코드와 동일한 경로에 도커파일 작성.

maven:3.9-amazoncorretto-8
# 내가 베이스 이미지로 쓸 것.
# corretto = 아마존이 만든 openjdk
FROM maven:3.9-amazoncorretto-8
WORKDIR /app
COPY . .
RUN mvn clean package
CMD ["java","-jar","target/springbootApp.jar"]

.dockerignore

컨테이너 이미지 빌드시 넣지 않고 싶은, 불필요한 파일을 제외시킬 수 있다.

python flask 앱 배포

  1. 베이스이미지 선택
  2. requirements.txt 복사
  3. pip install -r requirements.txt
  4. 소스코드 복사
  5. 실행. ( gunicorn -b 0.0.0.0:8080 main:app )
root@contem:/docker/smart# vi Dockerfile
# 도커파일 작성
FROM python:3.9.21-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
# 패키지 목록에 있는 라이브러리 설치
COPY . .
# 소스코드 복사
CMD ["gunicorn","-b","0.0.0.0:8080","main:app"]
# 0.0.0.0 = 0.0.0.0/0
root@contem:/docker/smart# docker build -t mypy:1 .

멀티스테이지 빌드

컨테이너 이미지를 만들면서 빌드 등에는 필요하지만, 최종 컨테이너 이미지에는 필요 없는 환경을 제거할 수 있도록 단계를 나누어 기반 이미지를 만드는 방법
출처: https://kimjingo.tistory.com/63#google_vignette [김징어의 Devlog:티스토리]

예를 들어서 Dockerfile을 제작 하면

FROM maven:3.9-amazoncorretto-8 AS builder
# 이 스테이지를 builder라는 이름으로 명명.
WORKDIR /app
COPY . .
# 호스트의 Dickerfile의 위치에 있는 모든 파일이
# 컨테이너 내부의 /app 에 복사.
RUN mvn clean package
# target 폴더에 springbootApp.jar 생성

# 여기부터 다음스테이지
FROM public.ecr.aws/docker/library/openjdk:8-jre-slim
WORKDIR /app2
COPY --from=builder /app/target/springbootApp.jar app.jar
# 이전 builder라는 스테이지에서 생성된 파일을 현재 이미지로 복사
CMD ["java","-jar","app.jar"]

VUE 프론트엔드 - fastapi 백엔드 멀테스테이지 빌드

nodejs - 백엔드 런타임. 프론트엔드도 가능하고, 백엔드도 가능하다.

프론트엔드 - React , VUE, Svelte. 브라우저에서 실행 가능. nginx 같은 웹서버로 배포가능.

백엔드 - Express, NestJS, Node.js 서버에서 구동해야함.

vue로 만든 프론트엔드 페이지를 멀티스테이지 빌드할 예정.

root@contem:/docker/vue-fastapi# cd frontend/
root@contem:/docker/vue-fastapi/frontend# vi default.conf 

nginx의 리버스 프록시을 확인한다.
proxy_pass http://backend:8000/;

root@contem:/docker/vue-fastapi/frontend# cd ..
root@contem:/docker/vue-fastapi# cd backend/
root@contem:/docker/vue-fastapi/backend#
# 다시 백엔드로 돌아와서.

root@contem:/docker/vue-fastapi/backend# vi Dockerfile

root@contem:/docker/vue-fastapi/backend# docker build -t back:1 .

root@contem:/docker/vue-fastapi/backend# docker run -dp 8000:8000 --name backend back:1
# 백엔드컨테이너의 이름을 'backend'로 했다. 나중에 프론트엔드 코드에서 명시.
root@contem:/docker/vue-fastapi/frontend# docker build -t front:1 .

root@contem:/docker/vue-fastapi/frontend# docker run -dp 4989:80 --name web --link backend front:1

Dockerfile은 작성된 것을 가져와서 한것이고 우린 어떻게 연동하는지 어떻게 띄울지에 대한 실습을 했다고 생각하면된다.

profile
나를 한줄로

0개의 댓글