글을 시작하며
이번 글은 위의 이전에 Dockerfile을 활용하여 배포해본 기능 추가적인 내용입니다. Docker를 처음 사용한다면, 앞의 내용도 함께 보시는것을 추천합니다.
Docker-Compose 컨테이너 관리툴을 활용하여 컨테이너를 실행시키는 방법에 대하여 담아보도록 하겠습니다.
DockerCompose를 활용하여 EC2에 배포할 서비스는 다음과 같습니다.
- seminarhub--cloud-config-server
- seminarhub-cloud-gateway-server
- seminarhub-cloud-netflix-eureka-server
- seminarhub-member-api-server
- seminarhub-seminar-api-server
- seminarhub-member-seminar-api-server
Before you begin
시작하기에 앞서서 필요한 서버세팅이 존재합니다.
- Docker가 설치되어 동작하는 호스트서버
- Github Remote 연결되어있는 Directory
Starting
1. Docker-Compose를 설치합니다.
- curl 명령어로 Docker Compose의 최신 버전을 다운로드합니다
- 다운로드한 Docker Compose binary file에 실행 권한을 부여합니다:
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 //Docker Compose 설치를 확인
2. dc.sh 배포 스크립트를 생성합니다.
처음에 docker-compose down 으로 이전에 실행중이던 docker-compose를 모두 종료시킵니다.
#!/bin/bash
REPOSITORY=/home/ec2-user/app/repo
PROJECT_NAME=seminar-hub
cd $REPOSITORY/$PROJECT_NAME/
echo "> Git Pull"
git fetch --all && git reset --hard origin/master && git pull
echo "> Project Build Started"
chmod +x ./gradlew
chmod 755 $REPOSITORY/$PROJECT_NAME
docker-compose down
cd $REPOSITORY/$PROJECT_NAME/
./gradlew seminarhub-cloud-config-server:build
sudo mkdir -p ./seminarhub-cloud-config-server/src/main/resources
sudo cp $REPOSITORY/seminarhub-cloud-config-server-application.yml $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-config-server/src/main/resources/application.yml
docker rmi seminarhub-cloud-config-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-config-server
docker build -t seminarhub-cloud-config-server .
cd $REPOSITORY/$PROJECT_NAME
./gradlew seminarhub-cloud-gateway-server:build -x test
sudo mkdir -p ./seminarhub-cloud-gateway-server/src/main/resources
sudo cp $REPOSITORY/seminarhub-cloud-gateway-server-application.yml $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-gateway-server/src/main/resources/application.yml
docker rmi seminarhub-cloud-gateway-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-gateway-server
docker build -t seminarhub-cloud-gateway-server .
cd $REPOSITORY/$PROJECT_NAME
./gradlew seminarhub-cloud-netflix-eureka-server:build -x test
sudo mkdir -p ./seminarhub-cloud-netflix-eureka-server/src/main/resources
sudo cp $REPOSITORY/seminarhub-cloud-netflix-eureka-server-application.yml $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-netflix-eureka-server/src/main/resources/application.yml
docker rmi seminarhub-cloud-netflix-eureka-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-netflix-eureka-server
docker build -t seminarhub-cloud-netflix-eureka-server .
cd $REPOSITORY/$PROJECT_NAME
./gradlew seminarhub-member-api-server:build -x test
sudo mkdir -p ./seminarhub-member-api-server/src/main/resources
sudo cp $REPOSITORY/seminarhub-member-api-server-application.yml $REPOSITORY/$PROJECT_NAME/seminarhub-member-api-server/src/main/resources/application.yml
docker rmi seminarhub-member-api-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-member-api-server
docker build -t seminarhub-member-api-server .
cd $REPOSITORY/$PROJECT_NAME
./gradlew seminarhub-seminar-api-server:build -x test
sudo mkdir -p ./seminarhub-seminar-api-server/src/main/resources
sudo cp $REPOSITORY/seminarhub-seminar-api-server-application.yml $REPOSITORY/$PROJECT_NAME/seminarhub-seminar-api-server/src/main/resources/application.yml
docker rmi seminarhub-seminar-api-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-seminar-api-server
docker build -t seminarhub-seminar-api-server .
cd $REPOSITORY/$PROJECT_NAME
./gradlew seminarhub-member-seminar-api-server:build -x test
sudo mkdir -p ./seminarhub-member-seminar-api-server/src/main/resources
sudo cp $REPOSITORY/seminarhub-member-seminar-api-server-application.yml $REPOSITORY/$PROJECT_NAME/seminarhub-member-seminar-api-server/src/main/resources/application.yml
docker rmi seminarhub-member-seminar-api-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-member-seminar-api-server
docker build -t seminarhub-member-seminar-api-server .
docker-compose up -d
3. docker-compose.yml 파일을 생성합니다.
- 각 container name을 services 다음 계층에 선언
- 해당 container의
-image : 사용할 이미지
-ports : <host port> : <container port>
-depends_on : 설정한 컨테이너가 모두 실행된 이후에 시작하도록 합니다.
-container_name : 컨테이너 이름을 고정시킵니다. 고정시키지 않을경우 -1, -2, -3... 이렇게 늘어납니다.
version: '1'
services:
seminarhub-cloud-config-server:
image: seminarhub-cloud-config-server
ports:
- "8000:8000"
restart: always
container_name: seminarhub-cloud-config-server
seminarhub-cloud-netflix-eureka-server:
image: seminarhub-cloud-netflix-eureka-server
ports:
- "8761:8761"
depends_on:
- seminarhub-cloud-config-server
restart: always
container_name: seminarhub-cloud-netflix-eureka-server
seminarhub-cloud-gateway-server:
image: seminarhub-cloud-gateway-server
ports:
- "80:80"
depends_on:
- seminarhub-cloud-config-server
restart: always
container_name: seminarhub-cloud-gateway-server
seminarhub-member-api-server:
image: seminarhub-member-api-server
ports:
- "0:0"
depends_on:
- seminarhub-cloud-gateway-server
- seminarhub-cloud-config-server
restart: always
container_name: seminarhub-member-api-server
seminarhub-seminar-api-server:
image: seminarhub-seminar-api-server
ports:
- "0:0"
depends_on:
- seminarhub-cloud-gateway-server
- seminarhub-cloud-config-server
restart: always
container_name: seminarhub-seminar-api-server
seminarhub-member-seminar-api-server:
image: seminarhub-member-seminar-api-server
ports:
- "0:0"
depends_on:
- seminarhub-cloud-gateway-server
- seminarhub-cloud-config-server
restart: always
container_name: seminarhub-member-seminar-api-server
이떄 추가로, AWS 에서 보안그룹의 In-Bound 설정 또한 추가해주어야합니다.
글을 끝마추며
Docker-Compose를 활용하여 각 도커 컨테이너 이미지를 실행시키는 과정을 정리해보았습니다.