在Docker的使用过程中往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,所以这就涉及到Docker容器的数据操作。
容器中数据管理主要有两种方式:数据卷和数据卷容器。
数据卷(Data Volumes) 容器内数据直接映射到本地宿主机。
数据卷容器(Data Volume Containers) 使用特定容器维护数据卷。
数据卷
数据卷是一个特殊的目录,它将主机目录直接映射进容器。可供一个或多个容器使用。
数据卷设计的目的就是为了 数据的持久化,它完全独立与容器的生命周期。因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。
数据卷的特性:
数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
数据卷可以在容器之间共享和重用
可以对数据卷里的内容直接修改,修改回马上生效,无论是容器内操作还是本地操作
对数据卷的更新不会影响镜像的更新
数据卷会一直存在,即使挂载数据卷的容器已经被删除
docker run 在创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中,-v
的作用是将宿主机上的目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共
享一个目录。
[root@foundation53 ~]# systemctl start docker.service
查看数据卷
[root@foundation53 ~]# docker volume ls
DRIVER VOLUME NAME
local 17ba776e0ba1c45a61669d5db9bb3c0e40700d8ba27c5d1ecf56fdc7364b7a00
[root@foundation53 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
86feeeeced0d registry:2.3.1 "/bin/registry /et..." 15 hours ago Up About a minute 0.0.0.0:443->443/tcp, 5000/tcp registry
[root@foundation53 ~]# docker rm -f registry
registry
创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中
[root@foundation53 ~]# docker run -it --name vm1 -v /data1 ubuntu
[root@foundation53 ~]# docker inspect vm1
数据卷的目录如下
[root@foundation53 ~]# docker inspect vm1 | grep vol
"Type": "volume",
"Source": "/var/lib/docker/volumes/e2424e1454ad0d71d99edd26a097bf5c0d1a28f5b2eb5c5bb337c3936b2e360c/_data",
[root@foundation53 ~]# cd /var/lib/docker/volumes/e2424e1454ad0d71d99edd26a097bf5c0d1a28f5b2eb5c5bb337c3936b2e360c/_data
[root@foundation53 _data]# ls
数据卷就是一个目录,可以正常写入删除数据,文件
可以对数据卷里的内容直接修改,修改会马上生效,无论是容器内操作还是本地操作
[root@foundation53 _data]# cp /etc/passwd .
[root@foundation53 _data]# ls
passwd
[root@foundation53 _data]# pwd
/var/lib/docker/volumes/e2424e1454ad0d71d99edd26a097bf5c0d1a28f5b2eb5c5bb337c3936b2e360c/_data
数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
[root@foundation53 ~]# docker run -d --name vm2 -v /usr/share/nginx/html nginx
a7074fbf70eeb6117995e8d04366db5edce8430ffa2b9c37ce7183e475b9817d
[root@foundation53 ~]# docker inspect vm2 | grep vol "Type": "volume",
"Source": "/var/lib/docker/volumes/8510f33f7902c04c1bd7f68c3802c87a5a274cac8c73e439f3b8d9540c913e7b/_data",
[root@foundation53 ~]# cd /var/lib/docker/volumes/8510f33f7902c04c1bd7f68c3802c87a5a274cac8c73e439f3b8d9540c913e7b/_data
[root@foundation53 _data]# ls
50x.html index.html
数据卷会一直存在,即使挂载数据卷的容器已经被删除
需要删除残存的数据卷时,可以用docker volume rm 命令
需要删除容器及它的数据卷时,需要加-v选项
[root@foundation53 ~]# docker stop vm2
vm2
[root@foundation53 ~]# docker rm vm2
vm2
[root@foundation53 ~]# docker volume rm 8510f33f7902c04c1bd7f68c3802c87a5a274cac8c73e439f3b8d9540c913e7b
8510f33f7902c04c1bd7f68c3802c87a5a274cac8c73e439f3b8d9540c913e7b
[root@foundation53 ~]# docker stop vm1
vm1
[root@foundation53 ~]# docker rm -v vm1
vm1
数据卷的介绍就到此为止,我们接下来看下封装
先将不需要的容器及数据卷删除,纯净实验环境
[root@foundation53 ~]# docker volume ls
DRIVER VOLUME NAME
local 17ba776e0ba1c45a61669d5db9bb3c0e40700d8ba27c5d1ecf56fdc7364b7a00
[root@foundation53 ~]# docker volume ls -q
17ba776e0ba1c45a61669d5db9bb3c0e40700d8ba27c5d1ecf56fdc7364b7a00
[root@foundation53 ~]# docker volume rm `docker volume ls -q`
17ba776e0ba1c45a61669d5db9bb3c0e40700d8ba27c5d1ecf56fdc7364b7a00
[root@foundation53 ~]# docker volume ls
DRIVER VOLUME NAME
[root@foundation53 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
封装
我们封装一个带发布页的nginx
[root@foundation53 ~]# cd /tmp/docker/
[root@foundation53 docker]# ls
certs Dockerfile dvd.repo ssh supervisord.conf test web
[root@foundation53 docker]# cd test/
[root@foundation53 test]# vim Dockerfile
[root@foundation53 test]# cat Dockerfile
FROM rhel7
ADD html.tar /usr/share
VOLUME ["/usr/share/nginx/html"]
[root@foundation53 test]# mkdir nginx
[root@foundation53 test]# cd nginx/
[root@foundation53 nginx]# mkdir html
[root@foundation53 nginx]# cd html/
[root@foundation53 html]# vim index.html
[root@foundation53 html]# cd ..
[root@foundation53 nginx]# cd ..
[root@foundation53 test]# tar cf html.tar nginx/html/index.html
[root@foundation53 test]# ls
Dockerfile html.tar nginx
[root@foundation53 test]# docker build -t rhel7:v4 .
[root@foundation53 test]# docker create --name vol rhel7:v4 bash
[root@foundation53 test]# docker run -d --name vm1 --volumes-from vol nginx
d865d873cf004168cf5438945e2d143b356f879c5a9256624cb9bc2ec897130d
[root@foundation53 test]# docker inspect vm1 |grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
[root@foundation53 test]# curl 172.17.0.2
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
纯净环境
[root@foundation53 docker]# ls
certs Dockerfile dvd.repo ssh supervisord.conf test web
[root@foundation53 docker]# mkdir auth
[root@foundation53 docker]# cd auth/
[root@foundation53 auth]# cd ..
[root@foundation53 docker]# ls
auth certs Dockerfile dvd.repo ssh supervisord.conf test web
[root@foundation53 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d865d873cf00 nginx "nginx -g 'daemon ..." 14 minutes ago Up 14 minutes 80/tcp, 443/tcp vm1
[root@foundation53 docker]# docker ps rm -f -v vm1
invalid argument "-v" for f: bad format of filter (expected name=value)
See 'docker ps --help'.
[root@foundation53 docker]# docker rm -f -v vm1
vm1
[root@foundation53 docker]# docker volume ls
DRIVER VOLUME NAME
local 44700621a3c32165191668d78029231ef85ee9d6e92aeb3e9acc55287a95335d
[root@foundation53 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adeefe420c25 rhel7:v4 "bash" 25 minutes ago Created vol
da02f32c4f9b registry:2.3.1 "/bin/registry /et..." 18 hours ago Exited (2) 17 hours ago elastic_swanson
[root@foundation53 docker]# docker rm -v vol
vol
[root@foundation53 docker]# docker volume ls
DRIVER VOLUME NAME
[root@foundation53 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
da02f32c4f9b registry:2.3.1 "/bin/registry /et..." 18 hours ago Exited (2) 17 hours ago elastic_swanson
[root@foundation53 docker]# docker ps -aq
da02f32c4f9b
[root@foundation53 docker]# docker rm -f da02f32c4f9b
da02f32c4f9b
[root@foundation53 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@foundation53 docker]# docker run --entrypoint htpasswd registry:2.3.1 -Bbn ha westos > auth/htpasswd
[root@foundation53 docker]# cat auth/htpasswd
ha:$2y$05$pkmA/avPh3eStnJMteCfxugja3Bt7naD4rfko4VoESBBEzkh2Bzsm
[root@foundation53 docker]# docker run --entrypoint htpasswd registry:2.3.1 -Bbn admin westos >> auth/htpasswd
[root@foundation53 docker]# cat auth/htpasswd ha:$2y$05$pkmA/avPh3eStnJMteCfxugja3Bt7naD4rfko4VoESBBEzkh2Bzsm
admin:$2y$05$XXOjz5krQNtFlnygsUoBh.BW9Z2U77lKrDrUMGEHVAbgJfXlaGp4K
[root@foundation53 docker]# htpasswd -cm htpaswd ha
New password:
Re-type new password:
Adding password for user ha
[root@foundation53 docker]#
[root@foundation53 docker]# ls
auth certs Dockerfile dvd.repo htpaswd ssh supervisord.conf test web
[root@foundation53 docker]# cat htpaswd
ha:$apr1$EI6SkU6l$VEge5AwyYLPW.oACY9mYC/
[root@foundation53 docker]# htpasswd -m htpaswd admin
New password:
Re-type new password:
Adding password for user admin
[root@foundation53 docker]# cat htpaswd
ha:$apr1$EI6SkU6l$VEge5AwyYLPW.oACY9mYC/
admin:$apr1$Oj/aaZIS$qdhQn.szDzWmhSHRgw4Em0
[root@foundation53 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
c66e738886cad85f5c8666d93f8bcd1fe36ef69ee52e13b4c9a47ce0e8917b59
[root@foundation53 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c66e738886ca registry:2.3.1 "/bin/registry /et..." 6 seconds ago Up 5 seconds 0.0.0.0:443->443/tcp, 5000/tcp registry
上传镜像,由于没有证书,所以无法上传
[root@foundation53 docker]# docker tag nginx westos.org/nginx
[root@foundation53 docker]# docker push westos.org/nginx
The push refers to a repository [westos.org/nginx]
5f70bf18a086: Preparing
3f3324023e75: Preparing
f0d7d68f89e5: Preparing
917c0fc99b35: Preparing
no basic auth credentials
给网站登陆证书及密码
[root@foundation53 docker]# docker login -u ha -p westos westos.org
Login Succeeded
[root@foundation53 docker]# ping westos.org
PING server1 (172.25.254.53) 56(84) bytes of data.
64 bytes from westos.org (172.25.254.53): icmp_seq=1 ttl=64 time=0.039 ms
64 bytes from westos.org (172.25.254.53): icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from westos.org (172.25.254.53): icmp_seq=3 ttl=64 time=0.076 ms
64 bytes from westos.org (172.25.254.53): icmp_seq=4 ttl=64 time=0.074 ms
^C64 bytes from westos.org (172.25.254.53): icmp_seq=5 ttl=64 time=0.065 ms
64 bytes from westos.org (172.25.254.53): icmp_seq=6 ttl=64 time=0.072 ms
^C
--- server1 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 4999ms
rtt min/avg/max/mdev = 0.039/0.066/0.076/0.015 ms
[root@foundation53 docker]# netstat -antlp |grep :443
tcp6 0 0 :::443 :::* LISTEN 7711/docker-proxy
[root@foundation53 docker]# cd
[root@foundation53 ~]# cd .docker/
[root@foundation53 .docker]# ls
config.json
[root@foundation53 .docker]# cat config.json
{
"auths": {
"westos.org": {
"auth": "aGE6d2VzdG9z"
}
}
}
[root@foundation53 .docker]# docker push westos.org/nginx
The push refers to a repository [westos.org/nginx]
5f70bf18a086: Pushed
3f3324023e75: Pushed
f0d7d68f89e5: Pushed
917c0fc99b35: Pushed
latest: digest: sha256:e59bbe13ca0c309644d9bca972c1b660c170fbdee7ff81eda9ff966b86f14e63 size: 1978
Docker搭建nginx,haproxy,apache集群
首先纯净实验环境
下面,我们创建一个经典的 Web 项目:一个 Haproxy,挂载三个 Web 容器。
创建一个 compose-haproxy-web 目录,作为项目工作目录,并在其中分别创建两个子目
录:haproxy 和 web。
Web 子目录
这里用 Python 程序来提供一个简单的 HTTP 服务,打印出访问者的 IP 和 实际的本地
IP。
[root@foundation53 docker]# ls
auth certs Dockerfile dvd.repo htpaswd ssh supervisord.conf test web
[root@foundation53 docker]# mkdir compose
[root@foundation53 docker]# cd compose/
[root@foundation53 compose]# pwd
/tmp/docker/compose
[root@foundation53 compose]# vim 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@foundation53 compose]# cd ..
[root@foundation53 docker]# ls
auth compose dvd.repo ssh test
certs Dockerfile htpaswd supervisord.conf web
[root@foundation53 docker]# cp -r web/ compose/
[root@foundation53 docker]# cd compose/
[root@foundation53 compose]# ls
docker-compose.yml web
[root@foundation53 compose]# ls web/
index.html
[root@foundation53 compose]# mkdir haproxy
[root@foundation53 compose]# cd haproxy/
[root@foundation53 haproxy]# vim haproxy.cfg
[root@foundation53 haproxy]# cat 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
安装 docker-compose-Linux-x86_64-1.22.0,这是个二进制文件包,下载即可用
[root@foundation53 ~]# cd /usr/local/bin/
[root@foundation53 bin]# ls
docker-compose-Linux-x86_64-1.22.0 rht-vmctl rht-vmicons rht-vmsetkeyboard
[root@foundation53 bin]# chmod +x docker-compose-Linux-x86_64-1.22.0
为了方便版本更新,我们作软链接
[root@foundation53 bin]# ln -s docker-compose-Linux-x86_64-1.22.0 docker-compose
[root@foundation53 docker]# docker load -i haproxy.tar
启动集群
[root@foundation53 compose]# docker-compose up
compose_nginx_1 is up-to-date
Creating compose_apache_1 ... done
Creating compose_haproxy_1 ... done
Attaching to compose_nginx_1, compose_apache_1, compose_haproxy_1
haproxy_1 | <7>haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds
apache_1 | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
打开浏览器
查看监控
浏览端访问的数据会被记录
关闭apache
监控显示web1离线
打开apache
[root@foundation53 compose]# docker start compose_apache_1
compose_apache_1
监控显示正常
开三个新的虚拟机,做集群
都安装docker并打开
[root@docker1 ~]# ls
anaconda-ks.cfg
docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm
docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
[root@docker1 ~]# yum install -y *
[root@docker1 ~]# systemctl start docker
这个软件是为了命令补全
[root@docker1 ~]# yum install -y bash-*
创建集群
[root@docker1 ~]# docker swarm init
Swarm initialized: current node (r05cs00orzmzwdeon70qb78iz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-65uct5jlw9jf8asgasw9rc1c4ixr6fj4p8r40bjwmfdggfdnmd-dmtbv9x1qxucq6ypjompuloe4 \
172.25.53.1:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
其他两个加入集群
[root@docker3 ~]# docker swarm join \
> --token SWMTKN-1-65uct5jlw9jf8asgasw9rc1c4ixr6fj4p8r40bjwmfdggfdnmd-dmtbv9x1qxucq6ypjompuloe4 \
> 172.25.53.1:2377
This node joined a swarm as a worker.
虚拟机无法联网,所以我们将私有软件仓库使用
三台虚拟机做解析
172.25.53.250 westos.org
把证书传给三台虚拟机
虚拟机可以下载仓库里的软件了
前提是上传了的,三台虚拟机都拉取nginx
docker pull westos.org/nginx
[root@docker1 ~]# docker service create --name nginx --publish 80:80 --replicas 3 westos.org/nginx
s5bcl3q3ydjzr63qvjmtd24jn
[root@docker1 ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
z180cfqtojp4 nginx.1 westos.org/nginx:latest docker3 Running Running 9 seconds ago
z9av42sz5xkn nginx.2 westos.org/nginx:latest docker1 Running Running 10 seconds ago
5gkghv840zsj nginx.3 westos.org/nginx:latest docker2 Running Running 10 seconds ago
对容器可进行拉申与缩减
[root@docker1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
westos.org/nginx latest af4b3d7d5401 2 years ago 190 MB
[root@docker1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
feb6472f1ed1 westos.org/nginx@sha256:e59bbe13ca0c309644d9bca972c1b660c170fbdee7ff81eda9ff966b86f14e63 "nginx -g 'daemon ..." 41 seconds ago Up 38 seconds 80/tcp, 443/tcp nginx.2.z9av42sz5xkn3gw8lgea0dho3
[root@docker1 ~]# docker service scale nginx=6
nginx scaled to 6
[root@docker1 ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
z180cfqtojp4 nginx.1 westos.org/nginx:latest docker3 Running Running about a minute ago
z9av42sz5xkn nginx.2 westos.org/nginx:latest docker1 Running Running about a minute ago
5gkghv840zsj nginx.3 westos.org/nginx:latest docker2 Running Running about a minute ago
ta0c0ugzwpz4 nginx.4 westos.org/nginx:latest docker2 Running Running less than a second ago
n6vigkiirsl5 nginx.5 westos.org/nginx:latest docker3 Running Starting 1 second ago
44vxbdc3r90q nginx.6 westos.org/nginx:latest docker1 Running Starting 1 second ago
上传监控软件
[root@foundation53 docker]# ls
certs.d deamon.json key.json visualizer.tar
[root@foundation53 docker]# docker load -i visualizer.tar
[root@foundation53 docker]# docker push westos.org/visualizer
[root@docker1 ~]# docker pull westos.org/visualizer
[root@docker1 ~]# 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
1p7qgtzpkuksdwzm76tuw0z78
[root@docker1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE
1p7qgtzpkuks viz replicated 1/1 westos.org/visualizer:latest
s5bcl3q3ydjz nginx replicated 6/6 westos.org/nginx:latest
[root@docker1 ~]# docker service scale nginx=3
nginx scaled to 3
三台虚拟机都写发布页,并且传给仓库
[root@docker1 ~]# vim index.html
[root@docker1 ~]# docker container cp index.html nginx.2.z9av42sz5xkn3gw8lgea0dho3:/usr/share/nginx/html
关掉docker3,有一段时间后,会变为如下
打开docker3,但监控显示docker3并不会主动加入集群
滚动更新
[root@docker1 ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
t89pb3adjhjq nginx.1 westos.org/nginx:latest docker2 Running Running 31 minutes ago
z180cfqtojp4 \_ nginx.1 westos.org/nginx:latest docker3 Shutdown Shutdown 31 minutes ago
z9av42sz5xkn nginx.2 westos.org/nginx:latest docker1 Running Running about an hour ago
ta0c0ugzwpz4 nginx.4 westos.org/nginx:latest docker2 Running Running about an hour ago
为了看效果,我们将nginx拉申为30个
[root@docker1 ~]# docker service scale nginx=30
nginx scaled to 30
软件仓库上传game2048
[root@foundation53 docker]# docker tag game2048 westos.org/game2048
[root@foundation53 docker]# docker push westos.org/game2048
滚动更新
[root@docker1 ~]# docker service update --image westos.org/game2048 --update-parallelism 5 --update-delay 10s nginx
nginx
注意看红色的,正在更新
更新完后
显示所有的都已经更新完成