docker官方入門實戰

1.orientation

zhong@slave2:~$ docker -v
Docker version 18.09.5, build e8ff056
zhong@slave2:~$ nvidia-docker -v
Docker version 18.09.5, build e8ff056

2.containers

zhong@slave2:~/pycharmProj$ mkdir testdoc
zhong@slave2:~/pycharmProj/testdoc$ vi Dockerfile

#use an official Python runtime as a parent image
FROM python:3.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

zhong@slave2:~/pycharmProj/testdoc$ vi requirements.txt
Flask
Redis
zhong@slave2:~/pycharmProj/testdoc$ vi app.py

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

zhong@slave2:~/pycharmProj/testdoc$ sudo docker build --tag=friendlyhello:v0.0.1 .
zhong@slave2:~/pycharmProj/testdoc$ sudo docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
friendlyhello           v0.0.1              c759f7483ecc        19 seconds ago      189MB
zhong@slave2:~/pycharmProj/testdoc$ sudo docker run -p 4000:80 friendlyhello:v0.0.1
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
zhong@slave2:~/pycharmProj/testdoc$ curl http://localhost:4000
zhong@slave2:~/pycharmProj/testdoc$ sudo docker run -d -p 4000:80 friendlyhello:v0.0.1
647a7a502469f694a124e072a4e8c9f8e13da6ed47804fcacf3cf73e93b40b5f
zhong@slave2:~/pycharmProj/testdoc$ sudo docker login
zhong@slave2:~/pycharmProj/testdoc$ sudo docker tag friendlyhello:v0.0.1 kuochung/get-started:part2
zhong@slave2:~/pycharmProj/testdoc$ sudo docker push kuochung/get-started:part2

3.services(一個發佈的application有多個service(app),一個service對應一個image,但是可以有多個container, 即容器的實例化)

zhong@slave2:~/pycharmProj/testdoc$ sudo pip install docker-compose     
zhong@slave2:~/pycharmProj/testdoc$ vi docker-compose.yml

version: "3"
services:
     web:
        image: kuochung/get-started:part2
        deploy:
          replicas: 5
          resources:
             limits:
                cpus: "0.1"
                memory: 50M
          restart_policy:
             condition: on-failure
        ports:
         - "4000:80"
        networks:
         - webnet
networks:
     webnet:

zhong@slave2:~/pycharmProj/testdoc$ sudo docker swarm init
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces (xxx.xx.x.xx on eno1 and xxx.xx.x.xxx on rename3) - specify one with --advertise-addr

zhong@slave2:~/pycharmProj/testdoc$ sudo docker swarm init --advertise-addr xxx.xx.xxx.xx
Swarm initialized: current node (xwt00fajygdg0c19yx54i0a9u) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-2wm0yt9lao3ihynmpn2vjmp3938dbokr8vx8iapkri8ivmanin-6nysq6e510b09myqiai6j3rhe xxx.xx.xxx.xx:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

zhong@slave2:~/pycharmProj/testdoc$ sudo docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web
zhong@slave2:~/pycharmProj/testdoc$ sudo docker service ls  # sudo docker stack services getstartedlab
ID                  NAME                MODE                REPLICAS            IMAGE                        PORTS
l7u9bd32nis6        getstartedlab_web   replicated          5/5                 kuochung/get-started:part2   *:4000->80/tcp
zhong@slave2:~/pycharmProj/testdoc$ sudo docker service ps getstartedlab_web
ID                  NAME                  IMAGE                        NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
8ctn9g3xncyh        getstartedlab_web.1   kuochung/get-started:part2   slave2              Running             Running 36 minutes ago                       
oi7acgvqma69        getstartedlab_web.2   kuochung/get-started:part2   slave2              Running             Running 36 minutes ago                       
yi6waxkbktpe        getstartedlab_web.3   kuochung/get-started:part2   slave2              Running             Running 36 minutes ago                       
b3ko2jnova1u        getstartedlab_web.4   kuochung/get-started:part2   slave2              Running             Running 36 minutes ago                       
6dh42sa1oowo        getstartedlab_web.5   kuochung/get-started:part2   slave2              Running             Running 36 minutes ago     
zhong@slave2:~/pycharmProj/testdoc$ sudo docker stack rm getstartedlab
Removing service getstartedlab_web
Removing network getstartedlab_webnet
zhong@slave2:~/pycharmProj/testdoc$ sudo docker swarm leave --force
Node left the swarm.

