ggoggo

[Docker] 이미지 만들고 배포하기 본문

Infra/Docker

[Docker] 이미지 만들고 배포하기

chchae01 2023. 12. 3. 16:38

도커 이미지 만들기

도커는 이미지를 만들기 위해 컨테이너의 상태를 그대로 이미지로 저장한다.

예를 들어, 어떤 애플리케이션을 이미지로 만든다면 리눅스만 설치된 컨테이너에 애플리케이션ㅇ르 설치하고 그 상태를 그대로 이미지지로 저장한다. 가상머신의 스냅샷과 비슷한 방식이다.

 

Dockerfile 생성

도커는 Dockerfile이라는 이미지 빌드용 DSl(Domain Specific Language) 파일을 사용해 이미지를 만든다. 단순 텍스트 파일로 일반적으로 소스와 함께 관리한다.

# 1. ubuntu 설치 (패키지 업데이트 + 만든사람 표시)
FROM       ubuntu:16.04
MAINTAINER subicura@subicura.com
RUN        apt-get -y update

# 2. ruby 설치
RUN apt-get -y install ruby
RUN gem install bundler

# 3. 소스 복사
COPY . /usr/src/app

# 4. Gem 패키지 설치 (실행 디렉토리 설정)
WORKDIR /usr/src/app
RUN     bundle install

# 5. Sinatra 서버 실행 (Listen 포트 정의)
EXPOSE 4567
CMD    bundle exec ruby app.rb -o 0.0.0.0

 

이미지 빌드 - Docker build

docker build [OPTIONS] PATH | URL | -

 

Dockerfile을 만든 디렉토리로 이동한 후 다음의 명령어를 입력

docker build -t app .

 

빌드 명령어를 실행하면 Dockerfile에 정의한 내용이 한 줄 한 줄 실행되는 걸 볼 수 있다.

 

이미지 확인 & 컨테이너 실행

# input
docker images

# output
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
app                 latest              54d239c00f11        4 minutes ago       209 MB
ubuntu              16.04               f49eec89601e        2 weeks ago         129 MB

# 실행
docker run -d -p 8080:4567 app
docker run -d -p 8081:4567 app
docker run -d -p 8082:4567 app

 

이미지 저장소

Docker Registry

 

도커는 빌드한 이미지를 서버에 배포하기 위해 직접 파일을 복사하는 방법 대신 도커 레지스트리(Docker Registry)라는 이미지 저장소를 사용한다. 도커 명령어를 이용하여 이미지를 레지스트리에 push하고 다른 서버에서 pull 받아 사용하는 구조이다.

 

도커 레지스트리는 오픈소스로 무료로 사용할 수 있고 설치형이 싫다면 도커에서 서비스 중인 Docker Hub를 사용할 수 있다.

 

Docker Hub

도커 허브는 도커에서 제공하는 기본 이미지 저장소로 ubuntu, centos, debian 등의 베이스 이미지와 ruby, golang, java, python 등의 공식 이미지가 저장되어 있다.

 

Docker Hub를 이용해 이미지 배포하기

 

1. 로그인

도커에서 도커 허브 계정을 사용하려면 로그인 해야 한다.

docker login

# output
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: chaechae01
Password:
Login Succeeded

-> ID 와 PW를 입력하면 로그인 되고 ~/.docker/config.json에 인증 정보가 저장되어 로그아웃하기 전까지 로그인 정보가 유지된다.

 

2. 이미지 태그

도커 이미지 이름은 다음과 같은 형태로 구성된다.

[Registry URL]/[사용자 ID]/[이미지명]:[tag]

 

도커의 tag 명령어를 이용하여 기존에 맞든 이미지에 추가로 이름을 지어줄 수 있다.

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

docker tag app chaechae01/sinatra-app:1
# ID : chaechae01
# 이미지 이름 : sinatra-app
# 버전 : 1

 

3. 이미지 push

도커 허브에 이미지 전송

docker push chaechae01/sinatra-app:1

 

배포하기

컨테이너 배포 방식으로 

  • 기존의 애플리케이션을 배포하는 방식
    • 사용하는 언어, 프레임워크, 웹(or WAS) 서버, 리눅스 배포판, 개발자의 취향에 따라 각각 다른 방식을 사용
    • 새로운 서버를 셋팅하고 한 번에 배포를 성공한다는 건 굉장히 힘든 일이었다.
    • 의존성 라이브러리가 제대로 설치되었는지 검증하기도 매우 어려웠다.
  • 컨테이너 배포 방식
    • 그냥 이미지를 다운 받고 컨테이너를 실행하면 끝!

컨테이너 업데이트

  • 최신 이미지를 기반으로 새 컨테이너를 만들고 이전 컨테이너를 중지(삭제)하면 된다.
  • 단, 컨테이너를 중지하지 않고 스무스하게 교체하는 방법은 존재하지 않는다.
  • 컨테이너가 멈추는 순간 실행 중인 프로세스가 종료되기 때문에 접속이 안되는 문제가 있다.
  • 따라서 무중단을 고려한 ngins나 HAProxy 같은 Load Balancer와 2대 이상의 컨테이너를 사용해야 한다.