컨테이너 기술 - Docker

김규원·2025년 12월 10일

클라우드

목록 보기
15/17
post-thumbnail

Docker

  • 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 오픈 소스 컨테이너 플랫폼
  • 애플리케이션과 실행에 필요한 모든 종속성을 컨테이너라는 표준화된 유닛으로 패키징
  • 버전이나 환경변수가 다를 때 어떤 pc에선 실행이 되고 어떤 pc에선 안 되는 경우를 방지하기 위해 만들어진 기술
  • Docker Container 안에 필요한 모든 걸 다 넣음(OS, Runtime Library)
  • 즉, 도커를 배포하는 단위는 컨테이너
  1. Docker 파일을 통해 설계서를 만들고
  2. Image를 생성 가능
  3. Image를 바탕으로 컨테이너를 만들어내면 도커 컨테이너

Docker의 구성

VM

  • 기본적인 Infrastructure위에 가상화를 위한 HyperVisor가 존재함
  • 즉, 가상화를 통해 하나의 인프라를 가지고 여러개로 쪼개서 쓸 수 있음
  • 실제로 사진에서는 여러 OS가 Hypervisor위에 올라가 있는 모습
  • 단점
    : Guest OS과 같은 반복적인 요소가 많음 (오버헤드 발생 시킴)
    : 업무적인 업무 부하도 발생 시킴

Containers

  • vm과 대조되게 OS가 1개임
  • 1개의 OS위에 가벼운 도커 엔진이 돌아감
  • 그 위에 앱이 올라가는 느낌
  • 즉, VM보다 훨씬 가볍고 빠르게 동작
  • Container Engine은 기본적으로 Linux에서 동작, Win이나 MacOS에서도 동작하지만 훨씬 복잡함

Docker의 구성

  • Docker Container Engine에서는 운영체제가 달라도 다 사용 가능함
  • 개발적으로 디렉토리가 다 따로 제공
  • 즉, a에서는 python 3.11, b에서는 3.12를 써도 됨
  • Docker file에는 OS/Library/Command 등을 넣을 수 있음
  • 이 Docker file을 build하면 docker Image
  • 저장된 image를 run하면 container가 뚝뚝 나온다고 생각

Docker Layer

  • Layer는 도커를 더 가볍게 운영하기 위한 방법
  • 우분투에다가 nginx만 올리면 이건 웹 서버가 되는 것(즉, layer a,b,c는 동일)
  • 실제 웹 앱에서는 웹 앱의 소스를 올리면 웹 앱으로 동작함

Docker Image 경로

Other Registry

  • 이미지 생성 후 registry를 통해 이미지를 쌓아 둘 수 있음
  • 즉, 버전이나 용도 별로 차곡차곡 쌓을 수 있음
  • 쌓여져 있는 registry에서 서비스를 가져가서 실행

Docker Hub

  • 인터넷에서 도커를 중개해주는 중개 사이트

  • tag는 일종의 버전으로 명시 가능
  • namespace에선 나의 아이디 같은 걸 넣을 수 있음
  • image name에는 실제 이미지의 이름이 들어감

밑의 private registry같은 경우는 도커 허브는 아니고, 개인 pc에 프라이빗하게 registry를 만들어서 쓸 수 있는데, 그 때 개인 pc나 서비스의 이름으로 사용 가능(서버의 주소)

요약

  • Docker는 환경을 컨테이너 단위로 구성 가능
  • Docker를 통해서 원하는 실행환경과 앱 등을 원하는 곳에 필요한 만큼 배치 할 수 있음
  • Docker의 활용도가 점점 높아지면서 Docker를 관리하기 위한 서비스들이 등장하고 있음

Docker 명령의 이해

Docker pull

docker image repository 부터 Docker image를 가져오는 커맨드

$ docker pull –help
ex) docker pull ubuntu:18.04

현재 버전이 달라도 :18.04 를 하면 18을 돌릴 수 있음

Docker images

로컬에 존재하는 docker image 리스트를 출력

$ docker images -help
ex) docker images

Docker ps

현재 실행중인 도커 컨테이너 리스트를 출력

$ docker ps --help
ex) docker ps
ex) docker ps -a (전체 내역을 볼 수 있음)

Docker run

도커 컨테이너를 실행시키는 커맨드

$ docker run --help
ex) docker run -it --name demo1 ubuntu:18.04 /bin/bash

-it:-i 옵션 + -t 옵션

  • container 를 실행시킴과 동시에 interactive 한 terminal 로 접속시켜주는 옵션

