Learn Docker and Devops from Udemy course
Docker技術入門與實戰 https://www.udemy.com/docker-china
- docker
- docker-machine
- virtualbox
- vagrant
- Docker Compose
- Docker Swarm
install ubuntu 14.04 and docker
> install virtualbox (https://www.virtualbox.org/wiki/Downloads)
> install vagrant (https://www.vagrantup.com/downloads.html)
> vagrant init ubuntu/trusty64
> vagrant up
> vagrant status
> vagrant ssh default
> install docker in ubuntu 14.04 vm (https://docs.docker.com/engine/installation/linux/ubuntu/#install-from-a-package)
> sudo docker run hello-world
install docker on macOS
> install docker (https://store.docker.com/editions/community/docker-ce-desktop-mac)
using docker-machine on macOS
> docker-machine ls
> docker-machine create demo
> docker-machine ssh demo
> docker-machine env demo
> docker-machine stop demo
> docker-machine rm demo
using docker command pull and delete images
> docker pull ubuntu
> docker images
> docker pull ubuntu:16.04
> docker image rm ubuntu:16.04
build docker image using Dockerfile and push to docker hub
> cd flask-hello-world
> docker build -t smalltides/python-flask-demo:1.0 .
> docker login (when first push)
> docker push smalltides/python-flask-demo:1.0
> docker pull smalltides/python-flask-demo:1.0
new version docker command style
> docker image ls
> docker image pull
> docker image rm
> docker container ls
using docker command to manage container
> docker image pull busybox
> docker container create busybox
> docker container ls (for running)
> docker container ls -a (for all)
> docker container start b7dc003fda3f (container id)
> docker container rm b7dc003fda3f (container id)
> docker container create busybox sh -c "while true; do sleep 3600; done"
> docker container start 5863d34351c4 (container id)
> docker container stop 5863d34351c4 (container id)
> docker container create --name demo busybox sh -c "while true; do sleep 3600; done" (--name for named container)
> docker container run -d --name demo busybox sh -c "while true; do sleep 3600; done" (-d for background running)
add now user to docker group
> sudo groupadd docker
> sudo gpasswd -a ${USER} docker
> sudo service docker restart
> exit
> vagrant ssh default
manage multi image and container command
> docker container ls -a
> docker container ls -aq
> docker container ls -f status=exited | awk '{print$1}' | awk 'NR>1' | xargs docker container rm (filter status=exited)
> docker container start $(docker container ls -q -f status=created) (start all created status containers)
> docker image ls -q
> docker image rm $(docker image ls -q)
manage linux network name space and create peer pair
> sudo ip netns list
> sudo ip netns add blue
> sudo ip netns delete blue
> sudo ip netns exec blue ip a
> sudo ip netns exec blue ip link set dev lo up (up loopback)
> sudo ip link add blue-veth-a type veth peer name blue-veth-b
> sudo ip link set blue-veth-b netns blue
> sudo ip netns exec blue ip link
> sudo ip addr add 192.168.1.1/24 dev blue-veth-a
> sudo ip netns exec blue ip addr add 192.168.1.2/24 dev blue-veth-b
> sudo ip netns exec blue ip link set dev blue-veth-b up
> sudo ip link set dev blue-veth-a up
docker bridge network
> docker network ls
> brctl show
> docker network inspect 37e137f568dc (network id)
> exit
> vagrant ssh default
> docker run -d --name test1 busybox sh -c "while true; do sleep 2000; done"
> ip link (now docker0 state up)
> docker container inspect test1
> docker exec -it test1 sh
> ip a
> exit
> ping 172.17.0.2 (ping test1 container ip)
> docker run -d --name test2 busybox sh -c "while true; do sleep 2000; done"
> docker container inspect test2
> ping 172.17.0.3 (ping test2 container ip)
> sudo iptables --list -t nat
Container Name Link
> docker container stop test2
> docker container rm test2
> docker run -d --name test2 --link test1 busybox sh -c "while true; do sleep 2000; done"
> docker exec -it test2 sh
> ping test1 (ping container name)
create and use docker bridge
> docker network list
> docker network inspect bridge
> brctl show
> docker network create -d bridge my-bridge
> docker network list
> docker network inspect my-bridge
> docker run -d --name test2 --network my-bridge busybox sh -c "while true; do sleep 2000; done"
> docker network connect my-bridge test1
> docker network inspect my-bridge
> docker container exec test1 ip a
> docker run -d --name test3 --network my-bridge busybox sh -c "while true; do sleep 2000; done"
> docker container exec test3 ping test1
Container Port Mapping
> docker image pull nginx
> docker run -d --name ng1 nginx
> docker container inspect ng1
> docker run -d --name web -p 80:80 nginx
> docker container list -a
> curl 127.0.0.1
Docker host network
> docker network ls
> ip a
> docker container stop web
> docker container rm web
> docker run -d --name web nginx
> curl 127.0.0.1
> docker container stop web
> docker container rm web
> docker run -d --name web --network host nginx
> docker network inspect host
> curl 127.0.0.1
Dockerize a python flask web app
> docker run -d --name redis redis
> cd flask-redis
> docker build -t smalltides/python-redis:latest .
> docker run -d --name web --link redis -p 5000:5000 smalltides/python-redis
> curl 127.0.0.1:5000
> docker push smalltides/python-redis:latest
create two docker host using vagarant
> cd multi-node-vagrant
> vagrant up
> vagrant status (see docker-node1 and docker-node2)
> vagrant ssh docker-node1
> sudo gpasswd -a ${USER} docker (Adding user ubuntu to group docker)
> vagrant ssh docker-node2
> sudo gpasswd -a ${USER} docker (Adding user ubuntu to group docker)
Multi-Host Network with ectd
> (http://docker-k8s-lab.readthedocs.io/en/latest/docker/docker-etcd.html)
> vagrant ssh docker-node1
> wget https://github.com/coreos/etcd/releases/download/v3.0.12/etcd-v3.0.12-linux-amd64.tar.gz
> tar zxvf etcd-v3.0.12-linux-amd64.tar.gz
> cd etcd-v3.0.12-linux-amd64
> nohup ./etcd --name docker-node1 --initial-advertise-peer-urls http://192.168.205.10:2380 \
--listen-peer-urls http://192.168.205.10:2380 \
--listen-client-urls http://192.168.205.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.205.10:2379 \
--initial-cluster-token etcd-cluster \
--initial-cluster docker-node1=http://192.168.205.10:2380,docker-node2=http://192.168.205.11:2380 \
--initial-cluster-state new&
> vagrant ssh docker-node2
> wget https://github.com/coreos/etcd/releases/download/v3.0.12/etcd-v3.0.12-linux-amd64.tar.gz
> tar zxvf etcd-v3.0.12-linux-amd64.tar.gz
> cd etcd-v3.0.12-linux-amd64
> nohup ./etcd --name docker-node2 --initial-advertise-peer-urls http://192.168.205.11:2380 \
--listen-peer-urls http://192.168.205.11:2380 \
--listen-client-urls http://192.168.205.11:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.205.11:2379 \
--initial-cluster-token etcd-cluster \
--initial-cluster docker-node1=http://192.168.205.10:2380,docker-node2=http://192.168.205.11:2380 \
--initial-cluster-state new&
> ./etcdctl cluster-health
> sudo service docker stop (in docker-node1 and docker-node2)
> sudo /usr/bin/docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.205.10:2379 --cluster-advertise=192.168.205.10:2375& (in docker-node1)
> sudo /usr/bin/docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.205.11:2379 --cluster-advertise=192.168.205.11:2375& (in docker-node2)
> docker version (in docker-node1 and docker-node2)
> docker network create -d overlay demo (in docker-node1, but because etcd, the network overlay demo sync to docker-node2)
> docker network ls (in docker-node1 and docker-node2)
> ./etcdctl ls /docker (in docker-node1 and docker-node2)
> ./etcdctl ls /docker/nodes (in docker-node1 and docker-node2)
> docker run -d --name test1 --net demo busybox sh -c "while true; do sleep 3600; done" (in docker-node1)
> docker run -d --name test2 --net demo busybox sh -c "while true; do sleep 3600; done" (in docker-node2)
> docker exec -it test1 ifconfig (10.0.0.2)
> docker exec -it test2 ifconfig (10.0.0.3)
> docker exec -it test2 ping 10.0.0.2 (in docker-node2)
Multi-Host Networking Overlay with Flannel
> (http://docker-k8s-lab.readthedocs.io/en/latest/docker/docker-flannel.html)
Use Docker Compose to deploy Python Flask Redis Application
> vagrant init ubuntu/trusty64
> vagrant up
> vagrant status
> vagrant ssh default
> install docker in ubuntu 14.04 vm (https://docs.docker.com/engine/installation/linux/ubuntu/#install-from-a-package)
> curl -L https://github.com/docker/compose/releases/download/1.13.0/docker-compose-`uname -s`-`uname -m` > ./docker-compose (install docker-compose v1.13.0)
> chmod +x docker-compose (change permission to executable)
> sudo cp docker-compose /usr/local/bin/docker-compose
> cd docker-compose-flask-redis
> sudo docker-compose build
> sudo docker image list
> sudo docker-compose up
> sudo docker-compose up -d (backound run)
> sudo docker-compose stop
Use Docker Compose to Scaling and LoadBlancing
> cd docker-compose-lb-scaling
> sudo docker-compose build
> sudo docker-compose up -d (backound run)
> sudo docker container ls
> curl 127.0.0.1
> docker-compose scale -h
> sudo docker-compose scale web=3
Use Docker Compose to deploy a complex voting app
> (https://github.com/udemy-course/example-voting-app)
> git clone [email protected]:udemy-course/example-voting-app.git
> cd example-voting-app
> sudo docker-compose build
> sudo docker-compose up -d (backound run)
> sudo docker container ls
create three docker host using vagarant
> cd swarm-node-vagrant
> vagrant up
> vagrant status (see master, work1 and work2)
>
create three swarm docker host using docker-machine
> docker-machine create swarm-manager
> docker-machine create swarm-worker1
> docker-machine create swarm-worker2
> docker-machine ls
> docker-machine env swarm-manager
> docker-machine ssh swarm-manager
> docker swarm init --advertise-addr=192.168.99.100
> docker node ls
> docker-machine ssh swarm-worker1
> docker swarm join --token SWMTKN-1-0kg0b56j2xqitx3xh1uiv9sdvgvp97gr9736ubeaa28dq2qoet-21r255staeyu98v5xnxawxunr 192.168.99.100:2377
> docker-machine ssh swarm-worker2
> docker swarm join --token SWMTKN-1-0kg0b56j2xqitx3xh1uiv9sdvgvp97gr9736ubeaa28dq2qoet-21r255staeyu98v5xnxawxunr 192.168.99.100:2377
> docker-machine ssh swarm-manager
> docker node ls
Docker Swarm Node and Create Services
> docker-machine ssh swarm-manager
> docker service create --name web -d -p 80:80 nginx (run on swarm-manager)
> docker container ls
> docker service ls
> docker service ps web
> docker service create --name web1 -d -p 81:80 nginx (run on swarm-worker1)
> docker service ps web
Docker Swarm Load Balancing and Scaling
> docker service create --name helloworld -d -p 80:8000/tcp jwilder/whoami
> curl 127.0.0.1
> docker service ls
> docker service ps helloworld
> docker service scale helloworld=3
> docker service ls
> docker service ps helloworld
> docker service scale helloworld=5
> docker service ps helloworld
> curl 127.0.0.1 (every time return different ID)
> docker service scale helloworld=3
> docker service ps helloworld
> docker service rm helloworld
> docker service ls
Deploy App with docker-compose v3 in Docker Swarm
> cd docker-compose-flask-redis
> docker stack deploy -c docker-compose-v3.yml flask-redis
> docker service ls
> service ps flask-redis_redis
> service ps flask-redis_web
> curl 127.0.0.1
> docker stack ls
> docker stack ps flask-redis
> docker stack rm flask-redis
> docker stack ls
> docker service ls
Docker Python SDK
> (https://github.com/docker/docker-py)
> pip install docker