Dockerfile과 이미지 저장소

박찬병·2024년 11월 8일

데이터 분석

목록 보기
7/11

Docker의 주요 개념

Container

Docker의 핵심은 컨테이너(Container)이다. 컨테이너는 애플리케이션과 그 실행에 필요한 모든 파일과 설정을 포함하는 독립된 환경이다. 이를 통해 애플리케이션을 일관된 환경에서 실행할 수 있으며, 어디서든 동일한 동작을 수행함을 보장할 수 있다.

Image

컨테이너는 이미지(Image)를 통해 생성된다. 이미지는 컨테이너를 생성하는 데 사용되는 읽기 전용 템플릿이다. 애플리케이션 실행에 필요한 파일, 라이브러리, 설정 등을 포함하며, 이를 기반으로 컨테이너가 생성된다. Docker 이미지는 여러 레이어로 구성되며, 각 레이어는 파일 시스템의 변경 사항을 나타낸다. 이미지는 생성 이후 수정할 수 없지만, 새로운 레이어를 추가하여 확장할 수 있다.

Dockerfile

Dockerfile이미지를 생성하기 위한 스크립트 파일이다. 이 파일에는 이미지 빌드 과정에서 실행할 명령어가 포함되어 있으며, 이를 통해 이미지가 자동으로 빌드된다.


Dockerfile 만들기

프로젝트 디렉토리 내부에 Dockerfile라는 이름의 파일을 생성한다. 이 파일에는 확장자가 없다.

# 디렉토리 생성
mkdir docker-project

# 디렉토리 내부로 이동
cd docker-project

# Dockerfile이라는 이름의 파일 생성
touch Dockerfile

# 잘 생성되었는지 확인
ls 

이후 Dockerfile을 수정하여 명령어를 작성해야 한다. 이를 위해 우분투에 내장되어 있는 vi 편집기를 사용할 수 있다.

Vi 사용법

Dockerfile이 있는 디렉토리에서 다음 명령어를 실행하면 vi로 파일을 열 수 있다. 사실 앞서 Dockerfile을 생성하지 않아도, 이를 실행하면 해당 이름으로 파일을 생성한다.

vi Dockerfile

vi를 실행한 직후에는 문서를 편집할 수 없고, 명령 모드로 설정되어 있다.
이때 i를 누르면 입력 모드로 전환되어 텍스트를 입력할 수 있다.

입력이 끝나면 ESC를 눌러 명령 모드로 돌아갈 수 있다.

명령 모드에서 :w를 입력하면 편집한 내용을 저장할 수 있다.
:q를 입력하면 vi 편집기에서 나올 수 있다. 이때, 수정한 내용을 저장하지 않으면 :q가 수행되지 않는다.
:wq를 입력하면 저장과 동시에 편집을 종료할 수 있다.

편집 후 파일이 잘 수정되었는지 확인하려면 다음 명령어를 수행하면 된다.

cat Dockerfile

Windows 파일 탐색기로 WSL 접근

WSL를 사용한다면 앞선 방식으로 Dockerfile을 생성하거나 수정할 필요없이 Windows 파일 탐색기로 WSL 내부의 파일에 접근하고 수정할 수 있다.
파일 탐색기를 연 뒤, 주소에 \\wsl$을 입력하면 WSL의 내부에 접속할 수 있다.

따라서 Windows에서 원하는 파일 편집기나 IDE로 Dockerfile을 수정하고, WSL 내부 경로에 해당 파일을 이동하면 똑같은 효과를 얻을 수 있다.


기본 명령어

FROM

  • FROM은 Dockerfile로 이미지를 빌드할 때 사용할 베이스 이미지를 지정하는 명령이다.
FROM <image>[:<tag>] [AS <name>]

# 예시
FROM ubuntu:18.04
FROM nginx:latest AS ngx

COPY

  • COPY<src>의 파일이나 디렉토리를 <dest>에 복사하는 명령이다.
COPY <src> <dest>

# 예시
COPY a.txt /sub-directory/b.txt
COPY . /app

RUN

  • RUN명시한 명령어를 컨테이너 내부에서 실행하도록 하는 명령이다.
RUN <command>

# 예시
RUN apt-get update && apt-get upgrade -y
RUN pip install -r requirements.txt

CMD

  • CMD컨테이너가 시작할 때 실행할 명령어를 나타내는 명령이다.
CMD <command>

# 예시
CMD python main.py

WORKDIR

  • WORKDIR이후의 명령어가 수행될 작업 디렉토리를 명시하는 명령이다. 만약 해당 디렉토리가 없다면 새로 생성한다.
WORKDIR /path-to-workdir

# 예시
WORKDIR /home

