Docker Compose

简介

Docker
Dockerfile build run 手动操作,单个容器
微服务。100个微服务!依赖关系
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
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 Dockerfileso it can be reproduced anywhere.

  • Dockerfile保证我们的项目在任何地方可以运行。

2.Define the services that make up your app in docker-compose.ymlso they can be run together in an isolated environment.

  • services 什么是服务。
  • docker-compose.yml 这个文件怎么写

3.Run docker-compose up and Compose starts and runs your entire app.

  • 启动项目

作用:批量容器编排

理解

Compose是Docker官方的开源项目,需要安装
Dockerfile让程序在任何地方运行。web服务。redis、mysql、nginx…多个容器

Compose

version: "3.8"
services:web:build: .ports:- "5000:5000"volumes:- .:/code- logvolume01:/var/loglinks:- redisredis:image: redis
volumes:logvolume01: {}

Compose:重要的概念

  • 服务services,容器。应用。(web、redis、mysql…)
  • 项目project。一组关联的容器

安装

docker文档安装compose地址:https://docs.docker.com/compose/install/
1、下载(linux)

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 这个快点
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

快速开始

文档:https://docs.docker.com/compose/gettingstarted/

通过Docker Compose构建一个简单的python web应用程序,该程序使用Flask框架并在Redis中维护一个计数器,用来访问该Web应用被访问的次数。
1、准备工作

yum install python-pip  # pip 是Python 包管理工具
yum -y install epel-release  #报错的话执行

2、为项目创建目录

mkdir composetest
cd composetest

3、在项目目录中创建一个名为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.
4、在项目目录中创建另一个requirements.txt的文件,内容

flask
redis

5、在项目目录中,创建名为Dockerfile的文件:

FROM python:3.7-alpine
ADD ./code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python","app.py"]
#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映像中的路径中
#  将工作目录设置为/code
#  安装Python依赖项
#  将容器的默认命令设置为python app.py

6、在项目目录中创建一个名为docker-compose.yml的文件:

version: "3.8"
services:web:build: .ports:- "5000:5000"volumes:- .:/coderedis:image: "redis:alpine"# 此compose文件定义了两个服务,web和redis。该web服务
# 使用从Dockerfile当前目录中构建的图像
# 将容器上的公开端口5000转发到主机上的端口5000.使用Flask web服务器的默认端口5000
# 该redis服务使用从Docker Hub注册表中提取的公共 redis镜像

1、应用app.py
2、Dockerfile 应用打包为镜像
3、Docker-compose yaml文件(定义整个服务,需要的环境。web、redis)完整的上线服务
4、启动compose项目(docker-compose up)

流程:
1、创建网络
2、执行Docker-compose yaml
3、启动服务

Docker-compose yaml

Creating composetest_web_1 …done
Creating composetest_redis_1 …done

1、文件名composetest
2、服务

version: "3"
services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"

自动的默认规则?


docker images

[root@hadoop105 ~]# docker service ls
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.

默认的服务名 文件名_服务名_num
多个服务器。集群。A B _num 副本数量
服务redis服务=>4个副本
集群状态下。服务都不可能只有一个运行实例。弹性 、10 HA 高并发
kubectl service 负载均衡

3、网络规则
10个服务=》项目(项目中的内容都在同一个网络下,域名访问)


如果在同一个网络下,可以直接通过域名访问
HA!

停止:docker-compose down ctrl+c

以前是单个docker run启动容器
docker-compose 通过docker-compose编写yaml配置文件,可以通过compose一键启动所有服务,停止!

Docker小结:
1、Docker 镜像。run=》容器
2、Dockerfile 构建镜像(服务打包)
3、docker-compose 启动项目(编排、多个微服务/环境)
4、docker网络

yaml规则

docker-compose.yaml 核心
https://docs.docker.com/compose/compose-file/#compose-file-structure-and-examples

# 3层!
version: '' # 版本
services: # 服务服务1: web# 服务配置imagesbuildnetwork...服务2: redis...
# 其他配置 网络/卷、全局规则
volumes:
networks:
configs:


https://docs.docker.com/compose/compose-file/#specifying-durations

开源项目

博客

下载程序、安装数据库、配置
compose应用==》一键启动!
1、下载项目(compose.yaml)
2、如果需要文件。Dockerfile
3、文件准备齐全(直接一键启动项目)

前台启动
docker -d
docker-compose up -d

实战:计数器

1、编写项目微服务

@RestController
public class HelloController {@AutowiredStringRedisTemplate redisTemplate;@GetMapping("/hello")public String hello() {Long views = redisTemplate.opsForValue().increment("views");return "hello.gn"+views;}
}server.port=8080
spring.redis.host=redis

2、dockerfile构建镜像

FROM java:8COPY *.jar /app.jarCMD ["--server.port=8080"]EXPOSE 8080ENTRYPOINT ["java","-jar","/app.jar"]

