EC2, Docker Compose를 이용한 애플리케이션 배포 (with. Docker Hub)
결과적으로 구축할 환경은 아래와 같다.
📌 프로젝트에서
1) 도커 컴포즈 작성
도커 컴포즈에 사용되는 환경변수는 .env
파일에 담아놓았다.
version: '3'
services:
database:
container_name: wanted_mysql
image: mysql
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_ROOT_HOST=%
command:
- --character-set-server=utf8
- --collation-server=utf8_general_ci
- --default-authentication-plugin=caching_sha2_password
ports:
- "${MYSQL_LOCAL_PORT}:${MYSQL_DOCKER_PORT}"
volumes:
- ./db/conf.d:/etc/mysql/conf.d
- ./db/data:/var/lib/mysql --user 1000
restart: always
networks:
- test_network
application:
container_name: wanted_app
image: ln8847/wanted-pre-onboarding-application # 🌟 Docker Hub에 푸시할 이미지 이름 !!
build:
context: ./
dockerfile: Dockerfile
env_file: ./.env
ports:
- "${SPRING_LOCAL_PORT}:${SPRING_DOCKER_PORT}"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://database:${MYSQL_DOCKER_PORT}/${MYSQL_DATABASE}?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true
- SPRING_DATASOURCE_USERNAME=${MYSQL_USER}
- SPRING_DATASOURCE_PASSWORD=${MYSQL_ROOT_PASSWORD}
restart: always
depends_on:
- database
networks:
- test_network
networks:
test_network:
driver: bridge
2) 도커컴포즈 사용해서 이미지 빌드
$ ./gradlew build jar -x test # jar 파일 빌드
$ docker-compose -f docker-compose.yml build
$ docker images # 도커 이미지 확인 (도커 컴포즈에 정의된 서비스의 수만큼 이미지가 생성된다)
3) 도커허브 푸시
$ docker login -u ln8847 # 해당 커맨드 실행 후 Password 입력
$ docker-compose push # 위에처럼 docker-compose.yml에 image 필드가 있어야 한다 !! 🌟
📌 Ubuntu 인스턴스에서
1) 인스턴스 생성 후 보안그룹 열기
2) Docker Engine 설치
공식 사이트를 참고했다.
Repository 설정
# apt-get 업데이트
$ sudo apt-get update
$ sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker Engine 설치 및 실행
$ sudo apt-get update
# 설치
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 도커 실행
$ sudo service docker start
# 상태 확인
$ sudo service docker status
권한 설정
linux에서 root 권한이 아닌 상태로 docker를 실행하면 권한 문제가 발생할 수 있다.
[linux@localhost ]$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permi
ssion denied
이런 경우 매번 sudo로 커맨드를 실행해도 되지만, 번거롭기 때문에 docker group에 해당 유저를 추가해주면 해결할 수 있다.
# 보통은 docker group이 생겼을테지만, 만약 없으면 생성해준다.
$ sudo groupadd docker
# docker group에 해당 유저를 추가
$ sudo usermod -aG docker $USER
# 로그아웃 후 다시 로그인하거나 다음 명령어를 실행시켜야 적용이 된다.
$ newgrp docker
3) 도커 컴포즈 설치
$ sudo apt install docker-compose
$ docker-compose --version
💥 만약 위 방법으로 도커 컴포즈를 설치하고 버전을 확인했을 때 build unknown
이 나온다면?
이 글 참고
$ sudo apt remove docker-compose # 이전에 설치한 docker-compose를 제거
$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose
# 이 명령어는 외부에서 그대로 파일을 가져와서 현재의 시스템에 올려 놓는 것이다.
# 결과적으로 "/usr/bin/" 경로에 "docker-compose" 라는 이름의 파일로 다운된다.
# 참고) https://github.com/docker/compose/releases 에서 최신 버전 확인이 가능하다.
# 최신 버전을 설치하고 싶다면 위 명령어에 보이는 1.28.5 라는 버전 숫자를 바꿔주면 된다!
$ sudo chmod +x /usr/bin/docker-compose # chmod 를 통해서 실행이 가능하게 세팅
$ docker-compose --version
4) 배포 (=컨테이너 실행)
docker-compose.yml 파일과 .env 파일 생성
홈(/ubuntu/home)에 docker-compose.yml 파일과 .env 파일을 생성한다.
$ vi docker-compose.yml
$ vi .env
내용은 인텔리제이에서 복붙하자.
이미지 pull & 컨테이너 실행
$ docker login -u ln8847 # 도커허브 로그인
$ docker-compose -f docker-compose.yml pull # 이미지 pull
$ docker-compose -f docker-compose.yml up -d # 배포
+) 추가
코드를 수정했다면?
# 인텔리제이에서
$ ./gradlew build jar -x test # jar 파일 빌드
$ docker-compose -f docker-compose.yml build
$ docker login -u ln8847 # 해당 커맨드 실행 후 Password 입력
$ docker-compose push
# 우분투 인스턴스에서
$ docker login -u ln8847 # 도커허브 로그인
$ docker-compose -f docker-compose.yml pull # 이미지 pull
$ docker-compose -f docker-compose.yml up -d
그런데 배포 과정이 귀찮다.. 스크립트를 작성해 반복되는 과정을 줄일 수 있다!
스크립트 작성 및 실행
도커 이미지 빌드 및 도커 허브 푸시를 위한 스크립트 (인텔리제이에서)
작성
echo "> jar 파일 빌드"
./gradlew build jar -x test
echo "> docker-compose.yml 을 이용해 이미지 빌드"
docker-compose -f docker-compose.yml build
echo "> 도커 허브 로그인"
docker login --username=${USERNAME} --password=${PASSWORD}
echo "> 도커 허브 이미지 push"
docker-compose push
실행
$ chmod +x ./script/docker-image-push.sh # 권한 부여 (스크립트 작성 후 처음 한 번만 하면된다!)
$ ./script/docker-image-push.sh # 실행
배포를 위한 스크립트 (우분투 인스턴스에서)
작성
$ vi deploy.sh
echo "> 도커 허브 로그인"
docker login --username=${USERNAME} --password=${PASSWORD}
echo "> 이미지 pull"
docker-compose -f docker-compose.yml pull
echo "> 배포"
docker-compose -f docker-compose.yml up -d
이제 코드 수정 후 도커 허브에 푸시한 뒤, 우분투 인스턴스에서는 배포 스크립트만 실행하면 된다!
실행
$ chmod +x ./deploy.sh # 권한 부여 (스크립트 작성 후 처음 한 번만 하면된다!)
$ ./deploy.sh # 실행
+) 이제 코드를 수정했다면 아래처럼 하면 된다!
# 인텔리제이에서
$ ./script/docker-image-push.sh
# 우분투 인스턴스에서
$ ./deploy.sh # 배포 스크립트 실행
💛 개인 공부 기록용 블로그입니다. 👻