Dockers Compose

简介

dockerFile bulid run 手动操作,单个容器。
微服务,将会有多个微服务容器!
Docker Compose 来轻松高效管理容器。运行多个容器

官方介绍

定义运行多个容器
YAML file 配置文件
single command 命令

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.
Using Compose is basically a three-step process:

1.Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
dockerfile 保证了我们的项目可以在任何地方运行
2.Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
services 什么是服务
docker-compose.yml 文件怎么写?
3.Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.

服务service 容器 应用 web redis mysql …
项目project 一组关联的容器 博客 web mysql …

安装

1、下载

 sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose


2、授权

 sudo chmod +x /usr/local/bin/docker-compose


安装成功

体验一下

第 1 步:设置
定义应用程序依赖项。

为项目创建一个目录:

 mkdir composetestcd composetest

app.py在您的项目目录中创建一个名为的文件并将其粘贴到:

import timeimport redis
from flask import Flaskapp = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5)@app.route('/')
def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.\n'.format(count)

在此示例中,redis是应用程序网络上的 redis 容器的主机名。我们使用 Redis 的默认端口6379。

处理瞬态错误

注意get_hit_count函数的编写方式。如果 redis
服务不可用,这个基本的重试循环让我们可以多次尝试我们的请求。这在应用程序上线时的启动时很有用,但如果 R​​edis
服务需要在应用程序的生命周期内随时重新启动,这也会使我们的应用程序更具弹性。在集群中,这也有助于处理节点之间的瞬时连接中断。

requirements.txt在您的项目目录中创建另一个文件并将其粘贴到:

flask
redis

第 2 步:创建一个 Dockerfile
在此步骤中,您将编写一个用于构建 Docker 映像的 Dockerfile。该图像包含 Python 应用程序所需的所有依赖项,包括 Python 本身。

在您的项目目录中,创建一个名为Dockerfile并粘贴以下内容的文件:

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
这告诉 Docker:从 Python 3.7 映像开始构建映像。
将工作目录设置为/code.
设置flask命令使用的环境变量。
安装 gcc 和其他依赖项
复制requirements.txt并安装 Python 依赖项。
将元数据添加到图像以描述容器正在侦听端口 5000
将.项目中的当前目录复制到.镜像中的workdir 。
将容器的默认命令设置为flask run.
有关如何编写 Dockerfile 的更多信息,请参阅 Docker 用户指南 和Dockerfile 参考。第 3 步:在 Compose 文件中定义服务
docker-compose.yml在您的项目目录中创建一个名为的文件并粘贴以下内容:version: "3.9"
services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"

这个 Compose 文件定义了两个服务:web和redis.

网络服务
该web服务使用从Dockerfile当前目录中构建的映像。然后它将容器和主机绑定到暴露的端口5000. 此示例服务使用 Flask Web 服务器的默认端口5000.

Redis服务
该redis服务使用 从 Docker Hub 注册表中提取的公共Redis映像。

第 4 步:使用 Compose 构建并运行您的应用程序
从您的项目目录,通过运行启动您的应用程序docker-compose up。

 docker-compose up
 oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0OoRedis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just startedWarning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.confWARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.Server initializedWARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

Compose 会拉取一个 Redis 镜像,为您的代码构建一个镜像,并启动您定义的服务。在这种情况下,代码会在构建时静态复制到映像中。

在浏览器中输入 http://localhost:5000/ 以查看应用程序正在运行。

如果您在 Linux 上本地使用 Docker、Mac 的 Docker 桌面或 Windows 的 Docker 桌面,那么 Web 应用程序现在应该在 Docker 守护程序主机上的端口 5000 上进行侦听。将 Web 浏览器指向 http://localhost:5000 以查找Hello World消息。如果这不能解决,您也可以尝试 http://127.0.0.1:5000。

如果您在 Mac 或 Windows 上使用 Docker Machine,请使用docker-machine ip MACHINE_VM获取 Docker 主机的 IP 地址。然后,http://MACHINE_VM_IP:5000在浏览器中打开 。

