본문 바로가기

Back-end(Spring Framework)/필기일지

240111 [Back-end] Spring Framework 배포 - docker/ container 시간설정/ docker 자동화/ Dockerfile/ docker-compose

[24.01.11]  104차

 

<<진도>>

[Back-end] Spring Framework

배포

/ docker

/ container 시간설정

/ docker 자동화

/ Dockerfile

/ docker-compose

 

<<오늘의 팁>>

배포 시 최초 build 때 데이터를 캐싱하여 캐시메모리에 저장하고,

다시 빌드 시엔 변경된 부분만을 업데이트하므로 속도가 빨라짐

 

Docker

도커 컨테이너 배포 시

시간이 맞지 않는다

 

[타임존 설정 필요]

 

컨테이너 중지 후

docker stop tomcat-container

 

(**컨테이너 삭제)

docker rm tomcat-container

 

 

컨테이너 생성

docker run --name tomcat-container -p 8888:8080 -e TZ=Asia/Seoul tomcat:8.5

 

-port의 8888은 로컬pc의 윈도우가 사용하는 host 포트, 8080docker가 사용하는 포트

-e TZ(타임존)을 서울로 설정 (이 컨테이너에만 적용)

 

컨테이너 재생성 시 다시 war파일을 복사해주어야 함 (webapps 비어있음)

다시 복사 cp 하면 시간오차 없이 정상 작동 


[ docker-ver3 ] 자동화

매번 새로운  war  파일을 webapps에 복사하여 넣어주는 과정없이 docker파일을 이용하여 자동화하기

 

프로젝트 선택 후 target에 Dockerfile 생성

 

미리 만들어져 있는 이미지 image 들이 있는

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

Build and Ship any Application Anywhere Docker Hub is the world's easiest way to create, manage, and deliver your team's container applications. Create your account Signing up for Docker is fast and free. Continue with GoogleContinue with GitHubContinue wi

hub.docker.com

톰캣을 찾아 TOMCAT과 JAVA 버전맞게 선택

 

링크를 타고 가면 Dockerfile 내용이 있는데

 

*Dockfile 작성

## base image
FROM tomcat:8.5.98-jre11-temurin-jammy

## war 파일을 webapps에 복사
COPY target/ver3-1.0.0-BUILD-SNAPSHOT.war /usr/local/tomcat/webapps

## tomcat 실행하는 명령어
ENTRYPOINT ["catalina.sh", "run"]

 

* 이미지 생성

docker build -f Dockerfile -t docker-ver3:1.0 .

-f Dockerfile : 도커파일 최초지정

-t(taging) docker-ver3 : docker-ver3 (태그 1.0) 이미지를 생성

(**target 안에 있기때문에 Dockerfile을 찾을 수 없는 error참고 : 위치는 지정해야한다)

 

*Container  생성 실행

docker run --name docker-ver3-container -p 9999:8080 docker-ver3:1.0

 

실행 시 로그가 찍히는데

 

-d : 붙일 시 백그라운드에서 실행

docker run --name docker-ver3-container -d -p 9999:8080 docker-ver3:1.0

 

 

로그가 막 찍히지 않는다

 

 

*cp로 수동으로 war파일 옮기는 작업 없이 Dockerfile에 있는 내용이 자동으로 실행되어 접속가능

TZ 설정이없어 시간 안맞음

 

이미지 삭제

docker rmi docker-ver3:1.0

rm 명령어는 사실 

: docker container rm 이름 에서 container가 생략된 형태

: docker-ver3만 쓸 시 기본은 :latest 버전이므로 오류

 

image임을 지칭하기 위해 i를 붙이고, 버전 태그를 꼭 써줘야한다

 

[Dockerfile]

Dockerfile에서 명령어들은 레이어개념을 가진다

 

먼저 만들어진 라인이 아래에 깔린다 (역순) 1. FROM 위에 2.COPY 위에 3. ENTRYPOINT

=> 따라서 한 라인으로 끝낼 수 있다면, 그게 더 효율적인방법

 

