第一部分:docker简介安装
docker版本
- CE 社区版 不收费
- EE 企业版 收费
先决条件
OS需求:
- centos7
- centos-extras 存储库启用。默认系统是开启的。
卸载旧版本docker:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
安装需求包:
yum -y install epel-release
yum -y install libseccomp iptables iptables-services
systemctl stop firewalld
systemctl disable firewalld
systemctl enable iptables
systemctl start iptables
iptables -F # 清空iptables所有规则
iptables -X # 清空用户配置
iptables -Z # 计数器清零
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 添加远程端口
service iptables save
systemctl restart iptables
安装docker CE
- 通过设置仓库,yum安装docker-ce
- 通过下载rpm包,手动安装docker-ce
1、yum安装docker
设置docker-ce仓库
-
安装需求数据包,
yum-utils
提供了yum-config-manager
实用工具,device-mapper-persistent-data
和lvm2
提供了devicemapper
存储驱动器。yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
-
设置仓库
yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
-
激活edge和test 仓库,默认是关闭的。
yum-config-manager --enable docker-ce-edge yum-config-manager --enable docker-ce-test
关闭
yum-config-manager --disable docker-ce-edge
安装docker-ce
# 查看docker-ce列表
yum list docker-ce --showduplicates| sort -r
# 可以指定安装docker-ce版本
yum install docker-ce-<VERSION STRING>
# 这里使用以下,安装最新版本
yum -y install docker-ce
docker安装完以后并没有启动,并在系统中自动创建了docker group,但并没有用户在docker group里边。
# 查看已经创建的组
[root@localhost ~]# cat /etc/group | grep docker
docker:x:996:
启动docker
systemctl start docker
systemctl enable docker
验证docker是否安装成功
docker run hello-world
运行这个命令,会从docker hub下载一个‘hello-word’镜像,并且用‘hello-word’镜像 创建一个新的容器运行。当运行容器的时候,会打印一些信息后并自动退出。
2、手动下载安装docker-ce
rpm下载链接:<https://download.docker.com/linux/centos/7/x86_64/stable/Packages/>
安装rpm包:
yum install docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
接下来就是启动,同上。
3、通过脚本安装docker-ce
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
注意 :需要手动制作启动脚本。
4、删除、卸载docker-ce
$ sudo yum remove docker-ce
# 需要手动删除images、container、valumes、自定义的配置文件。
$ sudo rm -rf /var/lib/docker
5、查看docker版本
docker version
6、用普通用户运行docker
创建用户,并将用户添加到docker组
useradd docker -g docker
su - docker
docker run hello-world
第一部分-常用命令
1、查看本地镜像
docker image ls
2、查看显示消息后退出的容器
docker container ls --all
3、docker container 帮助命令
docker container --help
4、查看docker版本和详细信息
docker version 查看docker版本
docker info 查看docker详细信息
5、执行docker镜像
docker run hello-world
6、列出docker containers(running,all,all in quiet mode)
[docker@localhost ~]$ docker container ls --help
Usage: docker container ls [OPTIONS]
Options:
-a, --all 显示所有容器 (默认不加任何选项只显示运行的容器)
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print containers using a Go template
(docker container ls -af name=h #打印容器名字包含h的容器列表)
-n, --last int Show n last created containers (includes all states) (default -1)
-l, --latest 显示最新创建的容器
-q, --quiet 仅仅显示容器ID
-s, --size 显示容器信息再加上容器文件总大小
报错信息及解决
1、 containerd: /usr/bin/containerd: error while loading shared libraries: libseccomp.so.2: cannot open shared object file: No such file or directory
解决办法:yum -y install libseccomp
2、Couldn't load target DOCKER-ISOLATION':No such file or directory#012#012Try
iptables -h' or 'iptables --help' for more information.
解决办法:yum -y install iptables
第一部分结论:
Containers 的CI/CD 是天衣无缝。例如:
- 应用程序没有系统依赖项
- 可以将更新推送到分布式应用程序的任何部分。
- 资源密度可以优化。
使用docker,应用程序缩放是一个问题,就是编制新的可执行文件,而不是运行大量的vm主机。
第二部分 - 容器 container
用Docker方式构建一个应用程序,层次结构从底层开始,这个应用程序是一个container;高于此级别是一个service,它定义了容器在生产中的行为方式;最后是stack(堆栈)。
用Dockerfile构建一个python web应用程序
-
创建一个空目录,并cd 切换到新目录中,
[docker@localhost ~]$ mkdir pythonweb [docker@localhost ~]$ cd pythonweb/
创建一个Dockerfile,添加以下内容:
# 使用正式的Python运行时作为父映像 FROM python:2.7-slim # 设置工作目录为 /app WORKDIR /app # 复制当前目录的内容到容器 /app目录里 ADD . /app # 安装requirements.txt 需求的数据包 RUN pip install --trusted-host pypi.python.org -r requirements.txt # 对外开放容器的80端口 EXPOSE 80 # 定义环境变量 ENV NAME World # 当容器启动时,运行app.py CMD ["python","app.py"]
-
接下来创建requirements.txt文件
[docker@localhost pythonweb]$ vi requirements.txt Flash Redis
-
创建app.py文件
[docker@localhost pythonweb]$ 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) if __name__ == "__main__": app.run(host='0.0.0.0', port=80)
-
用Build命令创建一个Docker image,使用-t 指定一个 镜像名字
docker build -t python-web-test .
-
查看创建的“python-web-test”镜像
[docker@localhost pythonweb]$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE python-web-test latest 075bace69a76 About a minute ago 132MB
-
为Docker守护进程设置DNS
这里要切换到root,创建/etc/docker/daemon.json文件
[root@localhost ~]# vi /etc/docker/daemon.json { "dns": ["119.29.29.29", "202.106.0.20"] } # 设置完成后要重启docker服务 [root@localhost ~]# systemctl restart docker # 也要重新运行以下刚才的build su - docker cd pythonweb/ docker build -t python-web-test .
-
运行应用程序
docker run -p 4000:80 python-web-test
[docker@localhost pythonweb]$ docker run -p 4000:80 python-web-test * Serving Flask app "app" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:80/ (Press CTRL+C to quit) 172.16.100.1 - - [27/Aug/2018 08:13:26] "GET / HTTP/1.1" 200 -
-
web浏览器验证
也可以命令行验证:
[docker@localhost pythonweb]$ curl localhost:4000 <h3>Hello World!</h3><b>Hostname:</b> 017c03c8de0b<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
-
以分离模式运行该应用程序
可以先用ctrl+c 结束当前进程。
然后运行:
docker run -d -p 4000:80 python-web-test
[docker@localhost pythonweb]$ docker run -d -p 4000:80 python-web-test a255126065c1aa45ce4bff026ea9e7869efc527abfb9989fef63716428a7d7c6 # -d 以分离的模式运行容器,并返回容器ID
分享镜像到hub.docker.com
-
登录:docker login
[docker@localhost ~]$ docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: 506554897 Password: WARNING! Your password will be stored unencrypted in /home/docker/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
-
给镜像指定tag
docker tag python-web-test 506554897/python-web-test:part1 # python-web-test是上边创建的container # 506554897: 是hub.docker.com注册的用户名 # python-web-test:是仓库名(repository) # part1 :是tag # 查看标记完image的docker image ls [docker@localhost ~]$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE 506554897/python-web-test part1 075bace69a76 About an hour ago 132MB python-web-test latest 075bace69a76 About an hour ago 132MB
-
上传镜像到[hub.docker.com]
docker push 506554897/python-web-test:part1
[docker@localhost ~]$ docker push 506554897/python-web-test:part1 The push refers to repository [docker.io/506554897/python-web-test] 03db24dfec4f: Pushed 7b4c7a03b2a4: Pushed a0857e348458: Pushed 1ea4f6a807ba: Mounted from library/python fda4dc055a55: Mounted from library/python e8fc09a140cf: Mounted from library/python cdb3f9544e4c: Mounted from library/python part1: digest: sha256:8a5c72b23b7b581adf37f396a0cd27796c15c816d82ce813fab415c96b516191 size: 1788
到官网就可以看到已经上传的镜像了:
-
现在就可以在别的docker机器上下载运行这个镜像了
docker run -p 4001:80 506554897/python-web-test:part1
第二部分--常用命令
1、利用目录中的Dockerfile 创建一个image
docker build -t image-name .
# . 代表当前目录
# image-name :创建镜像的名字
2、运行一个镜像并对外开放端口映射
docker run -p 4000:80 image-name
3、分离模式运行 一个镜像
docker run -d -p 4001:80 image-name
4、查看所有运行的容器
docker container ls
5、查看所有运行、未运行的容器
docker container ls -a
6、优雅的停止容器
docker container stop container-id
7、强制停止容器
docker container kill container-id
8、从主机上删除容器
ocker container rm container-id
9、删除所有容器
docker container rm $(docker container ls -a -q)
# -a:显示所有运行、未运行的容器
# -q:仅仅显示容器ID
10、列出所有的镜像
docker image ls -a
11、删除指定镜像
docker image rm image-id
12、删除所有镜像
docker image rm $(docker image ls -a -q)
13、CLI 登录docker hub
docker login
14、给将要上传到仓库 的镜像 指定tag
docker tag image-name username/repository-name:tag
15、上传 tag image 到registry
docker push username/repository-name:tag
16、从仓库下载镜像 使用image运行一个容器
docker run username/repository-name:tag
第三部分-服务 services
services实际上就是“生产中的container”。services运行一个image,它编码了image的运行方式、应该使用哪些端口,应该运行多少个容器副本,以便服务具有所需的容量。
扩展服务会改变运行该软件的容器实例的数量,为流程中的服务分配更多的计算资源。
在docker平台定义、运行和扩展服务非常容易,只需编写一个docker-compose.yml
文件。
创建第一个docker-compose.yml文件
[docker@localhost ~]$ vi docker-compose.yml
version: "3"
services:
web:
#replace username/repository:tag with your name and image details.
image: 506554897/python-web-test:part1
deploy:
#允许副本数为 5
replicas: 2
resources:
limits:
#每个cpu最多使用10%(在所有核中)
cpus: "0.1"
memory: 50M
#如果容器失败,立即重新启动容器
restart_policy:
condition: on-failure
#将主机的4000端口映射到 容器的80端口
ports:
- "4000:80"
# web通过负载平衡webnet网络共享端口80
networks:
- webnet
# 定义webnet具有默认设置的网络(这是一个负载平衡的覆盖网络)
networks:
webnet:
运行新的负载平衡应用程序
启动集群模式
docker swarm init
启动群集模式,并使当前机器成为群集管理器。
[docker@localhost ~]$ docker swarm init
Swarm initialized: current node (htyhmotwa88rb2it9dkfh9c9o) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4dc36dlf6g6ykl8k1q6hhhegi4pjmv390qlpgyj1cydf7koo7u-8n54mzvaicqtrhafmc8od3h6b 172.16.100.20:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
注意: 使用集群的时候,如果不运行该命令,会报错“this node is not a swarm manager ”
运行集群应用程序
docker stack deploy -c docker-compose.yml python-test-web
[docker@localhost ~]$ docker stack deploy -c docker-compose.yml python-test-web
Creating network python-test-web_webnet
Creating service python-test-web_web
# pyton-test-web:应用程序的名字,自定义就行。
获取应用程序ID
docker service ls
[docker@localhost ~]$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
zzevktay14av python-test-web_web replicated 5/5 506554897/python-web-test:part1 *:4000->80/tcp
查看应用程序里边的task
在服务中运行的单个容器成为task。任务被赋予唯一的ID,该ID在数字上递增,列出服务的task:
docker service ps python-test-web_web
[docker@localhost ~]$ docker service ps python-test-web_web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
skvezw77ra63 python-test-web_web.1 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago
vlxrofm9mbp1 python-test-web_web.2 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago
ar7tr2213d92 python-test-web_web.3 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago
lolilmuenas4 python-test-web_web.4 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago
h9a1wrhkee1w python-test-web_web.5 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago
查看系统运行的container
查看系统运行的container也可以列出应用程序的所有task。
[docker@localhost ~]$ docker container ls -q
b8d43f336d17
a4734d25f376
7ac3d4ecd07e
7946461cd7c1
95a9f0c09dfc
web访问4000端口
应用程序对于每个客户端的每个请求,将以循环方式选择5个任务中的一个来响应。容器ID与前面命令的输出相匹配(docker container ls -q)
缩放应用程序的task
修改docker-compose.yml文件的replicas 保存
replicas: 2
重新运行应用程序
docker stack deploy -c docker-compose.yml python-test-web
[docker@localhost ~]$ docker stack deploy -c docker-compose.yml python-test-web
Updating service python-test-web_web (id: zzevktay14avptf4e4dwxmv1r)
docker执行就地更新,不需要stop容器或kill容器。
#重新启动应用程序后,查看应用程序的task
[docker@localhost ~]$ docker service ps python-test-web_web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
skvezw77ra63 python-test-web_web.1 506554897/python-web-test:part1 localhost.localdomain Running Running 25 minutes ago
vlxrofm9mbp1 python-test-web_web.2 506554897/python-web-test:part1 localhost.localdomain Running
停止应用程序
docker stack rm python-test-web
[docker@localhost ~]$ docker stack rm python-test-web
Removing service python-test-web_web
Removing network python-test-web_webnet
停止集群
docker swarm leave --force
[docker@localhost ~]$ docker swarm leave --force
Node left the swarm.
第三部分--常用命令
1、查看应用程序
docker stack ls
2、运行应用程序
docker stack deploy -c docker-compose.yml appname
# docker-compose.yml :composefile
# appname: 应用程序名字
3、列出运行的应用程序
docker service ls
4、查看应用程序的task
docker service ps appname
# appname: 应用程序名字
5、检查task或container
docker inspect <task-id or container-id or service-name>
6、查看运行的容器的容器ID
docker container ls -q
# -q:只显示容器ID
7、停止应用程序
docker stack rm python-test-web
# python-test-web :应用程序名字
8、启动/停止集群
docker swarm init
docker swarm leave --force
第四部分-集群 Swarm clusters
理解Swarm clusters
集群就是讲几台可以运行docker的主机加入到群集中。集群中的机器可以是物理的,也可以是虚拟的,加入swarm clusters之后,这些主机成为节点。当加入群集之后,运行docker命令要在群管理器上运行。
群管理器可以使用集中策略来运行容器,比如“最空的节点”-用容器填充利用率最低的机器。或者“全局”,它确保每台机器都得到指定容器的一个实例。您指示群管理器在撰写文件中使用这些策略,就像您已经使用过的策略一样。
群管理器(Swarm managers ):集中管理执行命令或授权其他机器加入群集的机器。
节点(workers):只提供资源和接受指令,没有权利执行或授权命令。
集群管理端口:2377
docker守护进程端口:2376
建立第一个swarm clusters
1、启动群集模式并确定群集管理器
docker swarm init
[root@docker-1 ~]# docker swarm init
Swarm initialized: current node (hzo1e9ux1qounpcdujyz10pks) is now a manager.
To add a worker to this swarm, run the following command:
# 增加主机到集群,请执行如下命令
docker swarm join --token SWMTKN-1-2yn0609winru1y5tsk00y9t54nh40thsvb7rjymfih5oz4ymy3-bgssyx8nlm0eiy0y4j8ugvsdh 172.16.100.20:2377
To add a manager to this swarm,
# 增加一个群集管理请运行如下:
run 'docker swarm join-token manager' and follow the instructions.
iptables开启swarm management port:
iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
service iptables save
systemctl restart iptables
###2、增加主机到集群 swarm clusters
docker swarm join --token SWMTKN-1-2yn0609winru1y5tsk00y9t54nh40thsvb7rjymfih5oz4ymy3-bgssyx8nlm0eiy0y4j8ugvsdh 172.16.100.20:2377
[docker@docker-2 ~]$ docker swarm join --token SWMTKN-1-2yn0609winru1y5tsk00y9t54nh40thsvb7rjymfih5oz4ymy3-bgssyx8nlm0eiy0y4j8ugvsdh 172.16.100.20:2377
This node joined a swarm as a worker.
3、在管理节点上查看集群节点
docker node ls
[docker@docker-1 ~]$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
hzo1e9ux1qounpcdujyz10pks * docker-1 Ready Active Leader 18.09.0-ce-tp3
jr99plvxg9o8as269vq5o3gql docker-2 Ready Active 18.06.1-ce
# 当然在非管理节点查看会提示:This node is not a swarm manager.
删除节点命令
docker node rm 节点ID
节点主机删除集群
docker swarm leave
(此方法不推荐,这个方法只是在管理显示节点是down的状态,并不能直接删除列表,还得采用上一个办法彻底删除。)
强制删除集群
docker swarm leave --force
4、在集群上启动应用程序
启动之前要在每个节点开启一下端口:
7946 tcp/udp 用于容器网络的发现
4789 udp 用于容器入口发现
两个节点都运行:
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 4789 -j ACCEPT
iptables -A INPUT -p udp --dport 4000 -j ACCEPT
service iptables save
systemctl restart iptables
# 4000 是步骤三里边指定的映射80端口
部署应用程序
[docker@docker-1 ~]$ docker stack deploy -c docker-compose.yml python-test-web
Creating network python-test-web_webnet
Creating service python-test-web_web
5、查看集群运行的程序
[docker@docker-1 ~]$ docker stack ps python-test-web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
49fw7nvy2qgp python-test-web_web.1 506554897/python-web-test:part1 docker-2 Running Preparing 22 seconds ago
xie9q8h36bbo python-test-web_web.2 506554897/python-web-test:part1 docker-1 Running
注意:这时候运行的服务已经 负载均衡分布在了两个节点上。这时候可以随便访问两个节点的ip 的4000 端口了。
6、迭代和缩放应用程序
只需要参考第三部分 修改docker-compose.yml文件,然后重新运行docker stack deploy ...
命令再次部署更新更改的内容。
7、删除集群中的应用
[docker@docker-1 ~]$ docker stack rm python-web
Removing service python-web_web
Removing network python-web_webnet
8、删除swarm clusters
普通节点删除方式:docker swarm leave
管理节点删除方式:docker swarm leave --force
第四部分--常用命令
1. 启动集群模式:
docker swarm init
2. 主机加入集群:
docker swarm join --token SWMTKN-1-2yn0609winru1y5tsk00y9t54nh40thsvb7rjymfih5oz4ymy3-bgssyx8nlm0eiy0y4j8ugvsdh 172.16.100.20:2377
3. 查看集群节点列表:
docker node ls
4. 查看集群节点详细信息:
docker node inspect 节点id
5. 集群部署应用程序:
docker stack deploy -c docker-compose.yml 应用程序名
6. 查看集群应用程序:
docker stack ps 应用程序名
7. 删除集群中的应用:
docker stack rm 应用程序名
8. 删除swarm clusters:
普通节点删除方式:docker swarm leave
管理节点删除方式:docker swarm leave --force
第五部分-堆栈 stack
这部分将学习应用程序层次结构的顶部:堆栈。堆栈是一组相互关联的服务,它们共享依赖关系,可以在一起进行编排和缩放。单个堆栈能够定义和协调整个应用程序的功能(尽管非常复杂的应用程序可能需要使用多个堆栈)。
从技术上讲,从第三部分开始,就一直在使用堆栈,我们创建了一个docker-compose.yml文件并使用docker stack deploy
部署了应用程序。但是这是在当个主机上运行的当个服务堆栈,这通常不是生产环境中发生的情况。接下来我们学习使多个服务相互关联,并在多台机器上运行它们。
添加可视化服务并重新部署
可视化工具是一个独立的服务。可以在堆栈中的任意应用程序中运行。用可视化服务来查看应用程序部署情况。
1、新建docker-compose-visualizer.yml,
替换以下内容,但是一定要更换username/repo:tag
,还有image细节。
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: 506554897/python-web-test:part1
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:
2、重新运行docker stack deploy
命令
[docker@docker-1 ~]$ docker stack deploy -c docker-compose-visualizer.yml python-test-visualizer
Creating network python-test-visualizer_webnet
Creating service python-test-visualizer_web
Creating service python-test-visualizer_visualizer
3、web验证
查看应用程序的端口:集群任意一个节点的ip即可访问
查看visualizer 映射的8080端口:访问管理节点ip 8080即可访问
constraints: [node.role == manager] 代表只部署到管理节点上。
同时也可以用命令查看应用程序在集群中的部署:
docker stack ps python-test-visualizer
停止删除应用:
docker stack rm python-test-visualizer
持久化数据
现在让我们创建一个:提供访问者计数器的redis服务。
1、保存一个新的docker-compose-redis.yml
替换以下内容,但是一定要更换username/repo:tag
,还有image细节。最后添加了redis服务。
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: 506554897/python-web-test:part1
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
redis:
image: redis
ports:
- "6379:6379"
volumes:
- "/home/docker/data:/data"
deploy:
placement:
constraints: [node.role == manager]
command: redis-server --appendonly yes
networks:
- webnet
networks:
webnet:
注意:
以上配置文件中redis 只有名字,是因为redis在官网有一个官方形象,并获得了简单授权。
6379 :是redis预先配置端口
volumes:定义redis存放数据的地方
constraints:该部分限制redis服务部署在管理节点
redis使数据在此堆栈的部署之间持久化的规范:
redis总是在管理节点上运行,所以它总是使用相同的文件系统。
redis可以访问的主机文件系统的任意目录,此处是/home/docker/data目录。
这样规范部署可以确保两个部分:
redis服务设置了空间约束,能确保它始终使用相同的主机。
redis数据都保存在data目录下,从而保持数据连续性。
2、在管理节点上创建一个./data
目录
mkdir ./data
3、运行 docker stack deploy
命令
[docker@docker-1 ~]$ docker stack deploy -c docker-compose-redis.yml python-test-redis
Creating network python-test-redis_webnet
Creating service python-test-redis_visualizer
Creating service python-test-redis_redis
Creating service python-test-redis_webdocker stack deploy -c docker-compose-redis.yml python-test-redis
4、验证三个服务
docker service ls #查看是否运行有三个服务python-test-redis_redis visualizer web
docker stack ps python-test-redis #查看应用程序部署的情况
当然web界面的 可视化也可以验证:
当不断访问管理节点主页,计数器也在不断变化:
注意:
这里的可视化服务和redis都只部署在了管理节点,当然也可以部署在其他节点,可以将deploy修改成和web类似的配置:
deploy:
replicas: 2
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
docker 后续参考文档
本文pdf版本链接:http://down.51cto.com/data/2451861
官网应用案例:https://docs.docker.com/samples/
docker 概况:https://docs.docker.com/engine/docker-overview/
开发docker:https://docs.docker.com/develop/
配置docker网络:https://docs.docker.com/network/
管理docker应用数据:https://docs.docker.com/storage/
在生产中运行app:https://docs.docker.com/config/labels-custom-metadata/
标准和遵从性:https://docs.docker.com/compliance/
开源docker贡献:https://docs.docker.com/opensource/
docker档案文件:https://docs.docker.com/docsarchive/
转载于:https://blog.51cto.com/506554897/2173673