Skip to content
Hoonmin Kim edited this page Nov 14, 2015 · 1 revision

XECon2015 - Docker For Operators

주제들

  • About Docker & Linux Container
    • 기본 지식 전달
    • 너무 길지는 않게. 운영자들이 와닿을 수 있는 장점 위주로.
    • Docker As A Tool
    • Docker As A Platform
  • Tutorial based on Docker 1.9
    • networking, swarm, compose, ...
    • 사용법 예제(튜토리얼)는 1.9 버전을 기준으로 한다.
    • networking 부분은 어려울 수 있으니 가능한한 쉽게 풀어준다. (사용법 위주로)
    • compose+swarm+networking이 연동되는 구조를 설명한다.
  • Basic Internals
    • 도커를 사용해봤던 사용자들을 위한 약간의 내부 구조 설명.
    • 도커 파일 시스템 간단 설명(aufs, overlayfs, ...)
    • libnetwork 동작 방식 및 주요 플러그인들
  • Orchestration
    • 현재 많이 사용되고 있는 툴 위주로 설명한다.
    • swarm, kubernetes, openshift 3, panamax

세부 주제

About Docker & Linux Container

$ brew update; brew install Caskroom/cask/dockertoolbox

$ docker run swarm create
d9a8bec868295f81eb28b331c7d8ac8b

$ docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://d9a8bec868295f81eb28b331c7d8ac8b swarm-master

$ docker-machine create -d virtualbox --swarm --swarm-discovery token://d9a8bec868295f81eb28b331c7d8ac8b swarm-node-01

$ eval $(docker-machine env --swarm swarm-master)

$ docker info
Containers: 3
Images: 2
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 2
 swarm-master: 192.168.99.101:2376
  └ Containers: 2
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=4.1.12-boot2docker, operatingsystem=Boot2Docker 1.9.0 (TCL 6.4); master : 16e4a2a - Tue Nov  3 19:49:22 UTC 2015, provider=virtualbox, storagedriver=aufs
 swarm-node-01: 192.168.99.102:2376
  └ Containers: 1
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=4.1.12-boot2docker, operatingsystem=Boot2Docker 1.9.0 (TCL 6.4); master : 16e4a2a - Tue Nov  3 19:49:22 UTC 2015, provider=virtualbox, storagedriver=aufs
CPUs: 2
Total Memory: 2.043 GiB
Name: 4e4df7e6e722

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                     NAMES
41d8b035c87f        swarm:latest        "/swarm join --advert"   2 minutes ago       Up 2 minutes        2375/tcp                                  swarm-node-01/swarm-agent
f43f99ee724a        swarm:latest        "/swarm join --advert"   3 minutes ago       Up 3 minutes        2375/tcp                                  swarm-master/swarm-agent
4e4df7e6e722        swarm:latest        "/swarm manage --tlsv"   3 minutes ago       Up 3 minutes        192.168.99.101:3376->3376/tcp, 2375/tcp   swarm-master/swarm-agent-master

Networking

https://blog.docker.com/2015/11/docker-multi-host-networking-ga/

  • Prepare machines
#!/bin/bash

set -e

# Docker Machine Setup
docker-machine create \
    -d virtualbox \
    consul

docker $(docker-machine config consul) run -d \
    -p "8500:8500" \
    -h "consul" \
    progrium/consul -server -bootstrap

docker-machine create \
    -d virtualbox \
    --virtualbox-disk-size 50000 \
    --swarm \
    --swarm-master \
    --swarm-discovery="consul://$(docker-machine ip consul):8500" \
    --engine-opt="cluster-store=consul://$(docker-machine ip consul):8500" \
    --engine-opt="cluster-advertise=eth1:0" \
    swarm-master

docker-machine create \
    -d virtualbox \
    --virtualbox-disk-size 50000 \
    --swarm \
    --swarm-discovery="consul://$(docker-machine ip consul):8500" \
    --engine-opt="cluster-store=consul://$(docker-machine ip consul):8500" \
    --engine-opt="cluster-advertise=eth1:0" \
    swarm-node-01
  • Overlay
