Docker Guides and memo

to do list

Develop with Docker

Run your app in production

Docker Guides

Docker 문서에서 guides 기준으로 봐야 할 문서를 정리함. 

https://docs.docker.com/


https://docs.docker.com/engine/installation/ 설치부분으로  Ubuntu 에 설치해 보았음

설치 후 non-root user 로 관리하기, 부팅시 docker 시작하기, Troubleshooting 은 https://docs.docker.com/engine/installation/linux/linux-postinstall/

Docker for AWS  등의 문서가 있지만 이런 것은 필요한 경우가 생기면 보면 될 것임. Docker for AWS 는 CloudFormation  이용해서 자동으로 배포하는 것등을 포함한 거 같다. 

Docker 사용에 대한 기초적인 튜토리얼임. 

 Get started with Docker : https://docs.docker.com/get-started/

  • docker container 만들기, docker compose  를 이용해서 service  설정하기, swarm 이용해서 여러 대의 머신에 서비스 배포하기, stack 이해하기, docker cloud 활용하기.
  • docker cloud 의 경우 docker 회사에서 제공하는 서비스로 registry service, host 관리, swarm 관리, node,service,app 관리를 할 수 있는 프로그램임. AWS등이 아닌 자신의 로컬 시스템에서도 이용가능하다고 나와있는데 테스팅을 해보지는 않았음.

Network containers :  docker 의 network 간단히 설명을 하고 있음. 별도의 네트워크 만들어 분리하는 것 간단한 실습을 함.

Docker overview : Docker 개괄적인 설명.

Docker 기반의 앱플 개발할 때 알아두어야 하는 내용

SDK, API로 개발을 할때 알아두어야 하는 내용

Docker container networking

  • default bridge network
  • User defined networks : bridge, docker_gwbridge, overlay, MACVLAN, custom network plugin, Embedded DNS server
  • 서비스용 port 설정(Expose, publishing) 

Work with network commands

  • network 생성시 --subnet 옵션을 사용할 것을 추천하고 있다. 그렇지 않으면 docker daemon에서 자동으로 서브넷을 선택하므로 docker 에서 관리하지 않는 인프라스트럭쳐의 서브넷과 겹칠 가능성이 있다.

Manage swarm service networks

Multi-host networking with standalone swarms : standalone swarm을 사용할 일이 없어서 skip. standalone swarm 을 사용할 경우에는 네트워크 정보를 저장할 외부 key-value store가 필요하다.

Get started with Macvlan network driver : Macvlan is a new twist on the tried and true network virtualization technique. 아직은 잘 모르겠는데 여러 가지 장점이 있나 보다.

Docker swarm mode overlay network security model : The swarm nodes exchange overlay network information using a gossip protocol. swarm node 간에 통신을 암호화해서 처리함. 

Embedded DNS server in user-defined networks

Legacy container links :  기존 docker link에 대한 설명으로 향후 없어질 기능임. 그러므로 docker 에서 user-defined networks을 구성해야 사용할 것을 권장함.


https://success.docker.com/article/Docker_Reference_Architecture-_Designing_Scalable,_Portable_Docker_Container_Networks

Docker Native Network Drivers

The Docker native network drivers are part of Docker Engine and don't require any extra modules. They are invoked and used through standard docker network commands. The following native network drivers exist.

DriverDescription
HostWith the host driver, a container uses the networking stack of the host. There is no namespace separation, and all interfaces on the host can be used directly by the container
BridgeThe bridge driver creates a Linux bridge on the host that is managed by Docker. By default containers on a bridge can communicate with each other. External access to containers can also be configured through the bridge driver
OverlayThe overlay driver creates an overlay network that supports multi-host networks out of the box. It uses a combination of local Linux bridges and VXLAN to overlay container-to-container communications over physical network infrastructure
MACVLANThe macvlan driver uses the MACVLAN bridge mode to establish a connection between container interfaces and a parent host interface (or sub-interfaces). It can be used to provide IP addresses to containers that are routable on the physical network. Additionally VLANs can be trunked to the macvlan driver to enforce Layer 2 container segmentation
NoneThe none driver gives a container its own networking stack and network namespace but does not configure interfaces inside the container. Without additional configuration, the container is completely isolated from the host networking stack

https://docs.docker.com/engine/admin/volumes/