--name` : name

  • 컨테이너 id 대신, 구분하기 쉽도록 지정해주는 이름

/bin/bash

  • 컨테이너를 실행시킴과 동시에 실행할 커맨드로, /bin/bash 는 bash 터미널을 사용하는 것을 의미합니다.


docker 접속 이후 $가 아닌 #으로 보이는데, 이는 최고 관리자임을 의미

Docker exec

Docker 컨테이너 내부에서 명령을 내리거나, 내부로 접속하는 커맨드

$ docker exec -help
ex) docker run -it -d --name demo2 ubuntu:18.04
docker ps
docker exec -it demo2 /bin/bash

-d

  • daemon의 약자
  • 백그라운드에서 실행시켜서, 컨테이너에 접속 종료를 하더라도, 계속 실행 중이 되도록 하는 커맨드

아까와 동일하게 container 내부에 접속할 수 있는 것을 확인 가능

Docker logs

도커 컨테이너의 log를 확인하는 커맨드

  • busybox를 이용해서 1초에 한번 찍어주는 docker run
$ docker logs --help
ex) docker run --name demo3 -d busybox sh -c "while true; do $(echo date); sleep 1; done“
docker logs demo3
docker logs demo3 -f

-f 옵션

  • 계속 watch 하며 출력

Docker stop

실행 중인 도커 컨테이너를 중단시키는 커맨드

$ docker stop --help
ex) docker stop demo3
docker stop demo2
docker stop demo1

Docker rm

실행 중인 도커 컨테이너를 삭제하는 커맨드

$ docker rm --help
ex) docker rm demo3
docker rm demo2
docker rm demo1

Docker images

실행 중인 도커 이미지 확인

Docker rmi

도커 이미지를 삭제하는 커맨드

$ docker rmi --help
ex) docker images
docker rmi ubuntu

  • 실제 이름은 magical_ganguly로 해당 이름으로 rm을 시도해야 삭제 가능

Dockerfile

Dockerfile 이라는 이름으로 빈 file 을 하나 만듦

$ cd $HOME # home 디렉토리로 이동합니다.
$ mkdir docker-practice # docker-practice 라는 이름의 폴더를 생성합니다.
$ cd docker-practice # docker-practice 폴더로 이동합니다.
$ touch Dockerfile # Dockerfile 이라는 빈 파일을 생성합니다.
$ ls # 정상적으로 생성되었는지 확인합니다.

FROM

: Dockerfile 이 base image 로 어떠한 이미지를 사용할 것인지를 명시하는 명령어입니다

FROM <image>[:<tag>] [AS <name>]
# 예시
FROM ubuntu
FROM ubuntu:18.04
FROM nginx:latest AS ngx

COPY

: <src> 의 파일 혹은 디렉토리를 <dest> 경로에 복사하는 명령어입니다.

COPY <src>... <dest>
# 예시
COPY a.txt /some-directory/b.txt
COPY my-directory /some-directory-2

RUN

: 명시한 커맨드를 도커 컨테이너에서 실행하는 것을 명시하는 명령어입니다

RUN <command>
RUN ["executable-command", "parameter1", "parameter2"]
# 예시
RUN pip install torch
RUN pip install -r requirements.txt

WORKDIR

: 이후 작성될 명령어를 컨테이너 내의 어떤 디렉토리에서 수행할 것인지를 명시하는 명령어입니다.

WORKDIR /path/to/workdir
# 예시
WORKDIR /home/demo

ENV

: 컨테이너 내부에서 지속적으로 사용될 environment variable 의 값을 설정하는 명령어입니다.

ENV <key> <value>
ENV <key>=<value>
# 예시
# default 언어 설정
RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8

EXPOSE

: 컨테이너에서 뚫어줄 포트/프로토콜을 지정할 수 있습니다. protocol 을 지정하지 않으면 TCP 가 디폴트로 설정됩니다

EXPOSE <port>
EXPOSE <port>/<protocol>
# 예시
EXPOSE 8080

간단한 Dockerfile 작성

docker build 명령어로 Dockerfile 로부터 Docker Image 를 만듦

# base image 를 ubuntu 18.04 로 설정합니다.
FROM ubuntu:18.04
# apt-get update 명령을 실행합니다.
RUN apt-get update
# DOCKER CONTAINER 가 시작될 때, "Hello World" 를 출력합니다.
CMD ["echo", "Hello FastCampus"]
$ docker build --help
# 자세한 옵션들에 대한 설명은 생략
# Dockerfile 이 있는 경로에서 다음 명령을 실행합니다.
$ docker build -t my-image:v1.0.0 .
# grep : my-image 가 있는지를 잡아내는 (grep) 하는 명령어
$ docker images | grep my-image
$ docker run my-image:v1.0.0

간단하게 도커 레지스트리를 직접 띄워본 뒤에, 방금 빌드한 my-image:v1.0.0 을 도커 레지스트리에 push

$ docker run -d -p 5000:5000 --name registry registry
$ docker ps
# 정상적으로 registry 이미지가 registry 라는 이름으로 생성되었음을 확인할 수 있습니다.
$ docker tag my-image:v1.0.0 localhost:5000/my-image:v1.0.0
$ docker images | grep my-image
$ docker push localhost:5000/my-image:v1.0.0
$ curl -X GET http://localhost:5000/v2/_catalog
$ curl -X GET http://localhost:5000/v2/my-image/tags/list

profile
행복한 하루 보내세요

0개의 댓글