본문 바로가기
도커&쿠버네티스

[도커/쿠버네티스] 2.5장 도커 데몬

by bzerome240 2022. 1. 10.

지난이야기...

컨테이너 -> 컨테이너의 밑바탕이 되는 이미지 -> 이미지를 생성할 수 있는 dockerfile 을 공부했다.

 

2.5.1 도커의 구조

도커 명령어 파일 위치 확인

which docker

 

실행 중인 도커 프로세스 확인

ps aux | grep docker

 

도커의 구조

1) 서버로서의 도커

: 컨테이너 생성, 실행, 이미지 관리 -> dockerd 프로세스로서 동작

도커데몬: 도커 프로세스가 실행되어 API 입력을 받을 준비가 된 상태

 

2) 클라이언트로서의 도커

: 도커 데몬이 API를 사용할 수 있도록 CLI를 제공

ex) docker 로 시작하는 명령어 입력

개발자가 명령어를 입력하면 도커 클라이언트는 명령어를 도커데몬에 API로서 전달

도커 클라이언트는 /docker.sock에 위치한 유닉스 소켓을 통해 도커 데몬의 API 호출

 

2.5.2 도커 데몬 실행

1) 도커 서비스로 도커 데몬 실행하는 법

 

도커 자동 실행 설정

systemctl enable docker

 서비스로 도커 데몬 실행

service socker start
service socker stop

 

2) 서비스를 사용하지 않고 직접 도커 데몬 실행하는 법

service docker stop # 도커 서비스 정지
dockerd             # 도커 데몬 실행

# 실행된 도커 데몬 종료: Ctrl + C

- 디버깅, 도커 자체의 트러블슈팅이 필요할 때 편리

- But, 직접 데몬 실행 시 하나의 터미널을 차지하는 포그라운드 상태로 실행되기 때문에 운영 및 관리 측변에서 부적절

-> 실제 운영 환경에서는 직접 실행 보다는 service, systemctl 명령어를 통해 리눅스 서비스로서 관리하는 것이 적절

 

 

2.5.3 도커 데몬 설정

도커 데몬 설정파일을 읽어 도커 데몬이 실행된다.

 

설정파일의 DOCKER_OPTS에 옵션 입력

 

도커 설정 옵션

더보기
더보기
Usage: dockerd COMMAND

A self-sufficient runtime for containers.

