Giter Site home page Giter Site logo

chesterheng / docker-fundamentals Goto Github PK

View Code? Open in Web Editor NEW
2.0 4.0 2.0 671 KB

Docker Fundamentals with Matt Saunders

Home Page: https://skillsmatter.com/courses/740-docker-fundamentals

Dockerfile 14.70% Ruby 3.46% Python 27.79% HTML 33.44% JavaScript 8.70% C 2.97% Shell 3.48% Go 5.46%
docker docker-compose docker-swarm docker-file kubernetes yaml

docker-fundamentals's Introduction

Docker Fundamentals Study Guide 2020

Table of Contents

1 Running & Inspecting Containers

sudo yum install https://storebits.docker.com/ee/centos/sub-2df29a12-742a-461b-893c-9c1aca7aa714/7/x86_64/stable-19.03/Packages/docker-ee-19.03.12-3.el7.x86_64.rpm https://storebits.docker.com/ee/centos/sub-2df29a12-742a-461b-893c-9c1aca7aa714/7/x86_64/stable-19.03/Packages/containerd.io-1.3.4-3.1.el7.x86_64.rpm https://storebits.docker.com/ee/centos/sub-2df29a12-742a-461b-893c-9c1aca7aa714/7/x86_64/stable-19.03/Packages/docker-ee-cli-19.03.12-3.el7.x86_64.rpm

1.1 Start a container

docker container run centos:7 ping 8.8.8.8
docker container run --detach centos:7 ping 8.8.4.4
docker container run --detach --name opendnsping \
  centos:7 ping 208.67.222.222
docker container run --detach --name pinggoogledns centos:7 ping 8.8.8.8

⬆ back to top

1.2 List containers in multiple ways

  • quiet option: only display numeric IDs
docker ps
docker container ls
docker container ls -a
docker container ls --all
docker container ls --all --quiet

⬆ back to top

1.3 Query the docker command line help

docker container rm --help
docker container ls --help

⬆ back to top

1.4 Remove containers

docker container rm <container ID>
docker container rm --force <container ID>
docker container rm --force $(docker container ls --all --quiet)

⬆ back to top

2 Interactive Containers

2.1 Writing to Containers

Container lifecycle

  • run: container is in CREATED state
  • start: container is in UP state
  • stop: container is in EXITED state
docker container run -it centos:7 bash
[root@2b8de2ffdf85 /]# ls -l
[root@2b8de2ffdf85 /]# echo 'Hello there...' > test.txt 
[root@2b8de2ffdf85 /]# ls -l | grep.test.txt

⬆ back to top

2.2 Reconnecting to Containers

  • docker exec: Run a command in a running container
  • docker top: Display the running processes of a container
  • linux ps: Prints a list of currently running processes
docker container ls -a
docker container start <container ID> 
docker container ls
docker container exec <container ID> ps -ef
docker container top <container ID>
docker container exec -it <container ID> bash

⬆ back to top

2.3 List containers using more options and filters

  • no-trunc option: see the entire container ID
  • q: List only the container ID
  • l: List the last container created
  • filter: filter results
docker container ls -a --no-trunc
docker container ls -a -q
docker container ls -l
docker container ls -a --filter "exited=0"
docker container rm -f $(docker container ls -aq)

⬆ back to top

3 Detached Containers and Logging

3.1 Running a Container in the Background

  • detached mode: run as a background process
docker container run centos:7 ping 127.0.0.1 -c 2
docker container run -d centos:7 ping 127.0.0.1
docker container logs <container ID>

⬆ back to top

3.2 Attaching to Container Output

  • attach mode: attach a terminal to a container’s PID 1 output
docker container attach <container ID>
docker container run -d -it centos:7 ping 127.0.0.1

⬆ back to top

3.3 Using Logging Options

  • tail: display to the last n lines
  • f: piped in real time to the terminal
docker container logs --tail 5 <container ID>
docker container logs -f <container ID>

⬆ back to top

4 Starting, Stopping, Inspecting and Deleting Containers

4.1 Starting and Restarting Containers

docker container run -d centos:7 ping 8.8.8.8 docker container ls -l docker container stop docker container ls -a -l docker container start -a docker container kill

⬆ back to top

4.2 Inspecting a Container

