인프라

Docker란?

다다x_x 2025. 5. 13. 00:27
  1. Docker
    1. Docker의 구성
    2. Docker 이미지와 Docker 컨테이너
    3. Dockerfile
    4. Docker 명령어
    5. Docker 허브

Docker

https://www.hanbit.co.kr/channel/view.html?cmscode=CMS8893081462

컨테이너 기반으로 빌드, 배포, 실행, 관리할 수 있는 오픈 소스 가상화 플랫폼

컨테이너형 가상화 기술을 구현하기 위한 상주 애플리케이션과 조작하기 위한 명령행 도구(CLI)로 구성

애플리케이션, 데이터 단계만 사용자가 관리하는 PaaS 서비스

도커를 사용하면 다양한 개발 환경에서 컨테이너를 이용해 소프트웨어를 편리하게 배포 가능

  • 초창기 도커는 LXC를 사용해 동작
  • 0.9x버전부터 리눅스 커널에서 컨테이너를 구현하는 Linux namespace나 cgroups등의 API를 직접 실행하는 “libcontainer” 라이브러리를 개발하고 LXC 없이도 동작 가능

도커 구성 요소

https://www.hanbit.co.kr/channel/view.html?cmscode=CMS8893081462

  • docker-cli (Docker Client)
    • 명령어로 dockerdAPI를 활용해 build, pull, run과 같은 명령
    • 도커 데몬과 통신
  • dockerd (Docker Daemon)
    • 백그라운드에서 실행되는 데몬 프로세스
    • 도커 API 요청을 수신하고 도커 이미지, 컨테이너 등과 같은 도커와 관련된 객체를 관리
  • containerd (오픈소스 컨테이너 런타임)
    • 컨테이너 실행과 관리에 필요한 기능을 수행 → 컨테이너의 생명주기를 모두 관리
      • 생명주기 : 도커 이미지 전송, 컨테이너 실행, 스토리지, 네트워크 등을 포함
    • 실행 이외에도 컨테이너 관리를 위한 다양한 역할을 하는 High-Level Container runtime
  • runc
    • 실제 컨테이너 실행과 관련된 작업을 수행하는 Low-Level Container runtime
  • containerd-shim
    • 컨테이너 실행을 조정하는 역할
    • containerd와 runc 사이에서 작동하는 중간 프로세스
    • containerd는 runc와 통신함으로써 컨테이너를 실행 이때, containerd-shim이 containerd와 runc 사이에서 중개자 역할을 수행

Docker 이미지와 Docker 컨테이너

  • 도커 이미지
    • 컨테이너를 실행하기 위한 일종의 Template
    • 파일 시스템과 실행할 애플리케이션의 소스 코드, 라이브러리, 환경 설정 등의 모든 것을 포함
    • 이미지는 여러 개의 레이어로 구성
      • 각 레이어는 변경 사항이 있는 파일 또는 설정을 포함
      • 레이어는 상속 구조를 가지고 쌓여 최종 이미지를 구성
  • 도커의 immutable infrastructure paradigm (불변 구조)
    • 서비스 인프라 부분을 이미지화하여 배포한 후, 가급적 변경하지 않고 사용
    • 인프라 업데이트는 이미지를 교체하는 방식으로 진행
  • 도커 컨테이너
    • 이미지를 격리된 환경에서 실행
    • 해당 컨테이너에서 발생한 변경 사항은 컨테이너가 삭제되면 같이 삭제

Dockerfile

이미지를 생성하는데 필요한 명령어를 포함, 모든 설정이 정의된 파일