Options:
      --add-runtime runtime                   Register an additional OCI compatible runtime (default [])
      --allow-nondistributable-artifacts list Allow push of nondistributable artifacts to registry
      --api-cors-header string                Set CORS headers in the Engine API
      --authorization-plugin list             Authorization plugins to load
      --bip string                            Specify network bridge IP
  -b, --bridge string                         Attach containers to a network bridge
      --cgroup-parent string                  Set parent cgroup for all containers
      --config-file string                    Daemon configuration file (default "/etc/docker/daemon.json")
      --containerd string                     containerd grpc address
      --containerd-namespace string           Containerd namespace to use (default "moby")
      --containerd-plugins-namespace string   Containerd namespace to use for plugins (default "plugins.moby")
      --cpu-rt-period int                     Limit the CPU real-time period in microseconds for the
                                              parent cgroup for all containers
      --cpu-rt-runtime int                    Limit the CPU real-time runtime in microseconds for the
                                              parent cgroup for all containers
      --cri-containerd                        start containerd with cri
      --data-root string                      Root directory of persistent Docker state (default "/var/lib/docker")
  -D, --debug                                 Enable debug mode
      --default-address-pool pool-options     Default address pools for node specific local networks
      --default-cgroupns-mode string          Default mode for containers cgroup namespace ("host" | "private") (default "host")
      --default-gateway ip                    Container default gateway IPv4 address
      --default-gateway-v6 ip                 Container default gateway IPv6 address
      --default-ipc-mode string               Default mode for containers ipc ("shareable" | "private") (default "private")
      --default-runtime string                Default OCI runtime for containers (default "runc")
      --default-shm-size bytes                Default shm size for containers (default 64MiB)
      --default-ulimit ulimit                 Default ulimits for containers (default [])
      --dns list                              DNS server to use
      --dns-opt list                          DNS options to use
      --dns-search list                       DNS search domains to use
      --exec-opt list                         Runtime execution options
      --exec-root string                      Root directory for execution state files (default "/var/run/docker")
      --experimental                          Enable experimental features
      --fixed-cidr string                     IPv4 subnet for fixed IPs
      --fixed-cidr-v6 string                  IPv6 subnet for fixed IPs
  -G, --group string                          Group for the unix socket (default "docker")
      --help                                  Print usage
  -H, --host list                             Daemon socket(s) to connect to
      --host-gateway-ip ip                    IP address that the special 'host-gateway' string in --add-host resolves to.
                                              Defaults to the IP address of the default bridge
      --icc                                   Enable inter-container communication (default true)
      --init                                  Run an init in the container to forward signals and reap processes
      --init-path string                      Path to the docker-init binary
      --insecure-registry list                Enable insecure registry communication
      --ip ip                                 Default IP when binding container ports (default 0.0.0.0)
      --ip-forward                            Enable net.ipv4.ip_forward (default true)
      --ip-masq                               Enable IP masquerading (default true)
      --iptables                              Enable addition of iptables rules (default true)
      --ip6tables                             Enable addition of ip6tables rules (default false)
      --ipv6                                  Enable IPv6 networking
      --label list                            Set key=value labels to the daemon
      --live-restore                          Enable live restore of docker when containers are still running
      --log-driver string                     Default driver for container logs (default "json-file")
  -l, --log-level string                      Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --log-opt map                           Default log driver options for containers (default map[])
      --max-concurrent-downloads int          Set the max concurrent downloads for each pull (default 3)
      --max-concurrent-uploads int            Set the max concurrent uploads for each push (default 5)
      --max-download-attempts int             Set the max download attempts for each pull (default 5)
      --metrics-addr string                   Set default address and port to serve the metrics api on
      --mtu int                               Set the containers network MTU
      --network-control-plane-mtu int         Network Control plane MTU (default 1500)
      --no-new-privileges                     Set no-new-privileges by default for new containers
      --node-generic-resource list            Advertise user-defined resource
      --oom-score-adjust int                  Set the oom_score_adj for the daemon (default -500)
  -p, --pidfile string                        Path to use for daemon PID file (default "/var/run/docker.pid")
      --raw-logs                              Full timestamps without ANSI coloring
      --registry-mirror list                  Preferred Docker registry mirror
      --rootless                              Enable rootless mode; typically used with RootlessKit
      --seccomp-profile string                Path to seccomp profile
      --selinux-enabled                       Enable selinux support
      --shutdown-timeout int                  Set the default shutdown timeout (default 15)
  -s, --storage-driver string                 Storage driver to use
      --storage-opt list                      Storage driver options
      --swarm-default-advertise-addr string   Set default address or interface for swarm advertised address
      --tls                                   Use TLS; implied by --tlsverify
      --tlscacert string                      Trust certs signed only by this CA (default "~/.docker/ca.pem")
      --tlscert string                        Path to TLS certificate file (default "~/.docker/cert.pem")
      --tlskey string                         Path to TLS key file (default "~/.docker/key.pem")
      --tlsverify                             Use TLS and verify the remote
      --userland-proxy                        Use userland proxy for loopback traffic (default true)
      --userland-proxy-path string            Path to the userland proxy binary
      --userns-remap string                   User/Group setting for user namespaces
  -v, --version    

 

2.5.3.1 도커 데몬 제어 -H

-H : 도커 데몬의 API를 사용할 수 있는 방법을 추가

 

dockerd # dockerd -H unix:///var/run/docker.sock 유닉스 소켓 바인딩과 동일함

 

-H 뒤에 IP 주소와 포트번호를 입력하면 Docker Remote API로 도커 제어 가능

 

ex) 호스트에 존재하는 모든 네트워크 인터페이스의 IP 주소와 2375번 포트를 바인딩해 입력 받음

docker -H tcp://0.0.0.0:2375