docker container start docker container inspect docker container inspect | grep IPAddress docker container inspect | grep Cmd docker container inspect --format='{{.Config.Cmd}}' docker container inspect --format='{{json .Config}}' | jq

⬆ back to top

4.3 Deleting Containers

docker start $(docker container ls -aq)
docker container ls -a
docker container ls -a --filter status=exited
docker container rm <container ID>
docker container ls -a
docker container rm -f <container ID>
docker container rm -f $(docker container ls -aq)

⬆ back to top

5 Interactive Image Creation

5.1 Modifying a Container

docker container run -it centos:7 bash
[root@dfe86ed42be9 /]# yum install -y which wget
[root@dfe86ed42be9 /]# exit
docker container ls -a
docker container diff <container ID>

⬆ back to top

5.2 Capturing Container State as an Image

docker container commit <container ID> myapp:1.0
docker image ls | grep myapp
docker container run -it myapp:1.0 bash
[root@2ecb80c76853 /]# which wget

⬆ back to top

5.3 Further Reading

⬆ back to top

6 Creating Images with Dockerfiles (1/2)

Dockerfile reference

6.1 Writing and Building a Dockerfile

  • RUN executes command(s) in a new layer and creates a new image. E.g., it is often used for installing software packages.

Dockerfile

FROM centos:7

RUN yum update -y
RUN yum install -y wget
docker image build -t myimage .
docker container run -it myimage bash
[root@1d86d4093cce /]# wget example.com
[root@1d86d4093cce /]# cat index.html
[root@1d86d4093cce /]# exit
cat Dockerfile | docker image build -t myimage -f - .

⬆ back to top

6.2 Using the Build Cache

Dockerfile

FROM centos:7

RUN yum update -y
RUN yum install -y wget 
RUN yum install -y vim
docker image build -t myimage .

Dockerfile

FROM centos:7

RUN yum update -y
RUN yum install -y vim 
RUN yum install -y wget
docker image build -t myimage .

⬆ back to top

6.3 Using the history Command

docker image history myimage:latest
docker image build -t myimage .
docker image history myimage:latest
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
e2429c9d83b3        36 hours ago        /bin/sh -c yum install -y wget                  92.2MB              
610de53a1d62        36 hours ago        /bin/sh -c yum install -y vim                   147MB               
8ed3e38b320f        37 hours ago        /bin/sh -c yum update -y                        91.5MB              
7e6257c9f8d8        6 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           6 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           6 weeks ago         /bin/sh -c #(nop) ADD file:61908381d3142ffba…   203MB

Dockerfile

FROM centos:7

RUN yum update -y
RUN yum install -y wget vim
docker image build -t myimage .

⬆ back to top

7 Creating Images with Dockerfiles (2/2)

7.1 Setting Default Commands

  • CMD sets default command and/or parameters, which can be overwritten from command line when docker container runs.
  • ENTRYPOINT configures a container that will run as an executable.

Dockerfile

FROM centos:7

RUN yum update -y
RUN yum install -y wget vim
CMD ["ping", "127.0.0.1", "-c", "5"]
docker image build -t myimage .
docker container run myimage
docker container run myimage echo "hello world"

Dockerfile

FROM centos:7

RUN yum update -y
RUN yum install -y wget vim
ENTRYPOINT ["ping"]
docker image build -t myimage .
docker container run myimage
docker container run myimage 127.0.0.1

⬆ back to top

7.2 Combining Default Commands and Options

Dockerfile

FROM centos:7

RUN yum update -y
RUN yum install -y wget vim
ENTRYPOINT ["ping", "-c", "3"]
CMD ["127.0.0.1"]
docker image build -t myimage .
docker container run myimage
docker container run myimage 8.8.8.8

⬆ back to top

8 Multi-Stage Builds

8.1 Defining a multi-stage build

Dockerfile

FROM alpine:3.5 
RUN apk update && \
  apk add --update alpine-sdk
RUN mkdir /app
WORKDIR /app
COPY hello.c /app
RUN mkdir bin
RUN gcc -Wall hello.c -o bin/hello
CMD /app/bin/hello
docker image build -t my-app-large .
docker image ls | grep my-app-large
docker container run my-app-large

Dockerfile

FROM alpine:3.5 AS build 
RUN apk update && \
  apk add --update alpine-sdk