세가지 방식이 지원이 됨. 일반적인 경우에 Volumes를 사용할 것을 추천하고 있음.

  • Volumes :  Docker 에서 관리하는 host filesystem에 저장이 됨. driver 에 따라 클라우드 등 원격에 있는 것을 이용할 수 있음
    • 여러 대의 host 에서 해당 볼륨을 공유해서 사용할 수 있는가?
  • Bind mounts :  host system 에서 관리. docker process 가 아니라도 파일 변경할 수 있음.
  • tmpfs mounts :  host systems의 메모리에 저장하며 파일시스템에 저장을 하지 않음

Volumes driver https://docs.docker.com/engine/admin/volumes/volumes/#use-a-volume-driver

  • volume driver 간단한 설명이 있음. 일부 volume driver는 local volume driver가 아닌  스토리지 공유 기능을 지원함. (Cloudstor plugin 를 이용하면 된다고 함)
  • vieux/sshfs plugin 으로 공유 스토리지 설명을 하고 있는데 테스팅을 했을 때 잘 안되었음.

Docker  설치하고  Getting started guides 연습을 마친 경우 보아야 하는 문서임.

어떻게 app를 개발하고 디자인할지, 애플리케이션 데이터는 어떻게 저장을 할 것인지, 어떻게 애플리케이션을 확장가능하고 안전하며 robust하게 프로덕션 환경을 꾸밀지 설명을 하고 있음.

Configure and troubleshoot the Docker daemon

  • 대몬 수동으로 실행하기, 설정 옵션 수동으로 주기. 디버깅 모드. 설정은 daemon.json 에 넣는 것을 추천함. 
  • 문제 처리하기 : Out of Memory Exceptions, logs 읽기, 디버깅 활성화, Force a stack trace to be logged(실행해 보았지만 어떤 도움이 되는지는 모르겠다)

Collect Docker metrics with Prometheus

  • prometheus로 docker metric 수집하는 내용임.
  • 테스팅을 해 보았는데 http://myvm1:9090/targets 에서 http://localhost:9323/metrics 부분은 connection refused로 나왔음. 추가로 확인해보지는 않았음.
  • prometheus의 metric은 확인을 해 보았지만 자세한 내용은 prometheus 문서를 봐야 할 것임.

Start containers automatically

  • 컨테이너가 exit 했을 때 또는 docker  재시작시 docker 자동시작하는 정책 설정이 가능함. live restore 옵션과는 다르다.

Limit a container's resources

  • swap limit는 grub 옵션을 변경해야 함. memory, cpu 리소스 사용 제한하기

Docker object labels (Apply custom metadata)

  • images, containers, swarm nodes, swarm services 등에 metadata  적용 가능함. 예) node label 을 이용하여 특정 서비스를 특정 노드에서만 실행하도록 함.

Prune unused Docker objects

  • 사용하지 않는 docker 리소스 삭제 기능. docker는 명시적으로 지정하지 않으면 이미지 등 사용하지 않는 object를 삭제하지 않는 보수적인 접근법을 쓴다. 

Keep containers alive during daemon downtime

  • live restore option은 docker upgrade  를 하는 동안에서 컨테이너를 유지하는 기능임.  swarm mode 에서는 지원하지 않는다. 

Control and configure Docker with systemd

  • docker daemon  옵션 설정하는 방법은 여러 가지가  있지만  이 문서에서는 플랫폼에 비의존적인 /etc/docker/daemon.json 을 추천함.
  • HTTP/HTTPS proxy 는 어떤 경우에 사용을 하는지 아직은 잘 모르겠다.

Format command and log output

  • docker 에서는 Go templates를 이용하여 각 명령과 log drivers의 출력을 조정할 수 있다.
  • 각 명령별로 해당 내용 확인을 해야 함. join, json, lower 등 template functions에 대해서 간략히 예제를 보여주고 있음

Run a local registry mirror(Registry as a pull through cache)

  • docker instance가 많은 경우  인터넷의 공개 docker registry에서 이미지를 다운로드 받는것이 많을 것임. 이경우 로컬 registry mirror를 구성하여 네트워크 트래픽을 줄일 수 있음. Registry 에서 pull through cache로 설정을 하면 된다고 함.

