안녕하세요 펭귄 교수입니다.
도커는 서버 배포 과정을 단순화하고, 일관된 환경에서 애플리케이션을 실행할 수 있도록 도와주는 강력한 도구입니다.
서버 배포는 전통적으로 복잡하고 많은 수작업이 필요한 과정이었지만, 도커를 사용하면 그 과정이 크게 간소화됩니다.
이번 글에서는 도커를 사용하여 애플리케이션을 서버에 배포하는 방법과 주요 개념들에 대해 알아보겠습니다.
1. 도커로 서버 배포하는 이유
도커를 사용하여 서버에 애플리케이션을 배포하는 가장 큰 장점은 일관성과 이식성입니다. 도커는 애플리케이션과 그에 필요한 모든 종속성을 하나의 컨테이너로 묶어 배포할 수 있습니다. 이 컨테이너는 어디서나 동일하게 실행될 수 있어, 로컬 환경, 테스트 환경, 프로덕션 환경에서 모두 일관된 결과를 얻을 수 있습니다.
주요 장점
- 이식성: 컨테이너 이미지는 어디서든 동일하게 동작합니다.
- 격리: 컨테이너는 서로 독립적이므로, 서로의 종속성이나 환경에 영향을 주지 않습니다.
- 자동화: 도커는 배포 파이프라인을 자동화하기 쉽습니다.
- 확장성: 컨테이너는 쉽게 복제되고 확장 가능합니다.
2. 도커 서버 배포 준비
도커로 서버에 애플리케이션을 배포하려면 먼저 서버 환경에 도커를 설치해야 합니다. AWS, Google Cloud, Azure와 같은 클라우드 서버나 로컬 서버를 사용할 수 있으며, 도커 설치는 매우 간단합니다.
서버에 도커 설치
- 우분투 서버에 도커 설치하기:
# 패키지 업데이트
sudo apt-get update
# 도커 설치를 위한 필수 패키지 설치
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# Docker GPG 키 추가
curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo apt-key add -
# Docker 저장소 추가
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 docker-ce
# 도커 실행 확인
sudo systemctl status docker
- AWS EC2에 도커 설치하기:
- AWS EC2 인스턴스에 접속한 후, 위와 동일한 명령어로 도커를 설치할 수 있습니다. AWS는 도커를 사용하기에 적합한 클라우드 플랫폼 중 하나입니다.
- 도커 컴포즈(Docker Compose) 설치: 여러 컨테이너를 쉽게 관리하려면 도커 컴포즈를 설치하는 것이 좋습니다.
sudo curl -L "<https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$>(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
3. 도커를 이용한 애플리케이션 배포
3-1. 도커 이미지 준비
애플리케이션을 도커 컨테이너로 배포하려면 먼저 도커 이미지를 만들어야 합니다. 이 이미지는 애플리케이션 코드, 실행 환경, 라이브러리 등을 포함합니다.
Dockerfile 작성
# 베이스 이미지 설정
FROM node:14
# 작업 디렉토리 설정
WORKDIR /app
# 종속성 복사
COPY package*.json ./
# 종속성 설치
RUN npm install
# 소스 코드 복사
COPY . .
# 애플리케이션 포트 설정
EXPOSE 3000
# 실행 명령어
CMD ["npm", "start"]
위 예시는 Node.js 애플리케이션을 위한 Dockerfile입니다. 도커 이미지는 각 애플리케이션에 맞게 커스터마이징할 수 있습니다.
3-2. 도커 이미지 빌드 및 푸시
이제 작성한 Dockerfile을 기반으로 도커 이미지를 빌드하고, 레지스트리에 푸시할 수 있습니다.
# 도커 이미지 빌드
docker build -t my-app .
# 도커 허브나 ECR에 로그인 후 푸시
docker login
docker tag my-app:latest my-dockerhub-username/my-app:latest
docker push my-dockerhub-username/my-app:latest
도커 이미지를 도커 허브(Docker Hub)나 AWS ECR과 같은 컨테이너 레지스트리에 푸시하면, 어디서든 해당 이미지를 사용할 수 있습니다.
4. 서버에 도커 컨테이너 배포
도커 이미지를 준비하고 레지스트리에 푸시한 후, 서버에서 해당 이미지를 사용해 컨테이너를 실행할 수 있습니다.
4-1. 도커 컨테이너 실행
# 서버에서 도커 허브에서 이미지 가져오기
docker pull my-dockerhub-username/my-app:latest
# 도커 컨테이너 실행
docker run -d -p 80:3000 --name my-running-app my-dockerhub-username/my-app:latest
위 명령어는 my-app 이미지를 80번 포트에서 실행하고, 도커 컨테이너는 백그라운드에서 동작하도록 설정합니다.
4-2. 도커 컴포즈로 다중 컨테이너 배포
도커 컴포즈를 사용하면 여러 개의 컨테이너를 손쉽게 관리할 수 있습니다. 예를 들어, 웹 서버, 데이터베이스 등을 함께 배포하려면 docker-compose.yml 파일을 작성해야 합니다.
version: '3'
services:
web:
image: my-dockerhub-username/my-app:latest
ports:
- "80:3000"
db:
image: postgres:latest
environment:
POSTGRES_PASSWORD: example
이후 다음 명령어를 사용하여 여러 컨테이너를 동시에 배포할 수 있습니다.
docker-compose up -d
5. 도커로 자동화된 배포 파이프라인 구축
CI/CD 파이프라인을 사용하면 도커를 활용한 자동화된 배포 프로세스를 구축할 수 있습니다. Jenkins, GitLab CI, GitHub Actions 등을 사용하여 코드를 푸시하면 도커 이미지가 자동으로 빌드되고, 배포되는 파이프라인을 구성할 수 있습니다.
5-1. GitHub Actions 예시
GitHub Actions는 도커 이미지를 자동으로 빌드하고 푸시하는 데 유용한 도구입니다. 예를 들어, .github/workflows/docker-publish.yml 파일을 작성하여 도커 허브로 이미지를 푸시하는 파이프라인을 만들 수 있습니다.
name: Docker Build and Push
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Log in to Docker Hub
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
- name: Build and push
run: |
docker build -t my-dockerhub-username/my-app:latest .
docker push my-dockerhub-username/my-app:latest
이 설정은 main 브랜치에 코드를 푸시할 때마다 자동으로 도커 이미지를 빌드하고, 도커 허브에 푸시하는 작업을 수행합니다.
마무리
도커는 서버 배포의 복잡성을 줄여주고, 일관된 환경에서 애플리케이션을 실행할 수 있도록 도와줍니다.
도커 이미지를 빌드하고 서버에 배포하는 과정이 매우 간단해지며, 이를 통해 개발부터 배포까지의 시간을 단축할 수 있습니다.
또한, 도커 컴포즈나 CI/CD 파이프라인을 통해 자동화된 배포 프로세스를 구축하면 더욱 효율적으로 애플리케이션을 관리할 수 있습니다.
이렇게 총 25편의 도커 강의가 마무리되었습니다. 강의를 진행하면서 저도 새롭게 배우는 것도 많았습니다. 좋은 경험이 되었고 앞으로도 다른 강의를 더 진행하고 싶은 욕심도 생겼습니다. 여기서 머물지 않고 앞으로 더 나아가는 펭귄 교수가 되어보겠습니다.
감사합니다.
다른 강의 더보기
'Docker > Docker 강의' 카테고리의 다른 글
[Docker 강의 24편] 도커로 서버리스 환경 구축하기 (0) | 2024.10.08 |
---|---|
[Docker 강의 23편] 도커 스웜(Docker Swarm) 개념 (1) | 2024.10.06 |
[Docker 강의 22편] 도커 컨테이너 백업과 복원 (0) | 2024.10.06 |
[Docker 강의 21편] 도커 이미지 보안 관리 (0) | 2024.10.06 |
[Docker 강의 20편] 도커와 마이크로서비스 아키텍처 (0) | 2024.10.05 |