RUN mkdir /app
WORKDIR /app
COPY hello.c /app
RUN mkdir bin
RUN gcc -Wall hello.c -o bin/hello

FROM alpine:3.5
COPY --from=build /app/bin/hello /app/hello
CMD /app/hello
docker image build -t my-app-small .
docker image ls | grep 'my-app-'
docker container run --rm my-app-small

⬆ back to top

8.2 Building Intermediate Images

docker image build -t my-build-stage --target build .
docker image ls | grep 'my-build-stage'
docker container run -it --rm my-build-stage /app/bin/hello
docker image history my-app-large:latest
docker image history my-app-small:latest
docker image history my-build-stage:latest

my-app-large:latest

5584686e4f85        12 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/app…   0B                  
31a78f507531        12 minutes ago      /bin/sh -c gcc -Wall hello.c -o bin/hello       10.6kB              
5b2111e5495b        12 minutes ago      /bin/sh -c mkdir bin                            0B                  
4faff63a12e7        12 minutes ago      /bin/sh -c #(nop) COPY file:1a97681366e8c1df…   81B                 
6a1e3d0606e6        12 minutes ago      /bin/sh -c #(nop) WORKDIR /app                  0B                  
d3cc5ab9096e        12 minutes ago      /bin/sh -c mkdir /app                           0B                  
200fda09a157        12 minutes ago      /bin/sh -c apk update &&   apk add --update …   180MB               
f80194ae2e0c        20 months ago       /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                  
<missing>           20 months ago       /bin/sh -c #(nop) ADD file:84d23bb1bfe03587c…   4MB 

my-app-small:latest

6246fee1a37a        7 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/app…   0B                  
b635ee179c22        7 minutes ago       /bin/sh -c #(nop) COPY file:e1bb5e4622dbf3b5…   10.6kB              
f80194ae2e0c        20 months ago       /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                  
<missing>           20 months ago       /bin/sh -c #(nop) ADD file:84d23bb1bfe03587c…   4MB   

my-build-stage:latest

31a78f507531        16 minutes ago      /bin/sh -c gcc -Wall hello.c -o bin/hello       10.6kB              
5b2111e5495b        16 minutes ago      /bin/sh -c mkdir bin                            0B                  
4faff63a12e7        16 minutes ago      /bin/sh -c #(nop) COPY file:1a97681366e8c1df…   81B                 
6a1e3d0606e6        16 minutes ago      /bin/sh -c #(nop) WORKDIR /app                  0B                  
d3cc5ab9096e        16 minutes ago      /bin/sh -c mkdir /app                           0B                  
200fda09a157        16 minutes ago      /bin/sh -c apk update &&   apk add --update …   180MB               
f80194ae2e0c        20 months ago       /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                  
<missing>           20 months ago       /bin/sh -c #(nop) ADD file:84d23bb1bfe03587c…   4MB   

⬆ back to top

8.3 Optional: Building from Scratch

scratch

Dockerfile

FROM alpine:3.8 AS build
RUN ["apk", "update"]
RUN ["apk", "add", "--update", "alpine-sdk"]
COPY sleep.c /
RUN ["gcc", "-static", "sleep.c", "-o", "sleep"]

FROM scratch
COPY --from=build /sleep /sleep
CMD ["/sleep"]
docker image build -t sleep:scratch .
docker image history sleep:scratch
docker image ls | grep scratch
docker container run --name sleeper -d sleep:scratch
docker container top sleeper
sudo ls /proc/<PID>/root
docker container rm -f sleeper
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
5fac24d124db        16 hours ago        /bin/sh -c #(nop)  CMD ["/sleep"]               0B                  
30098c0de8b3        16 hours ago        /bin/sh -c #(nop) COPY file:de95a23743d7d1df…   128kB

⬆ back to top

8.4 Optional: Enabling BuildKit

FROM alpine:3.8 AS build
RUN ["apk", "update"]
RUN ["apk", "add", "--update", "alpine-sdk"]
COPY sleep.c /
RUN ["gcc", "-static", "sleep.c", "-o", "sleep"]

FROM scratch
COPY --from=build /sleep /sleep
CMD ["/sleep"]

