设为首页 收藏本站
查看: 1079|回复: 0

[经验分享] docker 入门教程

[复制链接]

尚未签到

发表于 2019-2-21 06:30:21 | 显示全部楼层 |阅读模式
第一部分: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-
# 这里使用以下,安装最新版本
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下载链接:
  安装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#012Tryiptables -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 = "cannot connect to Redis, counter disabled"
    html = "Hello {name}!" \
    "Hostname: {hostname}" \
    "Visits: {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
    Hello World!Hostname: 017c03c8de0bVisits: cannot connect to Redis, counter disabled
  •   以分离模式运行该应用程序
      可以先用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


  •   注册用户:https://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

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.运维网.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/



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-674983-1-1.html 上篇帖子: Jenkins+svn+ansible+docker部署JAVA产品 下篇帖子: docker swarm portainer
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表