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
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.
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