FROM alpine:3.5 AS prod
RUN apk update
COPY --from=build /app/bin/hello /app/hello 
CMD /app/hello
export DOCKER_BUILDKIT=1
docker image build --no-cache -t my-app-small-bk .
export DOCKER_BUILDKIT=0

⬆ back to top

9 Managing Images

9.1 Making an Account on Docker’s Hosted Registry

Docker Hub

⬆ back to top

9.2 Tagging and Listing Images

docker image pull centos:7
docker image tag centos:7 my-centos:dev
docker image ls -a | grep centos

⬆ back to top

9.3 Sharing Images on Docker Hub

docker image push my-centos:dev
docker image tag my-centos:dev <Docker ID>/my-centos:dev
docker image push <Docker ID>/my-centos:dev
docker image build -t <Docker ID>/my-centos:1.0 .
docker image rm my-centos:dev

⬆ back to top

9.4 Further Reading

⬆ back to top

10 Database Volumes

10.1 Launching Postgres

docker image pull postgres:9-alpine
docker image inspect postgres:9-alpine
docker container run --name some-postgres \
  -v db_backing:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=password \
  -d postgres:9-alpine

⬆ back to top

10.2 Writing to the Database

docker container exec -it some-postgres psql -U postgres
postgres=# CREATE TABLE PRODUCTS(PRICE FLOAT, NAME TEXT);
postgres=# INSERT INTO PRODUCTS VALUES('18.95', 'widget');
postgres=# INSERT INTO PRODUCTS VALUES('1.45', 'sprocket');
postgres=# SELECT * FROM PRODUCTS;
postgres=# \q
docker container rm -f some-postgres
docker container run \
  --name some-postgres \
  -v db_backing:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=password \
  -d postgres:9-alpine
docker container exec -it some-postgres psql -U postgres
postgres=# SELECT * FROM PRODUCTS;

⬆ back to top

10.3 Further Reading

⬆ back to top

11 Introduction to Container Networking

Networking features in Docker Desktop for Mac

11.1 Inspecting the Default Bridge

docker network ls
docker network inspect bridge
ip addr
sudo yum install bridge-utils
brctl show docker0
NETWORK ID          NAME                DRIVER              SCOPE
0d909ca6f3fa        bridge              bridge              local
8e90fc700e0f        host                host                local
6690bb85fa2c        none                null                local

⬆ back to top

11.2 Connecting Containers to docker0

docker container run --name u1 -dt centos:7
docker network inspect bridge
ip addr
brctl show docker0
docker container exec -it u1 bash
[root@11da9b7db065 /]# yum install -y iproute
[root@11da9b7db065 /]# ip addr

⬆ back to top

11.3 Defining Additional Bridge Networks

  • u1: 172.17.0.2
docker network create --driver bridge my_bridge
docker container run --name=u2 --network=my_bridge -dt centos:7
docker container inspect u2
docker container run --name=u3 --network=my_bridge -it centos:7
[root@70bedd49293b /]# ping u2
docker container run centos:7 ping u1
docker network inspect bridge
docker container exec u2 ping <u1 IP>
docker container rm -f $(docker container ls -aq)
docker network rm my_bridge

⬆ back to top

12 Container Port Mapping

12.1 Port Mapping at Runtime

docker container run -d nginx
docker container run -d -p 5000:80 nginx
docker container port <container id>

⬆ back to top

12.2 Exposing Ports from the Dockerfile

docker image build -t my_nginx .
docker container run -d -P my_nginx
docker container ls -l
docker container rm -f $(docker container ls -aq)

⬆ back to top

12.3 Further Reading

⬆ back to top

13 Creating a Swarm

Each node is one docker host. Each node can be a manager / work. A Manager coordinate the traffic between all workers. A service is a image. A manager can involve a replica of a service in a worker node through a task. All nodes communicate through the overlay private network.

13.1 Starting Swarm

docker swarm init
docker system info
docker node ls
docker swarm ca --rotate --cert-expiry 168h
sudo netstat -plunt | grep -E "2377|7946|4789"
docker swarm leave -f

⬆ back to top

13.2 Adding Workers to the Swarm

docker swarm join-token worker

⬆ back to top

13.3 Promoting Workers to Managers

docker node promote node-1 node-2
docker run -it -d -p 5000:8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer

⬆ back to top