But, 유닉스 소켓은 비활성화되므로 도커 클라이언트 사용 불가 (docker 명령어 사용 불가)

-> 유닉스 소켓과 remote API를 위한 바인딩 주소 동시 설정해야함

dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375

 

-H로 remote API를 사용하려면 cURL 같은 http 요청 도구 사용

ex) 195.168.99.100인 도커 호스트에서 -H로 remote API를 허용했다면 다른 호스트에서 remote API 사용 가능

dockerd -H tcp://192.168.99.100:2375
curl 168.99.100:2375/version --silent | python -m json.tool

 

2.5.3.2 도커 데몬에 보안 적용: --tlsverify

remote API를 위해 바인딩된 IP주소와 포트번호만 알면 도커를 제어할 수 있기 때문에 도커 보안이 필요하다.

 

 

보안 적용 시 필요한 파일

  1. ca.pem
  2. server-cert.pem
  3. server-key.pem
  4. cert.pem
  5. key.pem

 

도커 데몬에 TLS 보안 적용 프로세스

1. 서버측 파일 생성

  1. 인증서에 사용될 키 생성
  2. 공용키(public key) 생성
  3. 서버 측에서 사용될 키 생성
  4. 서버측에서 사용될 인증서를 위한 인증 요청서 파일 생성
  5. 접속에 사용될 IP 주소를 extfile.cnf 파일로 저장
  6. 서버측 인증서 파일 생성

2. 클라이언트 측에서 사용할 파일 생성

  1. 클라이언트 측의 키파일과 인증 요청 파일 생성 -> extfile.cnf 파일에 extendedKeyUsage 항목 추가
  2. 클라이언트측 인증서 생성
  3. ca.pem, server-cert.pem, server-key.pem, cert.pem, key.pem 파일이 생성되었는지 확인
  4. 생성된 파일의 쓰기권한을 삭제하고 읽기 전용 파일로 만듦
  5. 도커데몬의 설정파일이 존재하는 디렉터리 ~/.docker 로 도커 데몬 측에서 필요한 파일 옮김 (필수는 아니지만 관리가 쉬움)

3. TLS (암호화)가 적용된 도커 데몬 실행

--tlsverify: TLS 보안 적용 활성화

--tlxcacert, --tlscert, --tlxkey: 각각 보안을 적용하는 데 필요한 파일 위치 입력

 

* Remote API 사용 시 보안 적용 안됐을 경우 2375번 포트 / 보안 적용 됐을 경우 2376번 포트 사용

 

DOCKER_CERT_PATH: 도커 데몬 인증에 필요한 파일의 위치

DOCKER_TLS_VERIFY: TLS 인증을 사용할지 설정

 

* 셀의 환경변수는 종료되면 초기화되므로 ~./bashrc등의 파일에 export를 추가해 설정 가능

 

2.5.3.3 도커 스토리지 드라이버 변경: --storage-driver

- 도커는 특정 스토리지 백엔드 기술을 사용해 도커 컨테이너와 이미지를 저장하고 관리

- 환경에 따라 스토리지 드라이버가 자동으로 정해짐 ex) 우분투 - overlay2 / CentOS - deviceampper

 

도커 지원하는 스토리지 드라이버

- OverlayFS, AUFS, Btrfs, Devicemapper, VFS, ZFS 등

 

도커 스토리지 확인

docker info | grep "Storage Driver"

 

도커 스토리지 드라이버 선택

dockerd --storage-driver=devicemapper

 

스토리지 선택 가이드

개발 환경에 따라 어떤 스토리지 드라이버를 사용할지 선택

- 레드햇 계열 운영체제 -> OverlayFS

- 안전성 우선 애플리케이션 -> Btrfs

 

스토리지 드라이버 원리

1) CoW (Copy-on-Write)

: 스냅숏의 파일에 쓰기 작업을 수행할 때 스냅숏 공간에 원본 파일을 복사한 뒤 쓰기 요청 반영