4.swarms(swarms由多個nodes組成,node可以是virtual machine/physical machine)

zhong@slave2:~/pycharmProj/testdoc$ sudo curl -L https://github.com/docker/machine/releases/download/v0.16.1/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine
[sudo] password for zhong: 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0    612      0 --:--:--  0:00:01 --:--:--   612
100 26.8M  100 26.8M    0     0  27236      0  0:17:15  0:17:15 --:--:-- 37700
zhong@slave2:~/pycharmProj/testdoc$ sudo chmod +x /tmp/docker-machine
zhong@slave2:~/pycharmProj/testdoc$ sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
zhong@slave2:~/pycharmProj/testdoc$ docker-machine version
docker-machine version 0.16.1, build cce350d7
zhong@slave2:~/pycharmProj/testdoc$ sudo docker swarm init --advertise-addr xxx.xx.xxx.xx
zhong@slave2:~/pycharmProj/testdoc$ sudo docker swarm join --token SWMTKN-
1-1lpikwz8u16gspycgkpluvlki8fk9urcvv2xxblz98kunclvbw-dfx6r8unytfkf1bc76tbcjcyj 172.28.171.16:2377
Error response from daemon: This node is already part of a swarm. Use "docker swarm leave" to leave this swarm and join another one.
zhong@slave2:~/pycharmProj/testdoc$ sudo docker-machine create --driver virtualbox myvm1
[sudo] password for zhong: 
Running pre-create checks...
Error with pre-create check: "VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path"
zhong@slave2:~/pycharmProj/testdoc$ sudo apt-get install virtualbox
...
DKMS: install completed.
Setting up virtualbox (5.1.38-dfsg-0ubuntu1.16.04.3) ...
vboxweb.service is a disabled or a static unit, not starting it.
Setting up virtualbox-qt (5.1.38-dfsg-0ubuntu1.16.04.3) ...
Processing triggers for libc-bin (2.23-0ubuntu10) ...
Processing triggers for shim-signed (1.33.1~16.04.1+13-0ubuntu2) ...
Secure Boot not enabled on this system.
Processing triggers for systemd (229-4ubuntu21.4) ...
Processing triggers for ureadahead (0.100.0-19) ...
root@slave2:/home/zhong/.docker/machine/cache# docker-machine create --driver virtualbox myvm1
Creating CA: /root/.docker/machine/certs/ca.pem
Creating client certificate: /root/.docker/machine/certs/cert.pem
Running pre-create checks...
(myvm1) Image cache directory does not exist, creating it at /root/.docker/machine/cache...
(myvm1) No default Boot2Docker ISO found locally, downloading the latest release...
(myvm1) Latest release for github.com/boot2docker/boot2docker is v19.03.1
(myvm1) Downloading /root/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v19.03.1/boot2docker.iso...
(myvm1) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Creating machine...
(myvm1) Copying /root/.docker/machine/cache/boot2docker.iso to /root/.docker/machine/machines/myvm1/boot2docker.iso...
(myvm1) Creating VirtualBox VM...
(myvm1) Creating SSH key...
(myvm1) Starting the VM...
(myvm1) Check network to re-create if needed...
(myvm1) Found a new host-only adapter: "vboxnet0"
(myvm1) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env myvm1
root@slave2:/home/zhong/.docker/machine/cache# docker-machine create --driver virtualbox myvm2
zhong@slave2:~/pycharmProj/testdoc$ sudo docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS
root@slave2:/home/zhong/pycharmProj/testdoc# docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.1   
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v19.03.1 
root@slave2:/home/zhong/pycharmProj/testdoc# docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100"
Swarm initialized: current node (kptudbqoel9ngxqoubgqjpqvd) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-22zdwyy4ebbnlzd1ujct91wubr8e5ofnlltb1v0qoh8uvl4tx2-9mqabpq4w33qwq3tf7t7tvyam 192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
root@slave2:/home/zhong/pycharmProj/testdoc# docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-22zdwyy4ebbnlzd1ujct91wubr8e5ofnlltb1v0qoh8uvl4tx2-9mqabpq4w33qwq3tf7t7tvyam 192.168.99.100:2377"
This node joined a swarm as a worker.
root@slave2:/home/zhong/pycharmProj/testdoc# docker-machine ssh myvm1 "docker node ls"
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
kptudbqoel9ngxqoubgqjpqvd *   myvm1               Ready               Active              Leader              19.03.1
rokcj2hkdf11i4n1wdlbjb670     myvm2               Ready               Active                                  19.03.1
root@slave2:/home/zhong/pycharmProj/testdoc# docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell: 
# eval $(docker-machine env myvm1)
root@slave2:/home/zhong/pycharmProj/testdoc# eval $(docker-machine env myvm1)
root@slave2:/home/zhong/pycharmProj/testdoc# docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
myvm1   *        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.1   
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v19.03.1
root@slave2:/home/zhong/pycharmProj/testdoc# docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web
root@slave2:/home/zhong/pycharmProj/testdoc# docker stack rm getstartedlab  # tear down the stack
root@slave2:/home/zhong/pycharmProj/testdoc# docker-machine ssh myvm2 "docker swarm leave"  # swarm worker
root@slave2:/home/zhong/pycharmProj/testdoc# docker-machine ssh myvm1 "docker swarm leave --force" # manager    	
root@slave2:/home/zhong/pycharmProj/testdoc# docker node ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
root@slave2:/home/zhong/pycharmProj/testdoc# eval $(docker-machine env -u)
root@slave2:/home/zhong/pycharmProj/testdoc# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
867e25x1o3ty2eh25mc7nl43h *   slave2              Ready               Active              Leader              18.09.5
root@slave2:/home/zhong/pycharmProj/testdoc# docker-machine start myvm1
root@slave2:/home/zhong/pycharmProj/testdoc# docker-machine start myvm2