14 Starting a Service

14.1 Creating an Overlay Network and Service

docker network create --driver overlay my_overlay
docker network inspect my_overlay
docker service create --name pinger \
  --network my_overlay alpine ping 8.8.8.8
docker service ls
docker service ps pinger
docker service update pinger --replicas=3
docker network inspect my_overlay

⬆ back to top

14.2 Inspecting Service Logs

docker service logs pinger

⬆ back to top

14.3 Cleanup

docker service rm $(docker service ls -q)

⬆ back to top

15 Node Failure Recovery

15.1 Setting up a Service

docker service create --replicas 4 --name myProxy nginx
docker service ps myProxy

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
ywsk4x9f0029        myProxy.1           nginx:latest        docker-desktop      Running             Running 27 seconds ago                       
mac3cltf1efr        myProxy.2           nginx:latest        docker-desktop      Running             Running 27 seconds ago                       
lodeq1bxbxwk        myProxy.3           nginx:latest        docker-desktop      Running             Running 27 seconds ago                       
izdjwq6ge3zj        myProxy.4           nginx:latest        docker-desktop      Running             Running 27 seconds ago

⬆ back to top

15.2 Simulating Node Failure

[centos@node-3 ~]$ sudo reboot now

⬆ back to top

15.3 Force Rebalancing

docker service update --force myProxy

⬆ back to top

15.4 Cleanup

docker service rm $(docker service ls -q)

⬆ back to top

16 Swarm Scheduling

16.1 Restricting Resource Consumption

docker service create --name compute-stress \
  --replicas 4 \
  --detach \
  training/stress:3.0 --vm 2
docker stats
docker service rm compute-stress
docker service create --name compute-stress \
  --replicas 4 \
  --limit-cpu 1 \
  --detach \
  training/stress:3.0 --vm 2
docker stats
docker service rm compute-stress
docker service create --name compute-stress \
  --replicas 4 \
  --limit-cpu 1 \
  --limit-memory 512M \
  --detach \
  training/stress:3.0 --vm 2 --vm-bytes 1024M
docker container ls -a
docker container inspect eac5f4c35142 | grep OOM
docker service rm compute-stress
docker service create --name compute-stress \
  --replicas 4 \
  --limit-cpu 1 \
  --limit-memory 512M \
  --reserve-memory 512M \
  --detach \
  training/stress:3.0 --vm 2 --vm-bytes 128M
docker service ps compute-stress
docker service update compute-stress --replicas=40 --detach
docker service ps compute-stress
docker inspect xf3xigecdfw8
docker service rm compute-stress

⬆ back to top

16.2 Configuring Global Scheduling

  • Global services are generally only appropriate for things that perform or monitor things related directly to node management
  • eg. Log shipping or monitoring agents
docker service create --mode global \
  --name my-global \
  centos:7 ping 8.8.8.8
docker service ps my-global
docker service rm my-global

⬆ back to top

16.3 Scheduling via Node Constraints

docker node update --label-add datacenter=east node-0 docker node update --label-add datacenter=east node-1 docker node update --label-add datacenter=west node-2 docker node update --label-add datacenter=west node-3 docker service create --replicas 4
--constraint node.labels.datacenter==east
--name east-deploy
centos:7 ping 8.8.8.8 docker service rm east-deploy docker service create --replicas 4
--constraint node.role==worker
--name worker-only
centos:7 ping 8.8.8.8 docker service rm worker-only

⬆ back to top

16.4 Scheduling Topology-Aware Services

docker service create --name my_proxy
--replicas=2 --publish 8000:80
--placement-pref spread=node.labels.datacenter
nginx docker service ps my_proxy docker service rm my_proxy

⬆ back to top

17 Provisioning Swarm Configuration

17.1 Creating a Stack

docker stack deploy -c mystack.yaml dbdemo
docker stack ls
docker service ls
docker stack rm dbdemo

⬆ back to top

17.2 Defining and Using .env Files

docker stack deploy -c mystack.yaml dbdemo
docker stack ps dbdemo
docker inspect <task ID> | grep ContainerID
docker container inspect <container ID> | grep POSTGRES
docker container exec -it <container ID> psql -U moby -d mydb
mydb=# \du
mydb=# \q

⬆ back to top

17.3 Defining and Using Docker Configs

