지난이야기...
컨테이너 -> 컨테이너의 밑바탕이 되는 이미지 -> 이미지를 생성할 수 있는 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주소와 포트번호만 알면 도커를 제어할 수 있기 때문에 도커 보안이 필요하다.
보안 적용 시 필요한 파일
- ca.pem
- server-cert.pem
- server-key.pem
- cert.pem
- key.pem
도커 데몬에 TLS 보안 적용 프로세스
1. 서버측 파일 생성
- 인증서에 사용될 키 생성
- 공용키(public key) 생성
- 서버 측에서 사용될 키 생성
- 서버측에서 사용될 인증서를 위한 인증 요청서 파일 생성
- 접속에 사용될 IP 주소를 extfile.cnf 파일로 저장
- 서버측 인증서 파일 생성
2. 클라이언트 측에서 사용할 파일 생성
- 클라이언트 측의 키파일과 인증 요청 파일 생성 -> extfile.cnf 파일에 extendedKeyUsage 항목 추가
- 클라이언트측 인증서 생성
- ca.pem, server-cert.pem, server-key.pem, cert.pem, key.pem 파일이 생성되었는지 확인
- 생성된 파일의 쓰기권한을 삭제하고 읽기 전용 파일로 만듦
- 도커데몬의 설정파일이 존재하는 디렉터리 ~/.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
'도커&쿠버네티스' 카테고리의 다른 글
[도커/쿠버네티스] 4장 도커 컴포즈 (0) | 2022.01.25 |
---|---|
[도커/쿠버네티스] 3장 도커 스웜 (0) | 2022.01.18 |
[도커/쿠버네티스] 2.3~2.4장 도커 이미지, 도커 파일(Dockerfile) (0) | 2022.01.05 |
[도커/쿠버네티스] 2.1~2.2장 도커엔진 - 이미지와 컨테이너 (0) | 2021.12.28 |
도커란? - 도커를 시작해야하는 이유 / MA MSA / Window환경 도커 설치 (0) | 2021.12.20 |
댓글