docker 入门教程

第一部分: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

  1. 通过设置仓库,yum安装docker-ce
  2. 通过下载rpm包,手动安装docker-ce

1、yum安装docker

设置docker-ce仓库

  1. 安装需求数据包,yum-utils提供了yum-config-manager实用工具,device-mapper-persistent-datalvm2 提供了devicemapper存储驱动器。

    yum install -y yum-utils \
     device-mapper-persistent-data \
     lvm2
  2. 设置仓库

    yum-config-manager \
       --add-repo \
       https://download.docker.com/linux/centos/docker-ce.repo
  3. 激活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’镜像 创建一个新的容器运行。当运行容器的时候,会打印一些信息后并自动退出。
docker 入门教程

2、手动下载安装docker-ce

rpm下载链接:<https://download.docker.com/linux/centos/7/x86_64/stable/Packages/&gt;

安装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
docker 入门教程

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应用程序

  1. 创建一个空目录,并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"]
  2. 接下来创建requirements.txt文件

    [docker@localhost pythonweb]$  vi requirements.txt 
    Flash
    Redis
  3. 创建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)
  4. 用Build命令创建一个Docker image,使用-t 指定一个 镜像名字

    docker build -t python-web-test .
  5. 查看创建的“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
  6. 为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 .
  7. 运行应用程序

    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 -
  8. web浏览器验证
    docker 入门教程

    也可以命令行验证:

    [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>
  9. 以分离模式运行该应用程序

    可以先用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

    docker 入门教程

分享镜像到hub.docker.com

  1. 注册用户:https://hub.docker.com/

  2. 登录: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
  3. 给镜像指定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
  4. 上传镜像到[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 入门教程

  5. 现在就可以在别的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)

docker 入门教程

缩放应用程序的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 端口了。

docker 入门教程

docker 入门教程

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即可访问

docker 入门教程

查看visualizer 映射的8080端口:访问管理节点ip 8080即可访问

constraints: [node.role == manager] 代表只部署到管理节点上。

docker 入门教程

同时也可以用命令查看应用程序在集群中的部署:

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界面的 可视化也可以验证:
docker 入门教程

当不断访问管理节点主页,计数器也在不断变化:

docker 入门教程

注意:

这里的可视化服务和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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值