docker stack deploy -c mystack.yaml dbdemo
docker config ls
docker config inspect --pretty <config ID>
docker container exec -it <container ID> psql -U moby -d mydb
mydb=# \q

⬆ back to top

17.4 Defining and Using Docker Secrets

docker secret create password ./mypassword
rm mypassword
docker secret inspect password

⬆ back to top

18 Routing to Services

18.1 Routing Cluster-Internal Traffic

Internal / Stateless

nano net-demo.yaml
docker stack deploy -c net-demo.yaml netstack
docker stack ps netstack
[centos@node-3 ~]$ docker container ls
[centos@node-3 ~]$ docker container exec -it <container ID> bash
[root@0e3c8b8e8183 /]# curl destination:8000
I'm 00b4c2dc162b (node-1 container ID)
[root@0e3c8b8e8183 /]# curl destination:8000
I'm 6d23fb652e03 (node-2 container ID)
[root@0e3c8b8e8183 /]# curl destination:8000
I'm 8340c6f8fa4a (node-0 container ID)
[root@0e3c8b8e8183 /]# curl destination:8000
I'm 00b4c2dc162b (node-1 container ID)
[root@3047dbb47a7a /]# sudo yum install -y bind-utils
[root@3047dbb47a7a /]# nslookup destination
[root@3047dbb47a7a /]# exit
docker stack rm netstack

ID                  NAME                     IMAGE                    NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
xz3g0dmv6waa        netstack_destination.1   training/whoami:latest   node-0              Running             Running 48 seconds ago                       
izhil4mrnwh0        netstack_origin.1        centos:7                 node-3              Running             Running 50 seconds ago                       
y0aiarrr7zyj        netstack_destination.2   training/whoami:latest   node-1              Running             Running 47 seconds ago                       
c1au2266t9wb        netstack_destination.3   training/whoami:latest   node-2              Running             Running 48 seconds ago

⬆ back to top

18.2 Routing Cluster-External Traffic

External / Stateless

docker stack deploy -c mesh.yaml mesh
curl <any node IP>:8080
docker stack rm mesh

⬆ back to top

19 Updating Applications

19.1 Deploying Dockercoins

git clone -b ee3.0 \
  https://github.com/docker-training/orchestration-workshop.git
cd ~/orchestration-workshop/dockercoins
docker stack deploy -c docker-compose.yml dockercoins

⬆ back to top

19.2 Scaling Up an Application

Modify docker-compose.yml

worker:
  image: training/dockercoins-worker:1.0 networks:
  - dockercoins
  deploy:
    replicas: 2
docker stack deploy -c docker-compose.yml dockercoins
httping -c 5 localhost:8001
httping -c 5 localhost:8002

Modify docker-compose.yml

rng:
  image: training/dockercoins-rng:1.0 networks:
  - dockercoins
  ports:
  - "8001:80"
  deploy:
    mode: global
docker stack rm dockercoins
docker stack deploy -c=docker-compose.yml dockercoins

⬆ back to top

19.3 Creating Rolling Updates

Modify worker.py

def work_once():
  log.debug("Doing one unit of work") time.sleep(0.1)
docker image build -t <Docker ID>/dockercoins-worker:1.1 . 
docker image push <Docker ID>/dockercoins-worker:1.1

Modify docker-compose.yml

worker:
  image: <Docker ID>/dockercoins-worker:1.1
  networks:
  - dockercoins
docker stack deploy -c='docker-compose.yml' dockercoins

⬆ back to top

19.4 Parallelizing Updates

Modify docker-compose.yml

worker:
  image: training/dockercoins-worker:1.0 networks:
  - dockercoins
  deploy:
    replicas: 10
    update_config:
    parallelism: 2
    delay: 5s
docker stack deploy -c='docker-compose.yml' dockercoins
[centos@node-1 ~]$ watch -n1 "docker service ps dockercoins_worker \
  | grep -v Shutdown.*Shutdown"

⬆ back to top

19.5 Auto-Rollback Failed Updates

Modify docker-compose.yml

worker:
  image: training/dockercoins-worker:1.0 
  networks:
  - dockercoins
  deploy:
    replicas: 10
    update_config:
      parallelism: 2
      delay: 5s
      failure_action: rollback
      max_failure_ratio: 0.2
      monitor: 20s