您应该在浏览器中看到一条消息:

Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

以前是一个一个容器 启动 现在是所有服务一起启动

yaml规则

docker-compose.yaml
https://docs.docker.com/compose/profiles/

#3层 概念
#版本
version: "3.9"
#服务
services:#其他配置
volumes:
networks:
configs:

Docker Swarm

Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。

前置条件:四台服务器

建立集群

 docker swarm init [OPTIONS]

可以先 docker swarm – help 看下

再看 docker swarm init --help


名称,简写                默认  描述
--advertise-addr            广告地址(格式:<ip|interface>[:port])
--autolock                  启用管理器自动锁定(需要解锁密钥才能启动已停止的管理器)
--availability  active      节点的可用性(“活动”|“暂停”|“排水”)
--cert-expiry   2160h0m0s   节点证书的有效期 (ns|us|ms|s|m|h)
--data-path-addr            API 1.31+ 用于数据路径流量的地址或接口(格式:<ip|interface>)
--data-path-port            API 1.40+用于数据路径流量的端口号 (1024 - 49151)。如果未设置任何值或设置为 0,则使用默认端口 (4789)。
--default-addr-pool         API 1.39+CIDR 格式的默认地址池
--default-addr-pool-mask-length 24  API 1.39+默认地址池子网掩码长度
--dispatcher-heartbeat  5s  调度器心跳周期 (ns|us|ms|s|m|h)
--external-ca               一个或多个证书签名端点的规范
--force-new-cluster         强制从当前状态创建一个新集群
--listen-addr   0.0.0.0:2377    监听地址(格式:<ip|interface>[:port])
--max-snapshots             API 1.25+ 要保留的额外 Raft 快照的数量
--snapshot-interval 10000   API 1.25+Raft 快照之间的日志条目数
--task-history-limit    5   任务历史保留限制


加入一个工作节点

自动生成节点令牌

$ docker swarm join-token workerTo add a worker to this swarm, run the following command:docker swarm join \--token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \172.17.0.2:2377$ docker swarm join-token managerTo add a manager to this swarm, run the following command:docker swarm join \--token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 \172.17.0.2:2377

Raft协议

现在集群是双主双从的 假设一个节点挂了 还可以用嘛?
Raft协议:保证大多数节存活才可以使用,只要>1,集群至少大于三台!

1
只有两台的时候 宕机一个 管理主节点 整个集群都会变得不可用了 所以 要实现高可用 至少得有三个管理者节点

动态扩缩容

弹性、扩缩容!集群!
以后使用 docker service 启动容器

集群:swarm
容器=》服务!
容器=》服务!=》副本!
redist服务=》10个副本 !


在外部请求看来 整个集群是一个整体的 无论你从哪个节点访问里面的访问 这个请求都是对于整体的
也就是说 你请求 1 节点里面的 nignx 哪怕 1里面没有这个容器 只要集群里面 有 那就可以访问得到

#创建一个服务 (不在用run创建容器)
docker service create -p 8888:80 --name my-nignx nignx

当你需要更多的 容器应对请求的时候

docker service update --replicas 100 my-nignx

动态添加100个 nignx 容器 不用停下服务 而且会自动负载均衡添加到各个容器上面去
要减少的时候也可以 这个 数量是 总容器的数量 在执行指令之后 他就保持这个数量的容器

所以 实现了 动态扩缩容 不用再一个一个容器去添加

概念总结
swarm
集群的管理和编号,docker可以初始化一个swarm集群,其他节点可以加入。(管理者,工作)
Node
就是一个docker节点 ,多个节点就组成了一个网络集群
service
任务 ,可以在管理节点或者工作节点来运行,核心!用户访问!
Task
容器内的命令,细节任务!

命令->管理->api->调度->工作节点(创建task维护创建)