5.stacks

root@slave2:/home/zhong/pycharmProj/testdoc# vi docker-compose.yml

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:	
root@slave2:/home/zhong/pycharmProj/testdoc# docker stack deploy -c docker-compose.yml getstartedlab
yaml: line 18: found character that cannot start any token  # yaml文件中不能有製表符,否則會報錯
root@slave2:/home/zhong/pycharmProj/testdoc# docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web
Creating service getstartedlab_visualizer
root@slave2:/home/zhong/pycharmProj/testdoc# docker stack services getstartedlab
ID                  NAME                       MODE                REPLICAS            IMAGE                             PORTS
71axoqjgfryd        getstartedlab_visualizer   replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
tczrkh9t0h44        getstartedlab_web          replicated          0/5                 kuochung/get-started:part2        *:80->80/tcp
root@slave2:/home/zhong/pycharmProj/testdoc# docker service ps getstartedlab_web
root@slave2:/home/zhong/pycharmProj/testdoc# vi docker-compose.yml
...
redis:
image: redis
ports:
  - "6379:6379"
volumes:
  - "/home/docker/data:/data"
deploy:
  placement:
    constraints: [node.role == manager]
command: redis-server --appendonly yes
networks:
  - webnet
...
root@slave2:/home/zhong/pycharmProj/testdoc# docker-machine ssh myvm1 "mkdir ./data"
root@slave2:/home/zhong/pycharmProj/testdoc# docker stack deploy -c docker-compose.yml getstartedlab
Creating service getstartedlab_redis
Updating service getstartedlab_web (id: tczrkh9t0h443vqnfiuk8nu5m)
image kuochung/get-started:part2 could not be accessed on a registry to record
its digest. Each node will access kuochung/get-started:part2 independently,
possibly leading to different nodes running different
versions of the image.

Updating service getstartedlab_visualizer (id: 71axoqjgfrydomg8mwd00z9w4)
root@slave2:/home/zhong/pycharmProj/testdoc# docker service ls
ID                  NAME                       MODE                REPLICAS            IMAGE                             PORTS
cic6mi7wvw6y        getstartedlab_redis        replicated          0/1                 redis:latest                      *:6379->6379/tcp
71axoqjgfryd        getstartedlab_visualizer   replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
tczrkh9t0h44        getstartedlab_web          replicated          0/5                 kuochung/get-started:part2        *:80->80/tcp
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章