[24.01.10] 103차
<<진도>>
[Back-end] Spring Framework
/ 배포
/ Docker 도커 활용
/ AWS
Docker
- Docker 란?
- Docker : 컨테이너 기반의 오픈소스 가상화 플랫폼
- Container 란?
- 컨테이너는 독립된 가상 공간에서 프로세스가 동작하는 기술
- 하나의 서버에 여러개의 컨테이너를 띄울 수 있음
- 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순화 할 수 있음
- 컨테이너마다 다른 프로그램, 다른 버전을 적용할 수 있으며 각자 독립적으로 실행할 수도, 서로 연동해서 사용할 수도 있음
- Docker Image 란?
- 도커 이미지에는 실행 가능한 어플리케이션 소스 코드 뿐만 아니라 실행에 필요한 모든 툴, 파일, 라이브러리 및 설정값 등이 포함
- 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 바뀌거나 삭제되더라도 이미지는 변하지 않고 그대로 남아 있음
- Git으로 저장된 내용들이 Github에 올려지는 것과 같이, Docker Image는 Docker Hub에 업로드 되어서 공유되고 다운 받을 수도 있음
- Docker File 이란?
- Docker에서 이미지를 생성하기 위한 용도로 작성하는 파일
- 생성할 이미지에 대한 정보들을 기술해 놓은 파일이라고 생각하면 됨 => Docker File을 읽으면 해당 이미지가 어떻게 구성되었는지 알 수 있음
- 공식 Tomcat 이미지
https://hub.docker.com/_/tomcat
[ Docker 실습 ]
Linux 가상환경에서 Test
STS에서 만들어 놓은 프로젝트 docker-ver1
도커 내에 image 생성
컨테이너가 있고 컨테이너 안에서 이미지가 실행되는 구조
컨테이너 생성 필요!
터미널에서 docker run tomcat:8.5
tomcat:8.5 (생성한 이미지)
docker run tomcat:8.5
컨테이너 생성 (이름을 지정해 주지 않았으므로 임의 생성)
: 실행 중인 컨테이너의 port가 기존 윈도우에서 실행 중인 tomcat의 port와 동일하므로 작업필요
중지 후 터미널에서 다시
docker run tomcat:8.5
입력 시
이름을 지정해주지 않았으므로 임의 생성 => 컨테이너 실행 및 중지 시 컨테이너의 이름이나 id 입력필요
컨테이너를 생성하면서 이름과 포트를 지정
docker run --name tomcat-container -p 8888:8080 tomcat:8.5
--name 이름지정
-p 포트지정
-p 8888:8080
windows에서 실행되는 docker 도커의 포트 8888과 tomcat이 실행되는 8080
도커 포워딩 설정 (포트 매핑)
1. 현재 실행중인 컨테이너 보기 2. 중지된 컨테이너 포함해서 보기
3. 중지되어 있는 컨테이너를 실행
docker start (컨테이너id/이름)
리눅스 가상환경에서 쓰는 bash shell을 사용할 환경을 만들어주는 명령어 -it (interactive terminal)
docker exec -it tomcat-container /bin/bash
=> 이제 리눅스의 bash shell 명령어를 입력하는 터미널이 됨
=> tomcat경로의 webapps 폴더안에 배포용으로 만들었던 war파일 *(Run as - Maven install로 생성) 을 넣어야한다.
톰캣의 webapps 경로로 war파일 복사 명령어
D:\fullstack\workspace-framework\docker-ver1>
docker cp target\ver1-1.0.0-BUILD-SNAPSHOT.war tomcat-container:/usr/local/tomcat/webapps
이 war를 container안에서 관리 (/usr/local/tomcat/webapps)
d로 시작하면 폴더 (directory)
war 파일만 복사했는데 폴더도 함께 복사됨
동일한 구조 폴더
war 이름의 context로 접속 가능 (tomcat내에서 배포한 app)
원인
war파일의 이름(context)와 local view의 /ver1/(context)가 달라서 이미지가 깨짐
해결법
코드 수정(변경) => 로컬 확인(정상) => war 파일 생성 => tomcat/webapps에 추가
war 재생성 후 tomcat-container에 배포
[docker-ver2] aws (원격서버에 배포)
1. 프로젝트 생성 : 로컬 실행, war생성
2. 로컬 docker : app배포
3. github push
4. aws : 인스턴스 생성 (서버 임대) linux환경, 설치(java, docker git)
aws 세팅
## git, docker, java 설치
sudo yum install git docker java-11-amazon-corretto
## 도커 실행
sudo service docker start
## docker 권한 설정
sudo usermod -a -G docker ec2-user
## auto-start에 docker 등록
sudo chkconfig docker on
## 인스턴스 재시작
sudo reboot
## docker 버전 확인(설치 확인)
docker version
## 최신 docker compose를 해당 링크에서 받기
sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
## 권한 부여
sudo chmod +x /usr/local/bin/docker-compose
## docker-compose 버전 확인(설치 확인)
docker-compose version
1. docker-ver2 프로젝트 이상 없는것 확인 후 war 복사
2. docker에 app배포
3. github에 PUSH
4. AWS EC2
인스턴스 시작
이름 및 OS 설정
인스턴스 유형 선택
로컬에서 인스턴스 서버 접근 시 인증서 설정 (키 페어)
네트워크 설정
인스턴스 연결
아마존 Linux 접속
git, docker, java-11 설치
설치 후 확인은 --version 으로 버전확인
[ windows에서 했던 Docker 작업을 진행 ]
docker 실행
sudo service docker start
사용자(ec2-user)에게 docker 실행 권한 부여
sudo usermod -a -G docker ec2-user
자동 실행 설정
sudo chkconfig docker on
docker-compose를 설치하고
sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
권한부여
sudo chmod +x /usr/local/bin/docker-compose
이미지(tomcat 8.5) 생성 후 확인 (windows와 동일)
docker pull tomcat:8.5
컨테이너 생성 후 확인 (windows와 동일)
docker run --name tomcat-container -p 8888:8080 tomcat:8.5
** war파일을 docker webapps에 올리기위해서 원래는 전용 프로그램이 필요하지만
간편하게 github를 활용!
먼저 app 경로 생성
app에 git 내용 클론
target 경로에 war파일
container에 war파일 복사
docker cp target\ver2-1.0.0-BUILD-SNAPSHOT.war tomcat-container:/usr/local/tomcat/webapps
AWS 서비스 중인 인스턴스를 ip로 접속하기
외부에서 그냥은 접속되지 않음.
Port 8888에 대해 열어줘야하기 때문에
보안 탭 - 보안그룹 - 인바운드 규칙 편집 - 규칙추가
인스턴스 종료(삭제)
[ docker-ver2-homework ]
AWS 배포 복습 진행