EC2 docker 설치 및 docker 환경 서비스 구동 + docker compose
처음으로 EC2 터미널에서 도커를 설치해준다.
sudo yum update -y
sudo yum install docker -y
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker ec2-user # 현재 사용자에 Docker 권한 추가
2. Docker 이미지 생성
.jar 파일을 실행하기 위해 Docker 이미지를 빌드해야 합니다.
2.1. Dockerfile 생성
EC2에서 실행 중인 .jar 파일과 동일 디렉터리에 Dockerfile을 생성합니다.
# Java 기반 이미지를 사용
FROM openjdk:17-jdk-slim
# 컨테이너 내 앱 디렉터리 설정
WORKDIR /app
# 호스트의 .jar 파일을 컨테이너로 복사
COPY your-application.jar application.jar
# 실행 명령어
CMD ["java", "-jar", "application.jar"]
여기서 your-application.jar은 실행 중인 .jar 파일 이름으로 교체합니다.
** 혹여나 권한 이슈가 있을 때는1. 현재 사용자에 Docker 그룹 권한 추가Docker를 실행하려면 현재 사용자가 docker 그룹에 포함되어야 합니다.
2. 변경 사항 적용변경 사항을 적용하려면 로그아웃 후 다시 로그인하거나, 다음 명령어로 세션을 갱신합니다.>> newgrp docker 3. 권한 확인Docker 명령어를 다시 실행하여 제대로 동작하는지 확인합니다.이 명령어가 오류 없이 실행되고 실행 중인 컨테이너 목록을 반환하면 문제는 해결된 것입니다. >> docker ps |
2.2. Docker 이미지 빌드
Dockerfile이 있는 디렉터리에서 Docker 이미지를 빌드합니다.
docker build -t your-application:latest .
이 명령어는 your-application:latest라는 이름의 Docker 이미지를 생성합니다.
docker build 명령어는 기본적으로 같은 디렉토리에 있는 Dockerfile이라는 이름의 파일을 읽습니다.
세부 사항:
- 기본 파일 이름
- Docker는 디폴트로 현재 디렉토리의 Dockerfile 파일을 찾습니다.
- 파일 이름은 대소문자를 구분하므로, 반드시 Dockerfile (첫 글자만 대문자, 나머지는 소문자)로 작성해야 합니다.
나만의 도커가 생성되었음을 알 수 있다.
3. Docker 컨테이너 실행
이미지 빌드가 완료되면 Docker 컨테이너를 실행합니다.
docker run -d -p 8080:8080 --name your-application-container your-application:latest
- -d: 백그라운드 실행
- -p 8080:8080: 호스트의 8080 포트를 컨테이너의 8080 포트에 매핑
- --name your-application-container: 컨테이너 이름 설정
4. 실행 확인
4.1. 실행 중인 컨테이너 확인
docker ps
컨테이너가 실행 중이면 목록에 나타납니다.
4.2. 애플리케이션 접근
애플리케이션이 정상적으로 실행되었는지, 브라우저 또는 API 도구를 사용하여 http://<EC2_PUBLIC_IP>:8080에 접속합니다.
이렇게 도커파일을 만들고 이미지를 빌드해서 컨테이너를 실행하게 되면 성공적으로 컨테이너에서 서비스가 돌아가는 것을 확인할 수 있다.
5. 기존 애플리케이션 중지 (선택 사항)
EC2에서 직접 실행 중인 .jar 애플리케이션을 중지합니다.
pkill -f your-application.jar
Docker Compose는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구입니다. 여러 서비스를 정의하는 YAML 파일을 사용해 컨테이너를 효율적으로 관리할 수 있습니다. Docker Compose를 사용하면 애플리케이션의 모든 종속성을 컨테이너로 관리하고, 단일 명령으로 애플리케이션의 전체 환경을 실행할 수 있습니다.
Docker Compose의 주요 특징
- 구성 파일 기반 관리: docker-compose.yml 파일에 애플리케이션의 모든 서비스 정의를 작성.
- 단순화된 명령어: docker-compose up, docker-compose down 등의 명령어로 다중 컨테이너를 실행 및 종료.
- 멀티 컨테이너 네트워킹: 각 컨테이너가 서로 통신할 수 있도록 기본적으로 네트워크를 구성.
- 환경 변수 지원: .env 파일을 통해 동적으로 설정 값을 변경.
- 스케일링 지원: 서비스의 개수를 조정하여 쉽게 확장 가능.
Docker Compose 기본 구조
Compose 파일(docker-compose.yml)은 YAML 형식으로 작성됩니다.
다음은 기본적인 예입니다:
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "8080:80"
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/app
ports:
- "5000:5000"
environment:
- ENV_VAR=production
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
구성 요소 설명
- version: Compose 파일의 버전을 지정.
- services:
- app: 단일 서비스 이름 (필요에 따라 변경 가능).
- build:
- context: Dockerfile이 있는 디렉토리 경로.
- dockerfile: 사용할 Dockerfile 이름.
- container_name: 컨테이너의 이름을 지정.
- ports: 컨테이너의 포트와 호스트의 포트를 매핑. 예를 들어, 8080:8080은 호스트의 8080 포트를 컨테이너의 8080 포트로 연결.
- environment: 환경 변수를 지정. 필요에 따라 JVM 옵션이나 애플리케이션 관련 값을 설정.
- volumes: 호스트와 컨테이너 간의 디렉토리 공유를 설정.
docker-compose.yml 사용법
- docker-compose.yml 파일 저장 프로젝트 루트 디렉토리에 docker-compose.yml로 저장.
- 이미지 빌드 및 컨테이너 실행
docker-compose up --build
docker-compose up -d
백그라운드에서 실행되길 원한다면 -d 옵션을 붙여야 한다.
로그를 보려면
docker-compose logs
여기까지 해서, EC2 환경에서 Dockfile을 통한 도커 이미지 빌드 및 컨테이너 실행
나아가서, docker-compose.yml 설정파일을 통해 각 서비스들에 대한 docker 이미지 빌드 파일들을 관리하고 일괄적으로 처리 할 수 있는 도커 컴포즈 기능들에 대하여 알아봤다.
도커파일과 도커 컴포즈 기능은 경우에 따라서 더 공부하여 필요한 순간 필요한 옵션들을 통해 컨테이너 설정 값들을 더 잘 만지는 것이 관건이라는 생각이 든다.
또한, 서비스들간의 네트워크과 볼륨 같은 개념들에 대해서 잘 알고 사용해야 할 것 같다.