ENV

  • ENV는 컨테이너 내부에서 사용할 환경 변수의 값을 설정하는 명령이다.
ENV <key> <value>

# 예시
ENV LANGUAGE ko_KR.UTF-8

EXPOSE

  • EXPOSE는 컨테이너가 외부로 노출할 포트/프로토콜을 지정하는 명령이다. 이를 지정하지 않으면 TCP가 기본으로 사용된다.
EXPOSE <port>
EXPOSE <port>/<protocol>

# 예시
EXPOSE 8080

Docker Build

Docker 빌드를 테스트해보기 위해 다음과 같은 내용의 간단한 Dockerfile을 생성한다.

# base image를 ubuntu:18.04로 설정
FROM ubuntu:18.04

# apt-get update 명령 실행
RUN apt-get update

# 컨테이너를 시작할 때 Hello World!를 출력
CMD ["echo", "Hello World!"]

이후 docker build 명령을 수행해 Dockerfile로 Docker image를 생성한다.

docker build -t my-image:v1.0 .
  • -t my-image:v1.0은 my-image라는 이름과 v1.0이라는 태그로 이미지를 빌드한다는 뜻이다.
  • 맨 뒤의 .은 현재 경로의 Dockerfile을 사용한다는 의미이다.

정상적으로 이미지가 빌드되었는지 확인한다.

docker images | grep my-image
  • 여기서 |은 파이프라인으로, 이전 명령어의 결과를 다음 명령어로 넘겨주는 역할이다.
  • grep은 해당 이미지가 존재하는지 잡아내는 명령이다.

이제 빌드한 이미지로 Docker 컨테이너를 실행한다.

docker run my-image:v1.0

Hello World!가 잘 출력되는 것을 확인할 수 있다.


이미지 저장소

Docker Registry

https://docs.docker.com/registry/

Docker Registry(레지스트리)는 Docker 이미지를 저장하고 관리하는 중앙 집중식 저장소이다. 도커 이미지를 빌드한 후, 이를 저장소에 업로드하여 필요할 때 쉽게 가져다 쓸 수 있다. Docker 레지스트리는 사용자들이 이러한 이미지를 업로드(push)하거나 다운로드(pull)할 수 있도록 한다.

앞서 빌드한 my-image:v1.0을 도커 레지스트리에 push하는 예시를 살펴보자.

먼저 다음 명령을 수행해 도커 레지스트리를 띄운다.

docker run -dp 5000:5000 --name registry registry

이후 docker ps를 실행하여 registry 이미지가 registry라는 이름으로 잘 생성되었는지 확인한다.
잘 생성되었다면 localhost:5000으로 해당 레지스트리와 통신할 수 있다.

이제 my-image가 방금 생성한 registry를 바라보도록 tag를 생성한다.

docker tag my-image:v1.0 localhost:5000/my-image:v1.0

이후 docker images | grep my-image를 실행하여 localhost:5000/my-image:v1.0가 새로 생성되었음을 확인한다.

앞서 생성한 my-image를 registry에 push한다.

docker push localhost:5000/my-image:v1.0

정상적으로 push되었는지 확인한다.

# localhost:5000 registry에 저장된 이미지 확인
curl -X GET http://localhost:5000/v2/_catalog
# 출력: {"repositories":["my-image"]}

# my-image라는 이미지에 저장된 태그 확인
curl -X GET http://localhost:5000/v2/my-image/tags/list
# 출력: {"name":"my-image","tags":["v1.0"]}

Docker Hub

Docker Hub는 도커에서 제공하는 대표적인 공개 레지스트리이다. 개발자들이 Docker 이미지를 공유하고 검색할 수 있는 플랫폼으로, 많은 오픈 소스 소프트웨어의 공식 이미지를 제공한다.

이를 사용하기 위해서는 먼저 회원가입을 해야 한다.
https://hub.docker.com/

이후 우분투에서 docker login을 수행한다.

# web으로 docker hub에 접속하여 로그인하기
docker login

# CLI로 아이디와 비밀번호를 입력하여 로그인하기
docker login -u <username>

앞서 registry에서 수행한 것과 유사하게, Docker Hub를 바라보는 tag를 생성한다.

docker tag my-image:v1.0 chanbyeong/my-image:v1.0

# docker tag <image_name>:<tag_name> <user_name>/<image_
name>:<tag>

생성한 이미지를 Docker Hub에 push한다.

docker push chanbyeong/my-image:v1.0

# docker push <user_name>/<image_name>:<tag>

Docker Hub의 본인 계정에서 업로드한 이미지를 확인할 수 있다.
https://hub.docker.com/repositories

0개의 댓글