본문 바로가기
DevOps/Docker

[프리온보딩] Docker의 기본 개념, 어떻게 사용하는지

by DUSTIN KANG 2023. 11. 25.

컨테이너 기술은 무엇인가?

컨테이너 기술은 애플리케이션과 이에 대한 종속성 라이브러리를 일관된 환경(런타임 환경)으로 패키징하는 기술을 의미한다. 컨테이너는 어떠한 환경에서든 자유롭게 실행 및 이동을 할 수 있다. 대표적인 컨테이너 기술로 도커(Docker)가 있다. 도커는 컨테이너를 생성하여 독립된 환경에서 애플리케이션을 배포하거나 실행하기 위한 오픈소스 플랫폼이다. 도커를 사용하면 호스트 OS, 컨테이너와도 독립된 공간이 보장되니 충돌이 발생하지 않아 협업에 많이 사용되는 기술이다.

 

Docker 활용

 

💡 `venv`와 Docker는 무슨 차이가 있는가?
프로젝트를 진행하다보면 `venv`라는 가상환경을 자주 사용하게 된다. 그렇다면 도커(docker)나 `venv`는 가상환경을 구축해 의존성과 패키지를 격리시키는데 같은 종류 아닌가 생각할 수도 있다. 하지만 여기서 차이점은 둘다 가상화 기술이지만  `venv`는 Python 프로젝트에 한정되어있다는 것이다.  반대로, 도커는 언어나 프레임워크, 운영체제에 구애받지 않고 다양한 애플리케이션을 컨테이너화 할 수 있다.

💡 그렇다면 가상머신과 컨테이너의 차이는?
가상머신은 Hypervisor에 의해 관리가 되고 컨테이너는 컨테이너 엔진에 의해 관리가 된다.
또, 가상머신은 각 Guest OS에 의한 오버헤드가 존재하며 컨테이너는 OS에 부담없이 관리할 수 있다.
참고자료) 서버 가상화 기술의 진화: VM과 컨테이너 - 가비아

 

 

Docker 아키텍처

Docker Architector from Docker docs

 

도커 이미지는 DockerHub에 관리하거나 저장할 수 있다.

DockerHub에서 이미지를 받고 싶으면 `docker pull`을 통해 다운받을 수 있다.

 

Docker Inside

도커는 기본적으로 `Dockerfile`, `Image`,  `Container` 구조로 이루어져 있다.

 

  • Dockerfile : 이미지를 빌드하기 위해 환경 설정, 실행 명령, 의존성 등을 작성하는 설정 파일이다. 도커 파일을 통해 이미지를 생성할 수 있다. 
  • Docker Image : 애플리케이션을 실행하기 위한 패키지이다. 스냅샷 형태로 이루어져 있으며 불변하다. 이미지를 통해 컨테이너를 생성할 수 있다. 
  • Docker Container : 도커 이미지를 실행한 인스턴스로 격리된 환경에서 애플리케이션을 동작한다. 하나의 이미지로 여러 개의 컨테이너를 실행할 수 있다. 
# 이미지 빌드 명령어
## docker build <옵션> <이미지 혹은 {계정/프로젝트}:버전> <dokcerfile_위치>
docker build -t my-image . 
## -t : 빌드한 이미지에 my-image라는 태그를 지정해 올립니다.

# 컨테이너 실행 명령어
## docker run <옵션> <이미지 혹은 {계정/프로젝트}:버전>
docker run -d -p 8888:80 my-image
## -d : 컨테이너를 백그라운드에서 실행
## -p 8888:80 : 호스트의 8888포트를 컨테이너의 80포트에 매핑

# 도커 허브 업로드
## docker push <이미지 혹은 {계정/프로젝트}:버전>
docker push my-image

 

Dockerfile 작성하는 법 ↓

더보기

Dockerfile 작성하기

자세한 내용은 공식문서를 참고하세요!

Dockerfile을 작성할 땐 순서도 중요합니다. 레이어 구조로 되어 있기 때문에 RUN이 WORKDIR전에  나오면 안되겠죠?

# 베이스 도커 이미지를 선정합니다. <이미지이름>:<버전, latest> (필수)
FROM python:3.7 

MAINTAINER dongwoo # 누구인지 명시

ENV PYTHON UNBUFFERED 1 # 도커의 환경변수
ARG DEV = false # 개발모드 OFF

# COPY <로컬에서 복사할 파일> <도커에 붙여넣을 파일> ex. 작업한 서비스 파일
COPY ./requirements.txt /app/requirement.txt 