3、docker-compose.yml编排项目

version: '3.8'
services:gnapp:build: .image: gnappdepends_on:- redisports:- "8080:8080"redis:image: "library/redis:alpine"

4、放到服务器 docker-compose up

  • 项目打包
  • 上传jar包、Dockerfile、docker-compose.yaml
  • docker-compose up命令

假设项目重新打包部署

docker-compose up --build #重新构建

Docker Swarm

集群的方式部署

购买服务器(4台-1核2G 一主三从)

  • 转Linux那篇文章

4服务器安装docker

(xshell同步操作省时间)同步安装
1、yum安装gcc相关环境(确保虚拟机可以上外网)

yum -y install gcc
yum -y install gcc-c++

2、卸载旧的版本

yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine

3、需要的安装包

yum install -y yum-utils

4、设置镜像的仓库

yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 推荐使用阿里云的

5、更新yum软件包索引

yum makecache fast

6、安装docker相关的 docker-ce 社区 ee 企业版

yum install -y docker-ce docker-ce-cli containerd.io

7、启动docker

systemctl start docker

8、使用docker version 是否安装成功
9、配置加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://xa2xb78w.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

工作模式

swarm地址:https://docs.docker.com/engine/swarm/

搭建集群




公网、私网 (ip addr 自己查询)

初始化节点docker swarm init

docker swarm join 加入一个节点

# 获取令牌
docker swarm join-token manager
docker swarm join-token worker


把后面的节点都搭建进去

1、生成主节点init
2、加入(管理者、worker)

目标:双主双从

Raft协议

双主双从:假设一个节点挂了!其他节点是否可用!
Raft协议:保证大多数节点存活才可以用,只要>1,集群至少大于3台
实验:
1、将docker1机器停止。宕机!双主,另外一个节点也不能使用了

2、可以将其他节点离开

3、work就是工作的,管理节点操作!3台机器设置为了管理节点

集群,可用!3个节点, >1台管理节点存活!
Raft协议:保证大多数节点存活,才可以使用,高可用

体会

弹性、扩所容!集群!
以后告别docker run!
docker-compose up!启动一个项目。单机!
集群:swarm docker service
容器=》服务!
容器=》服务!=》副本!
redis服务=》10个副本(同时开启10个redis容器)

体验

创建服务、动态扩展服务、动态更新服务

灰度发布:金丝雀发布!


创建一个服务

docker service create -p 8888:80 --name my-nginx nginx
# docker run 容器启动!不具有扩缩容器
#docker service 服务!具有扩缩容器,滚动更新!


查看服务REPLICAS

动态扩缩容

服务,集群中任意的节点都可以访问。服务可以有多个副本动态扩缩容实现高可用!

概念总结


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

  • 命令->管理->api->调度->工作节点(创建Task容器维护创建!)

  • 服务副本和全局服务

  • 调整service以什么方式运行
  • 网络模式:
    • Swarm:
    • Overlay:
    • ingress:特殊的Overlay网络!负载均衡的功能!IPVS VIP

虽然docker在4台机器上,实际网络是同一个!ingress网络,是一个特殊的Overlay网络

Docker Stack

docker-compose 单机部署项目!
Docker Stack部署,集群部署!

# 单机
docker-compose up -d wordpress.yaml
# 集群
docker stack deploy wordpress.yaml
# docker-compose 文件
version: '3.4'
services:mongo:image: mongorestart: alwaysnetworks: - mongo_networkdeploy:restart_policy:condition: on-failurereplicas: 2mongo-express: image: mongo-expressrestart: alwaysnetworks: - mongo_networkports:- target: 8081published: 80protocol: tcpmode: ingressenvironment:ME_CONFIG_MONGODB_SERVER: mongoME_CONFIG_MONGODB_PORT: 27017deploy:restart_policy:condition: on-failurereplicas: 1
networks:mongo_network:external: true

Docker Secret

安全!配置密码,证书!

Docker Config


学习方式:网上找案例跑一下试试!查看命令帮助文档 --help,官网!

扩展到k8s

云原生时代

云应用
比如电商网站下载下来,修改一些配置!就变成自己的网站

Go语言!必须掌握!Java、Go

Docker是Go开发的
k8s也是Go的项目
Etcd都是Go的项目

go 指针!-》入门-》基础语法-》高级对象-》如何操作数据库-》框架