- 이 과정에서 복사를 위해 파일 읽는 작업한번, 파일을 스냅숏 공간에 쓰고 변경된 사항을 쓰는 작업 -> 총 2번의 쓰기작업으로 오버헤드 발생

2) RoW(Redirect-on-Write)

: 파일을 스냅숏 공간에 복사지 않고 스냅숏 기록된 원본 파일은 스냅숏 파일로 묶은 뒤 변경 사항을 새로운 장소에 할당받아 덮어씌움 -> 총 1번의 쓰기 작업

 

* 스냅숏: 원본 파일은 읽기 전용으로 사용하되 이 파일이 변경되면 새로운 공간을 할당한다

* CoW, RoW 자세히 알필요 없음, 스냅숏 개념으로 스냅숏 파일을 불변 상태로 유지할 수 있다는 점만 알기

 

AUFS 드라이버

: 데비안 계열에서 기본으로 사용 가능 한 드라이버

- 대다수 사람들이 사용하는 드라이버로 안정성 우수

- 커널에 포함돼 있지 않으므로 일부 운영체제에서는 사용 불가 ex) RHEL, CentOS

- 컨테이너의 실행, 삭제 등의 작업이 빨라서 PaaS에 적합

 

AUFS 드라이버 사용하기

DOCKER_OPTS="--storage-driver=aufs"

AUFS 드라이버 사용가능한지 확인하기

grep aufs /proc/filesystems

 

Devicemapper 드라이버

: 레드햇 계열의 리눅스 배포판을 위해 개발된 스토리지 드라이버

- 대부분의 리눅스 배포판에서 사용 가능 ex) CentOS

- 성능상의 이유로 사용 권장하지 않음 -> overlay 스토리지 드라이버 사용을 권장

 

OverlayFS 드라이버

: 레드햇 계열 및 라즈비안, 우분트 등 대부분의 운영체제에서 도커를 설치하면 자동으로 사용 설정되는 드라이버

- AUFS와 원리는 비슷하지만 좀 더 간단한 구조, 성능도 더 좋음 -> 최신 버전 도커는 OverlayFS 사용

 

Btrfs 드라이브

: 리눅스 파일시스템중 하나로 다양한 기능 제공

- 파일시스템을 별도로 구성하지 않으면 도커에서 사용 불가

- 리눅스 커널에 포함돼있어서 대부분의 리눅스 배포판에서 사용 가능

 

ZFS 드라이버

: 다양한 기능 제공하지만 라이선스 문제로 커널에 기본적으로 탑재되지 않아서 별도의 설치 필요

- 메모리를 상당히 소모하는 파일시스템 -> 도커에서 많은 수의 컨테이너를 동시에 사용한다면 호스트의 자원 사용량 수시로 확인 필요

 

2.5.4 도커 데몬 모니터링

 

도커 데몬 디버그 모드

: 도커 데몬에서 명령어 로그 확인

dockerd -D

 

도커를 서비스로서 구동했을 때는 로그 파일에서 확인 가능

ex) 우분투 14.04 - docker.log / 우분투 16.04, CentOS - journalctl -u docker 명령어 

 

events

: 도커 데몬이 수행한 명령어를 실시간으로 확인

docker events
docker system events

 

--filter 'type=..' : 특정 항목에 대한 출력 결과만

docker ecents --filter 'type=image'

image 는 docker pull, push 등 이미지에 관련된 명령어만 출력

 

ex) ubuntu 이미지 pull 후 로그 확인

docker pull ubuntu:14.04
docker events

 

 

stats

: 실행중인 모든 컨테이너의 자원 사용량을 스트림으로 출력

docker stats

--no-stream: 한번만 출력

 

 

system df

: 도커에서 사용하는 이미지, 컨테이너, 볼륨 총 개수 및 크기, 삭제함으로써 확보 가능한 공간 출력

docker system df

 

CAdvisor

: 구글이 만든 컨테이너 모니터링 도구

 

 

2.5.5 Remote API 라이브러리를 이용한 도커 사용

 

만들어 놓은 라이브러리 이용 가능

docs.docker.com/engine/api/sdks

 

728x90
반응형

댓글