# 도커에 명령어 시작위치, 존재하지 않으면 새로 생성됩니다.
# RUN, CMD, COPY, ADD 등의 지시자에 대한 작업 디렉토리를 설정합니다.
WORKDIR /app 

# 명령어 실행(이미지 빌드시)
RUN pip install -r requirement.txt 

EXPOSE 8000 # 로컬과 연결할 도커 포트, 반드시 docker run -p 8000:8000 으로 호스트로 오픈해야합니다.

 

Docker는 기본값으로 ROOT 계정으로 도커이미지를 생성하게 됩니다.

사실, 보안적으로 추천하지 않는 방식입니다. 프로세스를 실행할 때 Dockerfile에 아래 명령어를 넣어주시면 유저를 생성하여 좀 더 안전하게 연결할 수 있습니다.

RUN adduser -D user
USER user

 

이외에 추가 명령어를 소개합니다.

  • CMD : 컨테이너의 명령 설정 ["명령어", "명령어"] (컨테이너 생성 시)
  • ENTRYPOINT : 컨테이너의 명령 설정 (컨테이너가 생성되고 최초)
  • LABEL : 도커 라벨 작성, docker inspect에서 확인 가능
  • ADD : 파일 및 디렉토리 추가
  • VOLUME : 볼륨 마운트
  • ARG : Dockerfile 내부 변수
  • ONBUILD : 다른 이미지의 Base Image로 쓰이는 경우 실행될 명령 수행
  • SHELL : 기본값이 될 쉘 지정

/bin/sh: 1: Syntax error: Unterminated quoted string

Dockerfile에 오타 관련 문제다 보통 CMD에서 "명령어", "명령어" 띄어쓰기나 "'`의 차이 문제이다.

ERROR: "docker buildx build" requires exactly 1 argument.

See 'docker buildx build --help'.

Dockerfile을 빌드할 때 생기는 에러이다. 반드시, `.`을 뒤에 붙여주어야 한다.

다양한 Docker CLI 명령어

 

 

Docker 레지스트리에서 이미지 다운받기 `docker pull [OPTIONS] NAME`
이미지 리스트 확인하기 `docker image [OPTIONS] [REPOSITORY]`
이미지에서 새로운 컨테이너 생성하고 실행하기 `docker run [OPTIONS] IMAGE [COMMAND] [ARG...]`
컨테이너 실행하기 `docker start [OPTIONS] CONTAINER`
컨테이너 멈추기 `docker stop [OPTIONS] CONTAINER`
컨테이너 로그 Fetch 하기 `docker logs [OPTIONS] CONTAINER`
컨테이너 제거하기(멈췄을 때 가능, 아니면 -f 옵션 추가) `docker rm [OPTIONS] CONTAINER`
컨테이너의 커맨드라인 실행하기 (docker exec -it 으로 많이 사용) `docker exec [OPTIONS] CONTAINER [COMMAND]`
이미지 제거하기(컨테이너가 없을 때 가능) `docker rmi [OPTIONS] IMAGE`
레지스트리에 이미지 올리기 `docker push [OPTIONS] NAME`
레지스트리 로그인 하기 / 로그아웃 하기 `docker login [OPTIONS] [SERVER]`

 

도커 관리하기

도커 컨테이너 모든 컨테이너 멈추고 제거하기 `docker container prune [OPTIONS]`
도커 컨테이너 리소스의 라이브 스트림을 보여주기 `docker container stats [OPTIONS] [CONTAINER...]`
사용하지 않은 이미지 제거하기 `docker image prune [OPTIONS]`
도커 이미지의 상세정보를 JSON으로 보여주기 `docker image inspect [OPTIONS] IMAGE`
도커 이미지 태그 지정(버전?) `docker image tag SOURCE_IMAGE:TAG TARGET_IMAGE:TAG`
도커 사용하지 않은 데이터 제거하기 `docker system prune [OPTIONS]`
실행중인 도커 컨테이너 확인(-a 옵션 주면 사라진 컨테이너도 포함) `docker ps [OPTIONS]`

 

Docker Life Cycle

Docker Container LifeCycle :&nbsp;https://techmormo.com/posts/docker-made-easy-3-container-lifecycle/

 

 

 

 

Reference

 

Get Started | Docker

Get started with Docker Desktop and join millions of developers in faster, more secure app development using containers and beyond.

www.docker.com

 

실습 결과

'DevOps > Docker' 카테고리의 다른 글

[프리온보딩] Docker Compose  (0) 2023.12.14
[프리온보딩] Docker 이미지와 네트워크  (0) 2023.12.05