Docker进阶篇超详细版(https://www.bilibili.com/video/BV1kv411q7Qc)相关推荐

  1. Python数据可视化之散点图(进阶篇---图文并茂详细版!!!)

    散点图进阶篇 数据获取 数据展示 数据分析 1.确定横纵坐标的选择 2.准备标签的列表与颜色 4.确定横纵坐标的值 5.绘制基础图像 数据获取 •进阶散点图可视化需要大量的数据,网上有很多获取数据的来 ...

  2. Java基础篇二 视频来源:https://www.bilibili.com/video/BV12J41137hu?p=33spm_id_from=pageDriver

    一.Java流程控制 1.scanner 二.Java方法详解 三.类和对象 1.类和对象的关系 2.构造函数:(1).使用new关键字必须使用构造器,否则会报错;new一个对象本质是在调用构造器 ( ...

  3. Docker02 狂神Docker视频学习笔记 :【狂神说Java 哔哩哔哩】Docker最新超详细版教程通俗易懂

    目录 0. 视频源 0. 学习网址 基础篇 1. Docker概述 1.1 Docker为什么出现? 1.2 Docker历史 1.3 Docker能干什么 2. Docker安装 2.1 Docke ...

  4. Docker超详细版教程通俗易懂 -之- 进阶篇

    此刻的你,已成功入门Docker.让我们一起继续深造(内容不难,很有意思) 容器数据卷 什么是容器数据卷 docker的理念回顾:将应用和环境打包成一个镜像! 数据?如果数据都在容器中,那么我们容器删 ...

  5. Docker超详细版教程通俗易懂 -之- 入门篇

    前言 学习Docker,你可以熟练的操作命令,能够把你的项目构建成Docker镜像! 是后端开发人员必备的技能!下面是自己的学习笔记,希望能帮助到需要的你! 特别感谢哔哩哔哩狂神:[狂神说Java]D ...

  6. MySQL进阶篇--超赞详尽学习笔记(好评如潮)

    目录 一.MySQL体系结构 二.存储引擎 2.1 存储引擎简介 2.2 存储引擎特点 2.3 存储引擎选择 三.索引 3.1 索引概述 3.2 索引结构 3.2.1 B-Tree 3.2.2 B+T ...

  7. 阿里云ECS服务器安装docker教程(超详细图文教程)

    文章预览: 阿里云ECS服务器安装docker教程(超详细图文教程) 一.查看服务器信息 二.安装docker 三.卸载docker 四.阿里云镜像加速器 五.篇外 阿里云ECS服务器安装docker ...

  8. 学习Nginx,看完这篇超详细的文章就够了

    目录 本文简介 一.Nginx的基本概念 1.1.Nginx是什么? 1.2.Nginx能帮助我们做些什么? 1.3.Nginx的特性 二.Nginx的安装 2.1.环境介绍 2.2.安装Nginx ...

  9. Tars环境搭建(超详细版)

    Tars环境搭建(超详细版) 简介 Tars是基于名字服务使用Tars协议的高性能RPC开发框架,同时配套一体化的服务治理平台,帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用. Ta ...

  10. Hadoop——MapReduce相关eclipse配置及Api调用(图文超详细版)(内含遇到错误的解决方法)

    一.前情提要 前面两篇文章我们已经成功搭建了Hadoop以及安装了Hive,Sqoop和Mysql数据库,现在我们就来利用Hadoop尝试做一个小实战,实现单词统计! 还没有搭建Hadoop成功的同学 ...

最新文章

  1. ​产品经理如何学机器学习——一篇以产品为中心的机器学习概论
  2. Ext智能提示 - Spket(Eclipse插件)
  3. 1-4月份我国软件业务收入15753亿元 同比增长13.1%
  4. findcontours函数_opencv轮廓findContoursamp;drawContours
  5. 有人顶贴,是对你的肯定
  6. 时间序列研(part2)--相关系数与自相关函数
  7. 帆软报表多行多条数据写入表_在线报表FineReport中多数据集如何实现层式报表...
  8. 程序员的职业生涯之我见
  9. PHP+SQLite3简约网址导航、书签管理器网站源码
  10. 蓝桥杯 算法训练 Sticks
  11. python添加一个球_在Python中创建一个旋转球体
  12. iOS申请发布证书-图文详解
  13. centeros 卸载mysql_如何卸载数据库centeros
  14. php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
  15. libevent 使用流程
  16. KUKA基坐标创建步骤
  17. canvas多维空间文本粒子js特效
  18. systemverilog中实现饱和截位和饱和截位的分析
  19. HtmlParser + HttpClient 实现爬虫
  20. 解决国内访问s3.amazonaws.com下载文件非常缓慢的问题

热门文章

  1. python爬虫获取维基百科词条
  2. PR2打印机参数设置
  3. 腾讯统一播放器 API 文档2.0
  4. 均值、均方值、方差、均方差和协方差概念及其物理意义
  5. 135编辑器代码是html吗,不会代码,你也能做背景样式!!!
  6. 题解 P1774 【最接近神的人_NOI导刊2010提高(02)】
  7. js layui 模板属性 添加_layui模板引擎如何使用 - layim
  8. 在手机相册(ios设备相册)中创建相册
  9. Tumblr面试流程
  10. linux远程取证,linux系统取证