一、数据卷
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特
性:
- 数据卷 可以在容器之间共享和重用
- 对 数据卷 的修改会立马生效
对 数据卷 的更新,不会影响镜像,数据卷 默认会一直存在,即使容器被删除
数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂
载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷 。
创建一个数据卷
$ docker volume create my-vol
查看所有的 数据卷
$ docker volume ls
local my-vol
在主机里使用以下命令可以查看指定 数据卷 的信息
$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
启动一个挂载数据卷的容器
[root@18 test]# vim Dockerfile
FROM rhel7
ADD html.tar /usr/share
VOLUME ["/usr/share/nginx/html"]
[root@18 test]# tree nginx/
nginx/
└── html
└── index.html
[root@18 test]# tar -cf html.tar nginx/
[root@18 test]# vim html.tar
[root@18 test]# docker build -t rhel7:v1 .
Sending build context to Docker daemon 16.38 kB
Step 1/3 : FROM rhel7
---> 0a3eb3fde7fd
Step 2/3 : ADD html.tar /usr/share
---> 004a859de6f4
Removing intermediate container 3068abf48972
Step 3/3 : VOLUME /usr/share/nginx/html
---> Running in aa8f81643e8e
---> 21819872d8dd
Removing intermediate container a
[root@18 test]# docker create --name vol rhel7:v1 bash
42047c6b05ce377ba6c40b32a67c48053a6873f4ba7c0d2311a067d8a7b79163
[root@18 test]# docker run -d --name vm1 --volumes-from vol nginx
3905c1f8a444b6348ff590f7e6d27734d8ed72fa46317e6aeb0e09ae634ba659
[root@18 test]# curl 172.17.0.3
<h1>Docker</h1>
二、配置私有仓库
生成 http 认证文件
[root@18 docker]# mkdir auth
[root@18 docker]# docker run --entrypoint htpasswd registry:2.3.1 -Bbn wxh westos > auth/htpasswd
[root@18 docker]# cat auth/htpasswd
wxh:$2y$05$m1RLHkjuJTpi9deYMMfg1OD1iLW9/2bKW.h2gd4ghzoJEa3V9V9yq
##htpasswd命令测试,可忽略
[root@18 docker]# htpasswd -cm htpaswd wxh
New password:
Re-type new password:
Adding password for user wxh
[root@18 docker]# cat htpaswd
wxh:$apr1$U7nXN3sd$ySw7SDbs3a2pIGiy9S63J/
[root@18 docker]# htpasswd -m htpaswd admin
New password:
Re-type new password:
Adding password for user admin
[root@18 docker]# cat htpaswd
wxh:$apr1$U7nXN3sd$ySw7SDbs3a2pIGiy9S63J/
admin:$apr1$U8h7BjxU$oondSYh78.0C0b2UpRBnW0
搭建仓库
[root@18 docker]# docker run -d --restart=always --name registry -v `pwd`/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -v `pwd`/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -p 443:443 registry:2.3.1
7c3ed6745db4c90be283b3ff55b0707579919fce6ee3f51201834a05d4eb2139
这样我们就搭建好了一个具有权限认证、TLS 的私有仓库
##检查443端口是否开启
[root@18 docker]# netstat -antlup | grep 443
tcp6 0 0 :::443 :::* LISTEN 8639/docker-proxy
测试私有仓库功能
[root@18 docker]# docker images | grep westos.org
westos.org/rhel7 latest 0a3eb3fde7fd 4 years ago 140 MB
尝试推送
[root@18 docker]# docker push westos.org/rhel7
The push refers to a repository [westos.org/rhel7]
18af9eb19b5f: Preparing
no basic auth credentials
登录到私有仓库。
[root@18 docker]# docker login -u wxh -p westos westos.org
Login Succeeded
[root@18 docker]# cat /root/.docker/config.json
{
"auths": {
"westos.org": {
"auth": "d3hoOndlc3Rvcw=="
}
}
}
推送成功
[root@18 docker]#docker push westos.org/rhel7
The push refers to a repository [westos.org/rhel7]
18af9eb19b5f: Pushed
latest: digest: sha256:f1b19bc905965d1ff157c76b9ef6615c119aadad3cf4652bc881d3354ba3fdc4 size: 528
三、Compose
Defining and running multi-container Docker applications
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。
其代码目前在 https://github.com/docker/compose 上开源。
Compose 允许用户通过一个单独的 docker-compose.yml 模板文件
(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose 中有两个重要的概念:
- 服务 ( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目 ( project ):由一组关联的应用容器组成的一个完整业务单元,在 **docker-
compose.yml** 文件中定义。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管
理。
Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因
此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。
[root@18 compose]# cd /usr/local/bin/
[root@18 bin]# ln -s docker-compose-Linux-x86_64-1.22.0 docker-compose
[root@18 bin]# docker-compose version
docker-compose version 1.22.0, build f46880fe
docker-py version: 3.4.1
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0f 25 May 2017
[root@18 compose]# tree .
.
├── docker-compose.yml
├── haproxy
│ └── haproxy.cfg
└── web
└── index.html
[root@18 compose]# cat docker-compose.yml
apache:
image: rhel7:v1
expose:
- 80
volumes:
- ./web:/var/www/html
nginx:
image: nginx
expose:
- 80
haproxy:
image: haproxy
volumes:
- ./haproxy:/usr/local/etc/haproxy
links:
- apache
- nginx
ports:
- "8080:80"
expose:
- 80
[root@18 compose]# cat web/index.html
<h1>Docker</h1>
[root@18 compose]# cat haproxy/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
stats uri /status
frontend balancer
bind 0.0.0.0:80
default_backend web_backends
backend web_backends
balance roundrobin
server web1 apache:80 check
server web2 nginx:80 check
运行 compose 项目
[root@18 compose]# docker-compose up
Recreating compose_apache_1 ... done
Starting compose_nginx_1 ... done
Recreating compose_haproxy_1 ... done
apache与nginx负载均衡
四、集群图形化显示工具 Visualizer
首先创建一个vislualizer镜像
[root@18 docker]# docker tag dockersamples/visualizer westos.org/visualizer
[root@18 docker]# docker tag nginx westos.org/nginx
[root@18 docker]# docker service create --name=viz --publish=8080:8080/tcp --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock westos.org/visualizer
[root@18 docker]# docker run -d --restart=always --name registry -v `pwd`/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -p 443:443 registry:2.3.1
37734567e341d13e98150a5d90bd500ee0aaf1ba3638c7623ca7f5e06d204c72
[root@18 docker]# scp -r /etc/docker/certs.d/ server1:/etc/docker/root@server1's password:
[root@18 docker]# scp -r /etc/docker/certs.d/ server1:/etc/docker/root@server2's password:
[root@18 docker]# scp -r /etc/docker/certs.d/ server1:/etc/docker/root@server3's password:
[root@18 docker]# docker push westos.org/nginx
[root@18 docker]# docker load -i /mnt/docker/visualizer.tar
[root@server1 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3bf1f29d0482 westos.org/nginx@sha256:e59bbe13ca0c309644d9bca972c1b660c170fbdee7ff81eda9ff966b86f14e63 "nginx -g 'daemon ..." 9 minutes ago Up 9 minutes 80/tcp, 443/tcp nginx.1.2exl0v7eex83wbpibqw7e0i7h
[root@server1 docker]# docker service scale nginx=1
[root@server1 docker]# echo "server1" > index.html
[root@server1 docker]# docker cp index.html nginx.1.2exl0v7eex83wbpibqw7e0i7h:/usr/share/nginx/html/
[root@server2 mnt]# echo "server2" > index.html
[root@server2 mnt]# docker cp index.html nginx.3.b77d9xbtgxd6ixgmkpb26yjt2:/usr/share/nginx/html/
[root@server2 mnt]# docker run -d --name vm1 westos.org/nginx
[root@server3 mnt]# echo "server2" > index.html
[root@server3 mnt]# docker cp index.html nginx.3.b77d9xbtgxd6ixgmkpb26yjt2:/usr/share/nginx/html/
[root@server3 mnt]# docker run -d --name vm1 westos.org/nginx
[root@server1 docker]# docker service ls
ID NAME MODE REPLICAS IMAGE
593z41p2yi7i nginx replicated 3/3 westos.org/nginx:latest
idcqhvundhz0 viz replicated 1/1 westos.org/visualizer:latest
[root@server1 docker]# docker service create --name=viz --publish=8080:8080/tcp --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock westos.org/visualizer
[root@18 Desktop]# for i in {1..6}; do curl 172.25.18.1; done
server3
server2
server1
server3
server2
server1
当在server3上关闭docker服务时,nginx服务会迁移到其他节点:
当server3重新开启docker服务,nginx也不会迁移回来。
##设置最大服务个数
[root@server1 docker]# docker service scale nginx=10
nginx scaled to 10
##设置每次更新服务个数为4
[root@server1 docker]# docker service update --image westos.org/nginx --update-parallelism 4 --update-delay 10s nginx
nginx
五、docker-machine部署
[root@18 docker]# cd /usr/local/bin/
[root@18 bin]# ln -s docker-machine-Linux-x86_64-1.15.0 docker-machine
[root@18 bin]# chmod +x docker-machine
使用ssh免密建立连接管理。
##把本地用户生成的key,添加到目标主机上
[root@18 docker]# ssh-keygen
[root@18 docker]# ssh-copy-id server1
[root@18 docker]# ssh-copy-id server2
[root@18 docker]# ssh-copy-id server3
##添加3台目标主机到docker管理节点
[root@18 ~]#docker-machine create --driver generic --generic-ip-address=172.25.18.1 server1
[root@18 ~]# docker-machine create --driver generic --generic-ip-address=172.25.18.2 server2
[root@18 ~]# docker-machine create --driver generic --generic-ip-address=172.25.18.3 server3
create 命令本是要创建虚拟主机并安装 Docker,因为本例中的目标主机已经存在,所以仅安装 Docker。 –driver 的形式,主要用来指定使用什么驱动程序来创建目标主机。Docker Machine 支持在云服务器上创建主机,就是靠使用不同的驱动来实现了。本例中使用 generic 就可以了。接下来以 –generic 开头的参数主要是指定操作的目标主机,最后一个参数 server1是虚拟机的名称,Docker Machine 会用它来设置目标主机的名称。
测试通过docker-machine建立节点
删除节点server2
[root@18 ~]# docker-machine rm server2
About to remove server2
WARNING: This action will delete both local reference and remote instance.
Are you sure? (y/n): y
Successfully removed server2
再次创建时,它会自动开启docker
[root@foundation3 ~]# docker-machine create --driver generic --generic-ip-address=172.25.3.2 server2
查看目标主机的环境变量
[root@18 ~]# docker-machine env server3
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://172.25.18.3:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/server3"
export DOCKER_MACHINE_NAME="server3"
# Run this command to configure your shell:
# eval $(docker-machine env server3)