[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 들이 있는
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
링크를 타고 가면 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