운영체제와 버전, 환경 변수, 파일 시스템, 사용자 등을 정의

  • FROM
    • FROM 이미지:태그
    • base 이미지를 지정
    • 보통 사용할 운영체제의 공식 이미지를 Dockerhub에서 가져옴
  • ENV
    • ENV 변수명 값
      ENV 변수명=값
    • Dockerfile 내에서 사용하는 환경 변수를 지정
    • 파일 내에서 변수는 $변수명 혹은 ${변수명} 형태로 표현
  • RUN
    • RUN 명령어
      RUN ["명령어", "인자1", "인자2"]
    • 이미지를 빌드할 때 실행할 명령어
    • 필요한 패키지를 설치하거나, 파일 권한 설정 등의 작업을 수행
  • COPY
    • COPY [src] [dest]
    • src 파일이나 디렉토리를 이미지 파일 시스템의 dest로 복사
  • ADD
    • ADD [src] [dest]
    • src 파일이나 디렉토리, URL을 이미지 파일 시스템의 dest로 복사
  • WORKDIR
    • WORKDIR 디렉토리주소
    • Dockerfile 내의 명령을 수행할 작업 디렉토리를 지정
  • USER
    • USER 사용자명|UID
      USER 사용자명|UID[:그룹명|GID]
    • 명령을 수행할 사용자 혹은 그룹을 지정
  • EXPOSE
    • EXPOSE 포트
      EXPOSE 포트/프로토콜
    • 컨테이너가 실행 중일 때 들어오는 네트워크 트래픽을 리슨할 포트와 프로토콜을 지정
      (프로토콜은 TCP와 UDP, 기본적으로 TCP가 지정)
  • ENTRYPOINT
    • ENTRYPOINT 명령어 인자1 인자2
      ENTRYPOINT ["명령어", "인자1", "인자2"]
    • 컨테이너가 실행될 때 수행할 명령어를 지정
  • CMD
    • CMD 명령어 인자1 인자2
      CMD ["명령어", "인자1", "인자2"]
      CMD ["인자1", "인자2"]
    • 컨테이너가 실행될 때 수행할 명령어를 지정, ENTRYPOINT 명령어에 인자를 전달
    • Dockerfile 내에 CMD 명령이 여러 개 존재하면 마지막 CMD를 사용
    • docker run의 인자를 작성하면 CMD 명령어는 무시
    • ENTRYPOINT가 있는 경우, docker run의 인자가 ENTRYPOINT의 인자로

Docker 명령어

docker build : Dockerfile을 이용하여 이미지를 생성

  • docker build 
    • 해당 경로의 Dockerfile 찾아서 이미지 생성
  • docker build [옵션] <경로>
  • docker build -t <이미지명:태그> <경로>
    • -t : 이미지의 이름과 태그를 지정 (미지정 ‘latest’)

docker images : 도커 이미지 목록을 출력

docker run : 도커 이미지로 컨테이너를 생성하고 실행

  • docker run [옵션] <이미지명|ID> [명령어]
  • docker run -p <호스트 PORT>:<컨테이너 PORT> <이미지명|ID>
  • docker run -it <이미지명|ID> <명령어>
    • it : 컨테이너에서 bash 셸을 열기

docker ps : 실행 중인 컨테이너 목록

docker create : 도커 이미지로 컨테이너를 생성

  • docker create [옵션] <이미지명|ID> [명령어]

docker start : 중단된 컨테이너를 시작

  • docker start [옵션] <컨테이너명|ID>

docker exec : 실행 중인 컨테이너에 접속하여 명령을 수행

  • docker exec [옵션] <컨테이너명|ID> [명령어]
  • docker exec -it <컨테이너명|ID> /bin/bash

docker stop : 실행 중인 컨테이너를 중단

  • docker stop [옵션] <컨테이너명|ID>

docker pull : 레지스트리(Docker Hub)에 존재하는 도커 이미지를 다운

  • docker pull [옵션] <이미지명>

docker rm : 도커 컨테이너를 삭제

  • docker rm [옵션] <컨테이너명|ID>

docker rmi : 도커 이미지를 삭제

  • docker rmi [옵션] <이미지명|ID>

docker inspect : 도커 이미지 혹은 컨테이너의 자세한 정보를 출력

  • docker inspect [옵션] <이미지 혹은 컨테이너명|ID>

Docker 허브

https://hub.docker.com/

도커의 공식 레지스트리로, 도커 이미지를 저장하는 저장소

Dockerfile이 아닌 이미지 그 자체를 보관하고 공유

공식 이미지는 기본 OS(Linux, CentOS 등) 이미지나, 특정 프로그래밍 언어의 개발 환경 등을 제공

Docker Hub 이미지 업로드

  1. docker login
    Docker Hub에 로그인
  2. docker build -t [사용자]/[레포지토리명]:[TAG] [Dockerfile 경로]
    Dockerfile을 이용하여 이미지를 빌드
    이미지 이름은 [사용자]/[레포지토리명]:[TAG] 형식으로 작성
  3. docker push [사용자]/[레포지토리명]:[TAG]
    레포지토리에 이미지를 업로드

Docker Hub 이미지 다운로드

  • docker pull
    • Docker Hub에서 이미지를 다운로드

 

 

참조

https://www.hanbit.co.kr/channel/view.html?cmscode=CMS8893081462

https://www.atlassian.com/microservices/cloud-computing/containers-vs-vms

https://colevelup.tistory.com/43?category=977726

https://hoon93.tistory.com/41