도커 CLI로 사용하기
1. docker desktop 실행
2. 스프링 부트 프로잭트 생성
3. Gradle -> build -> build -x test 실행하여 빌드파일 생성
4. Dockerfile 만들기
- Dockerfile 위치는 root (파일명, 위치는 디폴트)
FROM <= 아래 이미지에서 버전 맞는거 사용
COPY <= 파란색 밑줄 부분과 빌드 파일에 있는 .jar 파일 명의 이름이 같아야한다.
Dockerfile 예제
FROM openjdk:8-jre-alpine
COPY build/libs/dockerTest-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
5. 도커 이미지 만들기
-> 인텔리제이 터미널에서 실행 docker build -t my-springboot .
docker build -t my-springboot .
6. 이미지 만들어졌는지 확인
docker ps
7. 도커 컨테이너 만들기
docker run --name sb -p 8080:8080 -d my-springboot
실행 후 브라우저에서 localhost8080으로 접속
성공 확인!
8. Mysql 컨테이너 생성
docker run --name some-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 -d mysql
-> 기존에 Mysql이 깔려있어 포트 중복으로 안됨
-> 포트 변경 3305
docker run --name some-mysql -p 3305:3306 -e MYSQL_ROOT_PASSWORD=1234 -d mysql
실행시 docker hub에 있는 mysql을 불러옴
확인 명령어
docker ps -a
mysql 확인
디비 접속
테이블 생성 및 데이터 삽입
9. 컨테이너 레이어 파일 저장 방법
- 폴더 만들기
mkdir mysql-data
- 컨테이너 삭제
docker stop some-mysql;
docker rm some-mysql;
- 컨테이너 실행
docker run --name some-mysql -v {폴더 절대경로}:/var/lib/mysql -p 3305:3306 -e MYSQL_ROOT_PASSWORD=1234 -d mysql
- 도커 허브 - 레파지토리 만들기
You can push a new image to this repository using the CLI
docker push new-repo:latest
Make sure to change tagname with your desired image repository tag.
docker images 명령어 입력 후 Repositoy = 이미지명 , 태그 = latest , ntw2100/my-repo:latest (도커 허브 레파지토리)
- 터미널에서 실행
docker images
docker tag {이미지명}:{태그} {리파지토리 이미지명}:{태그}
- 터미널에서 로그인
docker login
- 푸시
-> 입력 docker push ntw2100/my-repo:latest
docker push {리파지토리 이미지명}:{태그}
- 태그 생략시 도커가 알아서 처리
- 업로드 확인
============ 이제 ec2 로!
EC2 에서 이미지 사용하기
- git bash 로 ec2 접속
ssh -i {aws-key file.pem} ubuntu@{public ip}
- 도커 설치(install.sh에 복사)
vim install.sh
위 명령어 치고 들어가서 아래 내용 붙여넣고 :wq! 입력
sudo apt-get update
sudo apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install -y docker-ce
sudo usermod -aG docker $USER
그럼 파일로 만들어지는데
sh install.sh
입력하여 실행 -> 설치 완료 후 exit으로 한번 껏다 켜야 됩니다.
- 이미지 PULL
docker pull ntw2100/my-repo:latest
- 컨테이너 실행
docker run --name {컨테이너 이름} -p 80:8080 -d {이미지 이름}:{태그}
컨테이너 이름은 변수명 - 자신이 정하면 됨 / 이미지 이름 - 클레스 (Docker hub의 레파지토리 명)
======================================
****** 인텔리제이 작업 : gradle 빌드 - 도커 빌드 - 도커 태그 - 도커 푸시 - ec2에서 도커 풀
IDE에서 빌드 작업
- 그레들 빌드(소스 빌드) : gradle build -x test
IDE 터미널 명령어 작업
- 도커 빌드 : docker build -t my-springboot . (빌드 해서)
- 도커 태그 : docker tag my-springboot ntw2100/my-repo (태그 걸고)
- 도커 푸시 : docker push ntw2100/my-repo (docker hub의 내 레파지토리로 푸시)
EC2 - ubuntu 작업 (git bash -> ssh 접속 -> ubuntu)
- 도커 풀 : docker pull ntw2100/my-repo
기존에 실행 했던거 있는지 확인 후 있으면 rm으로 지워줌
다시 docker ps -a 로 확인하면 sb 없는 것 확인 됨.
이제 다시 pull 해온 docker 이미지를 실행 !
다중 컨테이너 운영 - 로컬 환경에서 테스트 (ec2 아님)
👉 하나의 호스트에 여러개의 컨테이너를 실행할 수 있어요!!
Springboot 수정
- 데이터 베이스 설정 추가
spring.datasource.url=jdbc:mysql://localhost:3305/mydb
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=update
- 소스 빌드 & 도커 빌드
- Spingboot 컨테이너 생성
docker run --name sb -p 8080:8080 -d my-springboot
- 로그 확인 (에러발생)
컨테이너 하나하나가 하나의 컴퓨터 이기 때문에 mysql은 다른 pc로 간주한다. 따라서 로컬환경에서 실행시 연결이 되지 않는게 정상.
docker logs -f sb
-> 따라서 디비 설정 수정
도커 인터널로 연결
spring.datasource.url=jdbc:mysql://host.docker.internal:3306/mydb
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=update
-> 정상 작동
================
도커 반자동화
- docker-compose 이용
docker-compose.yaml 설정 파일 만들기
version: "3.9"
services:
some-springboot:
image: my-springboot
ports:
- 8080:8080
networks:
- backend
some-mysql:
image: mysql
volumes:
- C:/Users/USER/Documents/Git/weeklytest/spring0607/mysql-data:/var/lib/mysql
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=1234
networks:
- backend
networks:
backend:
spring.datasource.url=jdbc:mysql://some-mysql/mydb
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=update
실행
docker-compose up -d
8. 도커 명령어
-
- 컨테이너 생성
docker run --name {컨테이너 이름} -p {호스트 포트}:{컨테이너 포트} -d {이미지명}:{이미지태그}
- 생성된 컨테이너 확인
-
docker ps
- 컨테이너 정지
-
docker stop {컨테이너명}
- 정지된 컨테이너 확인
-
docker ps -a
- 정지된 컨테이너 삭제