肥仔学习日记----Docker Compose相关推荐

  1. 肥仔学习日记----Docker

    Docker学习 Docker概述 Dokcer安装 Docker命令 镜像命令 容器数据卷 操作命令 - Docker镜像 容器数据卷 DockerFile Docker网络原理 IDEA整合Doc ...

  2. Docker学习笔记 - Docker Compose

    一.概念 Docker Compose 用于定义运行使用多个容器的应用,可以一条命令启动应用(多个容器). 使用Docker Compose 的步骤: 定义容器 Dockerfile 定义应用的各个服 ...

  3. Docker容器化实战第七课 容器编排Docker Compose、Docker Swarm 和 Kubernetes

    19 如何使用 Docker Compoe 解决开发环境的依赖? 前两个模块,我们从 Docker 的基本操作到 Docker 的实现原理,为你一步一步揭开了 Docker 神秘的面纱.然而目前为止, ...

  4. Docker Compose学习之docker-compose.yml编写规则 及 实战案例

    [Docker那些事]系列文章 docker 安装 与 卸载 centos Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT ...

  5. dockers-系统学习-docker compose服务编排

    dockers-系统学习-docker compose服务编排 一.服务编排 1.1.概念 按照一定的业务规则批量管理容器 1.2.问题 微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会 ...

  6. Docker 学习笔记 - 进阶四 Docker网络和 Docker compose

    Docker 学习笔记 - 进阶四 Docker网络和 Docker compose 4. docker 网络 4.1 docker network是什么 4.1.1 docker不启动,默认网络情况 ...

  7. Docker学习之路05:五分钟用docker compose搭建一个自己的个人博客网站!

    五分钟用docker compose搭建一个自己的个人博客网站! Docker学习路线传送门: Docker学习之路01:Docker的安装 Docker学习之路02:阿里云镜像加速器 Docker学 ...

  8. 从零开始学习docker(十二)介绍Docker Compose基本使用

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 默认情况下在mac或者Windows安装docker的时候会自动安装docker-compose.对于Linux ...

  9. 从零开始学习docker(十一)介绍Docker Compose yml文件介绍

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 如果我们有一个App,他由多个container组成,那么这个App的维护会非常繁琐. 包括: 要从Docker ...

最新文章

  1. LeetCode实战:环形链表
  2. c++ RTTI(运行时类型识别)
  3. RNA-seq【分析记录】
  4. Mybatis 学习日记(1)
  5. 如何专业化监控一个Kubernetes集群?
  6. 高斯 matlab程序,高斯金字塔 matlab程序实现
  7. loading怎么关闭 vant_vant-ui组件调用Dialog弹窗异步关闭操作
  8. 《Python编程从入门到实践》记录之Python函数返回值
  9. 揭开 Facebook Growth Hacking 的神秘面纱,微信、人人为何都在效仿?
  10. 力扣76,最小覆盖字串(JavaScript)
  11. 微信小程序开源框架wxSortPickerView:微信小程序首字母排序选择表
  12. html展示微信昵称特殊字符,微信昵称特殊符号(独一无二的特殊符号)
  13. crm系统服务器要求,crm系统需要配备什么云服务器
  14. Python 离散小波变换(DWT) pywt库
  15. 收藏!转型AI工程师必读
  16. 在线loading图标生成网站
  17. 云顶之奕pbe服务器注册,云顶之弈手游pbe服
  18. Java 编程技巧之样板代码
  19. 物流快递电子面单HTML接口API代码-快递100
  20. html/css/javascript-编辑器

热门文章

  1. MD5 加密和解密
  2. html图片形状,用CSS代码写出的各种形状图形的方法
  3. 嵌套结构体初始化的几种方式
  4. CCRC资质证书的维护方法
  5. SIM(USIM)卡中的数据和2G/3G网络的鉴权
  6. 移动安全 - 安全军火库调查
  7. 浅析EasyCVR视频技术与AR实景智能管理平台在智慧厂区中的应用
  8. 关押罪犯 - C++
  9. 《C语言杂记》理解字符串处理函数 strlen() strcpy() strcat() strcmp()
  10. How To Uninstall Nero 9