** 이미지 버전은 8.5로 써도 무관 Docker hub에서 버전에 맞는 최신정보를 알아서 가져옴

 

 

같은 이름 이미지, 태그 다른 버전 빌드하면 (-f Dockerfile 생략)

docker build -t docker-ver3:1.1 .

기존 유지되고 추가만 된다

 


 

[ 컨테이너 생성까지도 파일로 작업할수있음 ]

yml(야믈) 파일 생성

 

(**yml 파일은 들여쓰기 공백이 매우 중요)

 

< docker-compose >

1. version 지정

속성: 다음은 space 하나

 

docker engine 버전에 맞게 지정필요

 

2.  services (여러 컨테이너들을 관리하는)

들여쓰기 내어쓰기는 space 2개씩 기준 중요

(docker-compose.yml이 Dokerfile을 읽고 이용하는 구조)

이렇게 yml 파일을 저장해놓고

 

3. 터미널에서 실행

docker-compose up --build

 

이미지가 생성 되고

 

docker-compose services

내 haha라는 컨테이너 생성

 

시간 설정까지 정상실행

 

**docker-compose가 Dockerfile까지 함께 실행 하므로 더 배포 프로세스가 간편해진다

 

docker-compose down 시  image는 그대로 있고 docker의 container만 삭제

 

마찬가지로 up --build에 -d 를 붙이면 백그라운드 실행

yaml 파일은 이러한 계층구조를 표현한 것이다.


< Docker 배포의 방식 >

 

</> 명령어를 하나씩 수동으로 작성

 

</> Dockerfile만 있는경우

      1. 이미지 생성 : docker build -t docker-ver3:1.0

      2. 컨테이너 생성 : docker run --name docker-ver3-container -p 9999:8080 doker-ver3:1.0

</> Dockerfile + docker-compose.yml

      이미지 + 컨테이너 생성 : docker-compose up --build

 


 

[aws 서버 배포]

첫 방식과 앞부분 동일

git

/ docker

/ container 시간설정

/ docker 자동화

/ Dockerfile

/ docker-compose

 

경로를 Dockfile / docker-compose  파일이 있는곳(project 하위경로)으로 cd 하고 명령어를 실행!


[MySQL IMAGE] 

mysql-container 생성

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=1111 -d -p 3307:3306 mysql:8.0

 

**Image의 경우 (mysql:8.0)  local에서 먼저 찾고 없다면, Docker hub에서 찾아 다운받는다.

 

기존에 없던 mysql:8.0 이미지가 생성

 

mysql-container 환경 접속

 

docker exec -it mysql-container bash
mysql -u root -p

 

입력 후  password 1111 엔터하면 mysql환경 진입가능

 

 

Workbench GUI 환경에서도 접속가능

 

 

Dockerfile-app

## base image
FROM tomcat:8.5.98-jre11-temurin-jammy

## war 파일을 webapps에 복사
COPY target/ver4-1.0.0-BUILD-SNAPSHOT.war /usr/local/tomcat/webapps

## tomcat 실행하는 명령어
ENTRYPOINT ["catalina.sh","run"]

Dockerfile-db

## base image
FROM mysql/mysql-server:8.0

## mysql 실행
CMD ["mysqld"]

 

docker-compose.yml

version: "3.8"

services: 
  app: ## 두번째 레벨에 오는것들이 컨테이너 하나하나
    container_name: good-container
    build:
      context: .
      dockerfile: Dockerfile-app
    environment: 
      - TZ=Asia/Seoul
    ports:
      - 9999:8080
    depends_on: ## db가 먼저 실행되고 app이 실행되게 세팅 100% 확실하게 보장하지는 않는다
      - database
  
  database:
    container_name: good-db
    build:
      context: .
      dockerfile: Dockerfile-db
    hostname: docker-mysql
    ports:
      - 3307:3306
    environment: 
      MYSQL_DATABASE: ver4
      MYSQL_ROOT_HOST: "%"
      MYSQL_ROOT_PASSWORD: 1111