$ docker-machine ls
NAME            ACTIVE   DRIVER       STATE     URL                         SWARM
consul          -        virtualbox   Running   tcp://192.168.99.100:2376   
swarm-master    *        virtualbox   Running   tcp://192.168.99.101:2376   swarm-master (master)
swarm-node-01   -        virtualbox   Running   tcp://192.168.99.102:2376   swarm-master

$ eval $(docker-machine env --swarm swarm-master)
$ docker network ls
NETWORK ID          NAME                   DRIVER
3b009dc4d3ea        swarm-master/bridge    bridge              
0417f40c6b3f        swarm-master/none      null                
a123efc69b60        swarm-master/host      host                
9276217799fe        swarm-node-01/host     host                
c0fa365c5866        swarm-node-01/bridge   bridge              
05c3aa7e6356        swarm-node-01/none     null

$ docker network create -d overlay myapp
2779c94d4375ebd8037062c90dde44e72cc35a93568c7cc893be92ae326cf1f5

$ docker network ls
NETWORK ID          NAME                   DRIVER
2779c94d4375        myapp                  overlay             
a123efc69b60        swarm-master/host      host                
3b009dc4d3ea        swarm-master/bridge    bridge              
0417f40c6b3f        swarm-master/none      null                
c0fa365c5866        swarm-node-01/bridge   bridge              
05c3aa7e6356        swarm-node-01/none     null                
9276217799fe        swarm-node-01/host     host

$ docker run -d --name=web --net=myapp --env="constraint:node==swarm-master" nginx
$ docker run -it --rm --net=myapp --env="constraint:node==swarm-node-01" busybox wget -qO- http://web
  • Compose
$ cat docker-compose.yml 
web:
        image: bfirsh/compose-mongodb-demo
        environment:
                - "MONGO_HOST=xecon2015dockerforoperators_mongo_1"
                - "constraint:node==swarm-node-01"
        ports:
                - "80:5000"
mongo:
        image: mongo

$ docker-compose --x-networking --x-network-driver overlay up -d

$ docker network ls
NETWORK ID          NAME                            DRIVER
9afd19a2d40d        swarm-master/docker_gwbridge    bridge              
9276217799fe        swarm-node-01/host              host                
86c89335a85d        xecon2015dockerforoperators     overlay             
a123efc69b60        swarm-master/host               host                
0417f40c6b3f        swarm-master/none               null                
83c3fc47f6da        swarm-node-01/docker_gwbridge   bridge              
c0fa365c5866        swarm-node-01/bridge            bridge              
05c3aa7e6356        swarm-node-01/none              null                
2779c94d4375        myapp                           overlay             
3b009dc4d3ea        swarm-master/bridge             bridge

$ docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED              STATUS              PORTS                         NAMES
4b2504488855        mongo                         "/entrypoint.sh mongo"   About a minute ago   Up About a minute   27017/tcp                     swarm-node-01/xecon2015dockerforoperators_mongo_1
954225b92f5f        bfirsh/compose-mongodb-demo   "/bin/sh -c 'python a"   About a minute ago   Up About a minute   192.168.99.102:80->5000/tcp   swarm-node-01/xecon2015dockerforoperators_web_1

$ curl http://`docker-machine ip swarm-node-01`
<h1>This page has been visited 1 times!</h1>
  • Network Plugin: Calico
http://www.infoq.com/news/2015/08/project-calico-v1-released
http://www.slideshare.net/packethost/packet-calico-keynote-47122317

$ docker run -d -p 2379:2379 --env="constraint:node==swarm-master" --env="ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379" --env="ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379" --name etcd quay.io/coreos/etcd:v2.2.1

# 모든 장비에서 calico agent 설정
$ docker-machine ssh swarm-master
$ wget https://github.com/projectcalico/calico-docker/releases/download/v0.10.0/calicoctl
$ chmod +x calicoctl
$ sudo ETCD_AUTHORITY=192.168.99.101:2379 ./calicoctl node --libnetwork