View logs for a container or service

  • docker logs  / docker service logs . docker logs 에서 기본은 STDOUT, STDERR 보여줌. 
  • 어떤 경우 docker logs 는 다음과 같은 과정을 진행하지 않으면 유용한 정보를 보여주지 않을 수 있다.
    • logging driver를 통해서 로그를 파일, 외부 호스트, 데이터베이스 또는 다른 로깅 백엔드에 보낼 수 있다.
    • web/db 서버와 같이 non-interactive process 로 실행하는 이미지의 경우 애플리케이션은 아웃풋을 STDOUT, STDERR가 아니라 로그 파일로 전송한다. → official nginx image 의 경우  access.log를 /dev/stdout , error.log를 /dev/stderr로 심볼릭링크로 생성해서 처리하고 있다. official Apache httpd도 동일한 방식으로 처리를 한다. See the Dockerfile. 

Configure logging drivers

  • Docker daemon 기본 logging driver는  json-file이다. 각 logging driver에 따라서 log-opts를 통해 세부 설정 할 수 있음.
  • container 를 시작할 때 logging driver를 지정할 수 있다. logging drivers와 함께 환경 변수나 lables를 설정할 수도 있다. container 에서 labels 를 설정해서 어떻게 활용을 하는지는 문서만 봐서는 잘 모르겠다.
  • 지원하는 logging drivers : none, json-file(default), syslog, journald, gelf, fluentd, awslogs, splunk, etwlogs(win), gcplogs

Use a logging driver plugin : 필요하면 logging driver plugin을 만들어서 사용할 수 있음.

Log tags for logging driver

  • tag log 옵션은 컨테이너의 로그 메시지를 구별할 수 있는 태그를 어떻게 설정하는지 지정하는 옵션이다. 기본은 컨테이너 아이디의 첫번째 12개 문자만 사용하지만 바꾸어서 사용할 수 있다. 
  • syslog  와 함께 테스팅은 해보았는데 json-file 에서는 tag는 지원이 안된다.

각 logging driver 별로 필요한 부분 있으면 살펴보면 된다.

Docker 보안에 대해서 다루고 있음. 내용을 상세히 읽어보지는 않았고 대략 큰 개념만 보았음.

Docker security 

  • Docker security 를 점검할 때 고려할 주요 4가지 분야는 다음과 같다.
    • the intrinsic security of the kernel and its support for namespaces and cgroups;
    • the attack surface of the Docker daemon itself;
    • loopholes in the container configuration profile, either by default, or when customized by users.
    • the “hardening” security features of the kernel and how they interact with containers.

Protect the Docker daemon socket

  • Docker 기본은 non-networked Unix socket 으로 실행을 한다. HTTP socket 으로 통신을 하도록 설정을 할 수 있다. 네트워크를 통해서 Docker 와 통신을 한다면 TLS를 활성화할 수 있다.
  • 대몬 모드, 클라이언트 모드에서 CA로 사인한 인증서를 이용해서만 접속할 수 있도록 설정을 할 수 있다.

Verify repository client with certificates : Docker registry 와 Docker daemon 간의 통신 암호화하고 인증서를 인증을 하도록 설정

Content trust in Docker : Content trust gives you the ability to verify both the integrity and the publisher of all the data received from a registry over any channel.

Antivirus software and Docker : antivirus 소프트웨어를 이용해 docker 파일을 스캔하는 경우 락이 걸리고 도커 명령에 행이 걸릴 수 있다. 

AppArmor , Seccomp security profile for docker

  • AppArmor (Application Armor) is a Linux security module that protects an operating system and its applications from security threats. 
  • Secure computing mode (seccomp) is a Linux kernel feature. You can use it to restrict the actions available within the container. 

Isolate containers with a user namespace : 컨테이너 내부에서 privilege-escalation attacks 을 막는 가장 좋은 방법은 컨테이너 애플리케이션을 unprivileged user로 실행하는 것임. user를 remap해서 사용


Run your app in production (docker)


PowerShell, Ansible, Puppet 등의 부분은 넘어가도 된다.

Run multiple services in a container : 컨테이너에서 여러 개의 서비스를 실행해야 할 때 스크립트를 이용해 활용하는 팃.

플러그인에 대해서 설명을 하고 있음. 일단 skp 해도 됨.

skip

skip