3 분 소요

결과적으로 구축할 환경은 아래와 같다.
스크린샷 2023-08-08 오전 12 11 57

📌 프로젝트에서

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) 인스턴스 생성 후 보안그룹 열기

스크린샷 2023-08-03 오후 7 09 44

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이 나온다면?

이 글 참고

스크린샷 2023-06-05 오후 6 38 36

$ 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

스크린샷 2023-06-05 오후 6 42 40

4) 배포 (=컨테이너 실행)

docker-compose.yml 파일과 .env 파일 생성

홈(/ubuntu/home)에 docker-compose.yml 파일과 .env 파일을 생성한다.

$ vi docker-compose.yml
$ vi .env

내용은 인텔리제이에서 복붙하자.

스크린샷 2023-08-03 오후 7 14 07

이미지 pull & 컨테이너 실행

$ docker login -u ln8847 # 도커허브 로그인

$ docker-compose -f docker-compose.yml pull # 이미지 pull

$ docker-compose -f docker-compose.yml up -d # 배포

스크린샷 2023-08-03 오후 7 18 56

+) 추가

코드를 수정했다면?

# 인텔리제이에서
$ ./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

그런데 배포 과정이 귀찮다.. 스크립트를 작성해 반복되는 과정을 줄일 수 있다!

스크립트 작성 및 실행

도커 이미지 빌드 및 도커 허브 푸시를 위한 스크립트 (인텔리제이에서)

스크린샷 2023-08-06 오후 1 27 44

작성

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 # 실행

배포를 위한 스크립트 (우분투 인스턴스에서)

스크린샷 2023-08-06 오후 1 28 33

작성

$ 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 # 배포 스크립트 실행


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기

태그:

카테고리:

업데이트: