Docker

컨테이너 개론

  • docker는 2013년에 dotcloud에서 생성 (솔로몬 하익스)

  • container 기술은 원래 Linux에 포함된 LXC(Linux Container)라는 커널 기술을 활용한 것

  • container은 100% Linux

  • Container은 작은 가상화 sever -> micro-vm (application 단위로 구동되는 서버)

    docker history

  • 1991 ~
    - linux안에는 LXC 가 존재했고 이를 이용해서 container을 만들 수 있었음.

  • 2010 ~
    - 가상화 기술 sever base로 변경되기 시작함

  • 2013 ~ : 가상화 기술 (docker 생성)

  • 2015 ~ : 컨테이너 관리 도구 만들어짐
    - kubernetes

    why docker

    • 복잡한 Linux Application을 여러 Container로 통합하여 실행 가능 => microservice
    • 개발, 테스트, 서비스 환경을 하나로 통합하여 효율적 관리가 가능
    • Image와 container를 전세계 사람들이랑 공유할 수 있음. (https://hub.docker.com/ 에서 무료로 가능)

    Container 기술

  • VM 가상화 보다 훨씬 빠르고 가벼운 경량화 기술.

  • 경량화 기술이기 때문에 기본적으로 제공되는 명령어 (ping etc..) 및 도구들이 제공되지 않음.

  • image의 복사본과 process를 합친 것.

    • image (동적) -> 정적으로 만들기 위해
    • 물리적 경로 (/var/lib/docker)에 복사본이 생성됨.
  • process의 추상화로 ps 명령어를 통해서 조회가 가능함.

    container type

  • PID 1이 무엇이냐에 따라 차이가 존재함.

  • system container

    • os container로 pid 1이 os 이다
    • vm을 사용하는 것처럼 다양한 방법으로 사용할 수 있음.
  • appication container

    • 단일 application이 컨테이너 내에서 실행됨.

    • 주체성, 독립성, 격리성을 가짐.

    • pid 1이 해당 application이다.

    • 보통 많이 사용됨.

      가상화 (VM vs Container)



      1) VM

    • server 기반의 가상화

    • Image 기반 -> OS, package 등의 운영 환경에 필요한 파일, 데이터를 포함함 -> 패키징
      - OVF 기술을 통해 패키징을 함

      2) Container

    • 애플리케이션 기반의 가상화, 경량화

    • Image 기반 -> OS, package 등의 운영 환경에 필요한 파일, 데이터를 포함함 -> 패키징

      • OCI(open container initiative) 기술을 통해 패키징을 함
    • image는 불변, 수정 불가 -> container안에서 update 하여 새로운 이미지를 생성해야함.

      • image는 계층 구조로 생성됨.

image

  • image는 여러개의 container를 만들수 있음.
  • container 하나는 하나의 image를 가질 수 있음.
  • 다양한 image의 결합을 위해서는 base image를 기초로 하여 layer를 쌓아 새로운 나만의 image를 생성할 수 있음.

docker engine

  • container를 실행하는 것.
  • docker engine은 hostOS(ubuntu)가 가지고 있는 kerner기술 (LXC)를 공유받아서 container 화를 지원하는 Paas(Platform as Serveice , 서비스를 위한 플랫폼)
  • docker container와 host os kerner은 socket 통신을 통해 운영
  • docker는 하드웨어 가상화 없이 격리된 환경에서 실행되는 프로세스 이므로 프로세스의 표준화된 격리를 말함.

커널기술 (LXC)

1) chroot

  • container의 독립된 (pid = 1) 환경 제공 (생성), 격리성 (all deny -> iptables) 제공

2) namespace

  • 운영체제(OS)의 동작과 연관이
  • network ns, mount ns, pid ns
    - network : sandbox를 container 내부에 배치 (Max, IP, iptables, route table 등 )
  • container에 제공함

3) cgroup (contral group)

  • 자원(cpu, memory, disk, network) 할당 제공
  • from hostOS
  • container의 할당되는 기본 자원은 무제한 (unlimited)
  • 따라서 limite를 걸어줘야함. (container가 독점할 수도 있기 때문에) ==> resource limit 구현이 요구됨.

Doker engine 아키텍쳐

1) dockerd

  • docker CLI (명령어)
    • docker로 시작함. (parent command)
    • 예를 들어 docker run (container 생성) 실행시 하면 밑으로 쭉 내려가면서 실행하는 것
  • swarmkit
    • docker cluster (multi server)
    • 이와 유사한 것이 kubernetes
  • logs mgmt
    • docker가 생성하는 모든 log 관리
    • 기본값이 json 형식으로 로그 저장
  • storage mgmt
    • 저장소 = volume -> host to container 간의 공유 설정
    • 밖 데이터를 컨테이너 내부로 공유하거나 그 반대도 가능
  • linbnetwork
    • docker network = docker 0= bridge network (L2 -> Mac 주소)
    • docker0의 역할 : 모든 컨테이너의 gateway 역할
  • buildkit
    • image build (이미지 생성)
  • DCT
    • 보안 설정(무결성)
  • image mgmt
    • image 관리

2) containerd

  • runtime engine, container의 lifecycle 관리
  • runtime engine : containerd, cri-o 등 있음

3) runC

  • container 생성에 관여

3->4) socket 통신(docker.shock) -> /var/run 경로에 있음. => kerner과 통신병 역할을 수행함

4) host OS의 kerner

docker 로 놀아보기

https://www.docker.com/play-with-docker/

https://hub.docker.com/ 에 로그인이 되어있어야함.

lab environment -> set start
login 한 후 start
add new instatnce 하면 리눅스 환경이 뜨게 됨.

실습
nginx image를 다운받아서 container를 만들고 웹에 띄워보기

# nginx docker image 불러오기
docker pull nginx:1.25.3-alpine

# docker image 확인하기
docker images

# image를 컨테이너 화 하기
docker run -d -p 8001:80 --name=myweb nginx:1.25.3-alpine

# docker process 확인하기
docker ps

# web 화면에 띄울 index.html 생성
vi index.html

# index.html에서 적어줄 것
<h1> hello docker </h1>

# html 파일을 nginx 아래에 넣어주기
docker cp index.html myweb:/usr/share/nginx/html/index.html

위를 모두 실행후 위쪽에 open port 8001을 보고 8001을 눌러주면 web 화면이 하나 뜨게 되고 내가 작성한 hello world가 보이게 됨.

profile
신윤재입니다

0개의 댓글

Powered by GraphCDN, the GraphQL CDN