[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 포트, 8080은 docker가 사용하는 포트
-e TZ(타임존)을 서울로 설정 (이 컨테이너에만 적용)
컨테이너 재생성 시 다시 war파일을 복사해주어야 함 (webapps 비어있음)
다시 복사 cp 하면 시간오차 없이 정상 작동
[ docker-ver3 ] 자동화
매번 새로운 war 파일을 webapps에 복사하여 넣어주는 과정없이 docker파일을 이용하여 자동화하기
프로젝트 선택 후 target에 Dockerfile 생성
미리 만들어져 있는 이미지 image 들이 있는
링크를 타고 가면 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에 있는 내용이 자동으로 실행되어 접속가능
이미지 삭제
docker rmi docker-ver3:1.0
rm 명령어는 사실
: docker container rm 이름 에서 container가 생략된 형태
: docker-ver3만 쓸 시 기본은 :latest 버전이므로 오류
image임을 지칭하기 위해 i를 붙이고, 버전 태그를 꼭 써줘야한다
[Dockerfile]
먼저 만들어진 라인이 아래에 깔린다 (역순) 1. FROM 위에 2.COPY 위에 3. ENTRYPOINT
=> 따라서 한 라인으로 끝낼 수 있다면, 그게 더 효율적인방법
** 이미지 버전은 8.5로 써도 무관 Docker hub에서 버전에 맞는 최신정보를 알아서 가져옴
같은 이름 이미지, 태그 다른 버전 빌드하면 (-f Dockerfile 생략)
docker build -t docker-ver3:1.1 .
[ 컨테이너 생성까지도 파일로 작업할수있음 ]
(**yml 파일은 들여쓰기 공백이 매우 중요)
< docker-compose >
1. version 지정
2. services (여러 컨테이너들을 관리하는)
(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 를 붙이면 백그라운드 실행
< 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