docker stack deploy -c=docker-compose.yml dockercoins
docker image build -t <Docker ID>/dockercoins-worker:bugged . 
docker image push <Docker ID>/dockercoins-worker:bugged

Modify docker-compose.yml

worker:
  image: training/dockercoins-worker:bugged
  networks:
  - dockercoins
  deploy:
    replicas: 10
    update_config:
      parallelism: 2
      delay: 5s
      failure_action: rollback
      max_failure_ratio: 0.2
      monitor: 20s
docker stack rm dockercoins

⬆ back to top

20 Installing Kubernetes

20.1 Initializing Kubernetes

sudo kubeadm init --pod-network-cidr=192.168.0.0/16 \
    --ignore-preflight-errors=SystemVerification
sudo kubeadm token create --print-join-command
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
kubectl apply -f https://bit.ly/2KHCEgO
kubectl get nodes -w
[centos@node-1 ~]$ sudo kubeadm join ... --ignore-preflight-errors=SystemVerification
[centos@node-2 ~]$ sudo kubeadm join ... --ignore-preflight-errors=SystemVerification
kubectl get nodes
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
kubectl get pods -n kube-system
kubectl get po -A

⬆ back to top

21 Kubernetes Orchestration

yaml files

21.1 Creating Pods

kubectl create -f pod.yaml
kubectl get pod demo
kubectl describe pod demo
kubectl delete pod demo
kubectl create -f pod.yaml
kubectl exec -c=sidecar -it demo -- /bin/bash
[root@demo /]# curl localhost:80
[root@demo /]# ps -aux
[root@demo /]# ps -auwx
[root@demo /]# exit
kubectl delete pod demo

⬆ back to top

21.2 Creating ReplicaSets

kubectl create -f replicaset.yaml
kubectl describe replicaset rs-demo
kubectl delete pod <pod name>
kubectl describe replicaset rs-demo
kubectl delete replicaset rs-demo

⬆ back to top

21.3 Creating Deployments

nano deployment.yaml
less deployment.yaml
kubectl create -f deployment.yaml
kubectl describe deployment nginx-deployment
kubectl get replicaSet
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
kubectl get replicaSets
kubectl delete deployment nginx-deployment

⬆ back to top

22 Provisioning Kube Configuration

22.1 Provisioning ConfigMaps

kubectl create configmap dbconfig --from-env-file=env-config
kubectl get configmap dbconfig -o yaml
kubectl create -f postgres.yaml
kubectl describe pod dbdemo
kubectl exec -it -c pg dbdemo -- psql -U moby -d mydb
mydb=# \du
mydb=# \q
kubectl delete -f postgres.yaml
kubectl create configmap dbinit --from-file=db-init.sh
kubectl create -f postgres.yaml
kubectl exec -it -c pg dbdemo -- psql -U moby -d mydb
mydb=# SELECT * FROM products;
mydb=# \q
kubectl delete -f postgres.yaml

⬆ back to top

22.2 Provisioning Secrets

kubectl create -f secret.yaml
kubectl create -f postgres.yaml
kubectl exec -it -c pg dbdemo -- env | grep POSTGRES
kubectl get secret postgres-pwd -o yaml
kubectl delete pod dbdemo
kubectl delete configmap dbconfig
kubectl delete configmap dbinit
kubectl delete secret postgres-pwd

23 Kubernetes Networking

23.1 Routing Traffic with Calico

kubectl create -f deployment.yaml
kubectl get pods
kubectl describe pods <pod name>
ip route
curl <pod IP>:80
[centos@node-2 ~]$ ip route
kubectl logs <pod name>

⬆ back to top

23.2 Routing and Load Balancing with Services

kubectl create -f cluster.yaml
kubectl get services
curl <nginx CLUSTER-IP>:8080
kubectl create -f nodeport.yaml
kubectl describe service nodeport-demo
kubectl delete deployment nginx-deployment
kubectl delete service cluster-demo
kubectl delete service nodeport-demo

⬆ back to top

23.3 Optional: Deploying DockerCoins onto the Kubernetes Cluster

kubectl create deployment redis --image=redis

for DEPLOYMENT in hasher rng webui worker; do 
  kubectl create deployment $DEPLOYMENT \
    --image=training/dockercoins-${DEPLOYMENT}:1.0
