DevOps/Docker

[Docker] Docker란? (Image, Container 란?)

kind1230 2024. 5. 3. 00:34

Docker 란?

도커(Docker)는 다양한 운영체제와 시스템 환경에서 서버 설정이 각기 다르고 복잡할 때 유용한 컨테이너 기반의 가상화 플랫폼입니다. 도커를 사용하면 컨테이너 내에 서버를 설정할 수 있으며, 이 컨테이너는 기반 환경에 상관없이 실행만 하면 언제든 동일한 서버 구성을 재현할 수 있습니다. 이로써 환경의 일관성을 보장하고 서버 관리의 복잡성을 줄일 수 있습니다.

 

Docker 주요 구성 요소

engine

도커는 서버/클라이언트 구조를 가지고 있습니다. 몇가지 구성과 동작방식은 아래와 같습니다.

  1. 도커 데몬(Docker Daemon):
    • 서버의 역할을 하며, 컨테이너의 생성과 관리를 담당합니다.
    • 계속 실행되는 프로세스로, 시스템이 작동하는 동안 활성 상태로 유지됩니다.
  2. 도커 클라이언트(Docker Client):
    • 사용자가 도커 데몬과 소통할 수 있게 해주는 인터페이스입니다.
    • 사용자는 도커 명령어를 통해 클라이언트에 요청을 보냅니다.
  3. REST API 사용:
    • 클라이언트와 데몬 사이의 통신은 REST API를 통해 이루어집니다.
    • 예를 들어, docker ps 명령은 내부적으로 REST API를 사용하여 도커 데몬에 전송되며, 실행 중인 컨테이너의 목록을 요청합니다.

image

  1. 템플릿의 역할: 도커 이미지는 컨테이너를 생성하기 위한 명령들과 설정을 포함하는 템플릿입니다. 이 템플릿에 따라 컨테이너가 구성되고 실행됩니다.
  2. 계층화된 구조: 이미지는 여러 계층(layer)으로 구성됩니다. 각 계층은 변경사항을 캡처하여 이미지의 일부로 저장됩니다. 이 계층적 구조는 이미지의 재사용성과 효율성을 높여줍니다.
  3. 예시: 기본 운영체제(예: Ubuntu)에 추가적인 소프트웨어(예: Apache 웹서버)를 설치하여 새로운 이미지를 만드는 과정입니다. 이렇게 하여 웹서버 기능을 포함한 새로운 이미지를 생성할 수 있습니다.

container

  1. 리눅스 컨테이너 인스턴스: 도커 이미지를 기반으로 리눅스 컨테이너 형태의 인스턴스가 실행됩니다.
  2. 커널 활용: 도커 데몬이 있는 리눅스 커널을 사용하여 LXC(Linux Containers)를 통해 컨테이너를 생성합니다.
  3. 명령 실행: 컨테이너 생성 시 이미지에 포함된 명령을 실행하여 컨테이너를 구성하고 작동시킵니다.
  4. 격리된 환경: 컨테이너는 독립된 환경으로, 도커 데몬을 통해 관리되며, 내부로 진입하여 코드 수정이나 재실행이 가능합니다.
LXC (Linux Containers)
리눅스 기반의 경량 가상화 기술로, 여러 독립된 리눅스 시스템(컨테이너)을 하나의 호스트에서 실행할 수 있게 해줍니다. 각 컨테이너는 고유한 파일 시스템, CPU, 메모리, 프로세스 공간 등을 가지면서도 호스트 시스템의 커널을 공유합니다. 이로 인해 전통적인 가상 머신보다 훨씬 적은 오버헤드로 운영될 수 있습니다.

초기 docer 는 LXC 기술을 기반으로 구현되었으나, 최근에는 별도 컨테이너 기술을 구현하여 사용하고 있습니다.
(libcontaner, runC)

 

Docker Image 

1. docker 이미지 다운로드

docker pull ubuntu # 태그를 안붙이면, 디폴트 latest(최신버전)을 다운.
docker pull ubuntu:22.10 # 해당 버전을 다운로드.

 

2. docker 받은 이미지 확인

docker image ls 또는 docker images 명력어로 확인 가능합니다.

 

3. docker 받은 이미지 삭제하기

# docker rmi 명령
docker rmi 이미지ID(또는 이미지 REPOSITORY 이름)

# docker image rm 명령
docker image rm 이미지ID(또는 이미지 REPOSITORY 이름)

# 모은 이미지 삭제
docker rmi -f $(docker images -q)

 

Docker Container

1. 도커 컨테이너 생성 및 실행

# docker run 명령어는 지정된 이미지가 로컬 도커 환경에 없을 경우, 
# 자동으로 Docker Hub나 설정된 다른 레지스트리에서 해당 이미지를 찾아서 다운로드
docker run ubuntu 
# 지정한 버전으로 실행
docker run ubuntu:22.10

# -d: 컨테이너를 백그라운드 모드로 실행합니다.
# -p 8080:80: 호스트의 8080 포트와 컨테이너의 80 포트를 연결합니다.
# --name my-webserver: 컨테이너에 my-webserver라는 이름을 부여합니다.
# nginx: 사용할 이미지로 nginx 웹 서버 이미지를 지정합니다. 여기서는 추가적인 <명령>과 <매개 변수>를 지정하지 않았으므로, 이미지에 설정된 기본 명령이 실행됩니다.
docker run <옵션> <이미지> <명령> <매개 변수>
docker run -d -p 8080:80 --name my-webserver nginx

Docker Run 주요 옵션

  1. -d (detach): 컨테이너를 백그라운드 모드로 실행합니다.
  2. -p (publish): 호스트와 컨테이너 간의 포트 매핑을 설정합니다. 예: -p 80:80
  3. --name: 컨테이너에 이름을 지정합니다.
  4. -e (environment): 컨테이너 내에서 사용할 환경변수를 설정합니다. 예: -e MY_VAR=value
  5. -v (volume): 호스트와 컨테이너 간의 볼륨을 매핑합니다. 예: -v /host/path:/container/path
  6. --rm: 컨테이너가 종료될 때 자동으로 컨테이너를 삭제합니다.
  7. -it: 컨테이너를 대화형 모드(터미널 연결)로 실행하고, 표준 입력(STDIN)을 열어둡니다.
  8. --network: 컨테이너가 사용할 네트워크를 지정합니다.
  9. --restart: 컨테이너 재시작 정책을 설정합니다. 예: --restart=always
  10. --memory (mem limit): 컨테이너가 사용할 최대 메모리를 제한합니다.

 

2. 실행중인 컨테이너 확인

docker ps # 현재 실행중인 컨테이너 목록 보기
docker ps -a # 모든 컨테이너 목록 보기

 

3. 도커 컨테이너 삭제

docker rm 컨테이너ID(또는 이름) # 실행 중지된 컨테이너 삭제
docker rm -f 컨테이너ID(또는 이름) # 실행 중인 컨테이너 강제 삭제
docker rm $(docker ps -a -q) # 실행 중지된 컨테이너 모두 삭제