done

kubectl get pods -o wide -w
kubectl logs deploy/rng
kubectl logs deploy/worker
kubectl get services
kubectl expose deployment redis --port 6379
kubectl expose deployment rng --port 80
kubectl expose deployment hasher --port 80
kubectl get services
kubectl logs deploy/worker
kubectl expose deploy/webui --type=NodePort --port 80
http://<node IP>:<port>
kubectl scale deploy/worker --replicas=10
kubectl get deploy/rng -o yaml --export > deploy-rng.yaml
kubectl apply -f deploy-rng.yaml
kubectl get daemonset
kubectl delete deploy/rng

for D in redis hasher rng webui; \
  do kubectl delete svc/$D; done

for D in redis hasher webui worker; \
  do kubectl delete deploy/$D; done

kubectl delete ds/rng
kubectl get all

⬆ back to top

24 Cleaning up Docker Resources

docker system df
docker system prune
docker system df
docker container run --label apple --name fuji -d alpine
docker container run --label orange --name clementine -d alpine
docker container ls -a
docker container prune --filter 'label=apple'
docker container ls -a
TIMESTAMP=$(date --rfc-3339=seconds | sed 's/ /T/') 
docker container run --label tomato --name beefsteak -d alpine
docker container prune -f --filter "until=$TIMESTAMP"
docker container ls -a

⬆ back to top

25 Inspection Commands

25.1 Inspecting System Information

docker system info

⬆ back to top

25.2 Monitoring System Events

docker system events
<!-- Open a second connection -->
docker container run --rm alpine echo 'Hello World!'
docker system events --format '--> {{.Type}}-{{.Action}}'
docker system events --format '{{json .}}' | jq

⬆ back to top

26 Plugins

26.1 Installing a Plugin

docker plugin install vieux/sshfs
docker plugin ls
Plugin "vieux/sshfs" is requesting the following privileges:
 - network: [host]
 - mount: [/var/lib/docker/plugins/]
 - mount: []
 - device: [/dev/fuse]
 - capabilities: [CAP_SYS_ADMIN]

⬆ back to top

26.2 Enabling and Disabling a Plugin

docker plugin disable vieux/sshfs
docker plugin ls
docker plugin enable vieux/sshfs
docker plugin ls

⬆ back to top

26.3 Inspecting a Plugin

docker plugin inspect vieux/sshfs
docker plugin disable vieux/sshfs
docker plugin set vieux/sshfs DEBUG=1
docker plugin enable vieux/sshfs
docker plugin inspect vieux/sshfs

⬆ back to top

Using the Plugin

[centos@node-1 ~]$ mkdir ~/demo
docker volume create -d vieux/sshfs \
  -o [email protected]:/home/centos/demo \
  -o password=skills0921 \
  sshvolume

docker volume ls
docker container run --rm -it -v sshvolume:/data alpine sh
docker container exec -it a56cba756409 sh
/ # cd /data
/ # echo 'Hello from client!' > demo.txt / # ls -al
[centos@node-1 ~] cd demo
[centos@node-1 ~] ls

⬆ back to top

26.5 Removing a Plugin

docker volume rm sshvolume
docker plugin disable vieux/sshfs
docker plugin rm vieux/sshfs

⬆ back to top

27 Starting a Compose App

Compose file version 3 reference

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

27.1 Inspecting a Compose App

git clone -b ee3.0 \
    https://github.com/docker-training/orchestration-workshop.git
cd orchestration-workshop/dockercoins

⬆ back to top

27.2 Starting the App

docker-compose up
docker-compose up -d
docker-compose ps

⬆ back to top

27.3 Viewing Logs

docker-compose logs
docker-compose logs --tail 10 --follow

⬆ back to top

28 Scaling a Compose App

28.1 Scaling a Service

docker-compose ps
docker-compose up -d --scale worker=2
docker-compose ps

⬆ back to top

28.2 Investigating Bottlenecks

docker-compose up -d --scale worker=10
docker-compose ps
httping -c 5 localhost:8001
httping -c 5 localhost:8002
docker-compose down

⬆ back to top

docker-fundamentals's People

Contributors

chesterheng avatar

Stargazers

 avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.