Docker Compose

简介

能够解决的问题:DockerFile build run 一次只能手动操作一个容器,如果到微服务层次,有100个微服务都有依赖关系的,那么前面的方法就显得很笨重,Docker Compose能够轻松高效的管理容器。定义运行多个容器。

官方文档介绍

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.

解读第一段

  • 定义、运行多个容器
  • YAML file配置文件配置服务
  • single command 命令有哪些

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.

解读第二段所有的环境都可以使用Compose

Using Compose is basically a three-step process:

  1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
  2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
  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.

解读第三段

三个步骤

  • Dockerfile 保证我们在项目的任何地方都能运行
  • 定义services ,需要编写docker-compose.yml
  • 启动运行项目

总结作用批量容器编排

自我理解

  • Compose 是Docker官方的开源项目,需要安装

  • Dockerfile让程序在任何地方运行

  • Compose 的YAML FILE示例

version: "3.9"  # optional since v1.27.0
services:web:build: .ports:- "5000:5000"volumes:- .:/code- logvolume01:/var/loglinks:- redisredis:image: redis
volumes:logvolume01: {}

docker-compose up启动100个服务也是一键启动部署

  • Compose:重要的概念

    • 服务:容器、应用。(web,redis,mysql…)
    • 项目project:一组关联的容器。(博客,其中有redis、mysql等服务)

安装

  • 通过官网可知,运行命令下载
# 国外的网站 下载比较慢
curl -L "https://github.com/docker/compose/releases/download/1.29.2/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

  • 授权
chmod +x /usr/local/bin/docker-compose
  • 查看版本号,有即为安装成功

快速开始

官网Get started网址:https://docs.docker.com/compose/gettingstarted/

快速开始详细步骤

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

  • 准备工作
yum install python-pip       # pip是python包管理工具
yum -y install epel-release  # 报错就执行
  • 为项目创建目录
[root@cVzhanshi home]# mkdir composetest
[root@cVzhanshi home]# cd composetest
  • 在项目目录中创建一个名为app.py的文件,内容如下:(应用app)
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)
if __name__ == "__main__":app.run(host="0.0.0.0",debug=True)

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

  • 在项目目录中创建另一个名为requirements.txt的文件, 内容如下:
flask
redis
  • 在项目目录中,创建名为Dockerfile的文件:(应用打包为镜像)
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python","app.py"]# 这告诉Docker:
# 从Python 3. 6映像开始构建映像。
# 将当前目录添加.到/code映像中的路径中
# 将工作目录设置为/code。
# 安装Python依赖项。
# 将容器的默认命令设置为python app. py。# 官网的内容
# 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-compose.yml的文件:(定义整个服务,需要的环境。web、redis。完整的上线服务)
version: "3.8"
services:web:build: .ports:- "5000:5000"volumes:- .:/coderedis:image: "redis:alpine"
  • 在项目目录下运行命令docker-compose up

流程

1、创建网络

2、执行docker-compose.yml

3、启动服务


自动的默认规则

1、文件名composetest

2、服务

version: "3.8"
services:web:build: .ports:- "5000:5000"volumes:- .:/coderedis:image: "redis:alpine"

docker images


[root@cVzhanshi ~]# 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

以后服务可能是集群,部署在多个服务器上,所以_num是副本数量

3、网络规则

10个服务由Compose => 项目 (Compose会自动将项目中的服务放在同一个网络下,可以通过域名、服务名访问)

  • 查看compose的网络详情,发现不同的服务再同一个网络下,所以可以通过域名、服务名访问
[root@cVzhanshi composetest]# docker network inspect composetest_default

停止compose服务

  • ctrl + c
  • docker-compose down


docker-compose

以前都是单个docker run 启动容器

docker-compose。通过docker-compose编写yaml配置文件,可以通过compose一键启动、停止

Docker小结

1、Docker 镜像。run => 容器

2、DockerFile 构建镜像(服务打包)

3、docker-compose 启动项目(编排、多个微服务/环境)

4、Docker 网络!

Yaml规则

官方文档:https://docs.docker.com/compose/compose-file/compose-file-v3/

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

简单介绍几个:

  • depends_on 依赖关系
version: "3.9"services:  web:    build: .    depends_on:     # web 依赖db和redis,所以启动顺序是先db和redis,然后再启动web      - db      - redis  redis:    image: redis  db:    image: postgres

实战:使用Compose一键部署WP博客

  • 创建文件夹
[root@cVzhanshi home]# mkdir my_wordpress
[root@cVzhanshi home]# cd my_wordpress/
  • 编写docker-compose.yml配置文件,内容如下:
version: "3.8"services:db:image: mysql:5.7volumes:- db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: somewordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpresswordpress:depends_on:- dbimage: wordpress:latestvolumes:- wordpress_data:/var/www/htmlports:- "8000:80"restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpressWORDPRESS_DB_NAME: wordpress
volumes:db_data: {}wordpress_data: {}
  • 一键启动
# 一键启动 前台启动
docker-compose up
# 后台启懂
docker-compose up -d


实战:自己编写计时器打包

  • 创建springboot项目,勾线web和redis依赖
  • 编写配置文件
server:port: 8080
spring:redis:host: redis
  • 编写业务controller
@RestController
public class TestController {@AutowiredStringRedisTemplate redisTemplate;@GetMapping("/hello")public String hello(){Long views = redisTemplate.opsForValue().increment("views");return "hello cvzhanshi,thank you views:" + views;}
}
  • 编写Dockerfile
FROM java:8COPY *.jar /app.jarCMD ["--server.port=8080"]EXPOSE 8080ENTRYPOINT ["java","-jar","/app.jar"]
  • 编写docker-compose.yml
version: '3.8'
services:cvzhanshiapp:build: .image: cvzhanshiappdepends_on:- redisports:- "8089:8089"redis:image: "redis:alpine"
  • 上传到服务器

  • docker-compose up命令编排启动

  • 测试

Docker进阶篇 - (一)Docker Compose相关推荐

  1. 【Docke进阶篇】Docker网络模式与容器间通信

    本篇主要是Docker网络模式与容器间通信. 上一篇:[Docker基础篇]Docker核心概念与指令 文章目录 一.预备知识点 二.Docker网络模式 1.查看Docker网络模式 2.bridg ...

  2. Docker 进阶篇

    1 Docker 安装MySQL主从复制 1.1 主从复制原理 MySQL 主从复制的核心就是二进制日志,过程如下 如上图所示,过程分为三步 1.master 主库在事务提交时,会把数据变更记录在二进 ...

  3. docker进阶篇(一) ---- Volume(数据卷)

    引言 docker的镜像是由多个只读的文件系统叠加在一起形成的.当我们在我启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层.这时如果修改正在运行的容器中已有的 ...

  4. Docker进阶篇之DockerFile,教你用DockerFile构建镜像

    文章目录 一.DockerFile介绍 二.DockerFile构建过程 三.DockerFile指令 四.实战测试 4.1 对比原生CentOS 五.CMD 和 ENTRYPOINT 的区别 5.1 ...

  5. Docker入门篇-搭建docker私服(注册表)

    在我们开始使用docker之前,我们先把私服搭建起来,这种顺序通常适用于生产级或实际工作的时使用docker的习惯.我们遵循这样的习惯. 概念 当我们执行docker pusll xxx的时候,默认是 ...

  6. Docker学习篇——使用Docker部署账单微服务项目

    Docker概念 Docker 是一个开源的应用容器引擎 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc) Docker 可以让开发者打包他们 ...

  7. 【狂神说】Docker【进阶篇】

    [狂神说Java]Docker进阶篇超详细版教程通俗易懂_哔哩哔哩_bilibili 官网:https://www.docker.com/ 文档地址: https://docs.docker.com/ ...

  8. Docker 数据卷之进阶篇

    Docker 数据卷之进阶篇 原文:Docker 数据卷之进阶篇 笔者在<Docker 基础 : 数据管理>一文中介绍了 docker 数据卷(volume) 的基本用法.随着使用的深入, ...

  9. 【Docker】Docker进阶(二)

    Docker进阶 三.Docker发布微服务 四.Docker网络 4.1.Docker 网卡 4.2.docker网络命令 4.3.Docker 网络模式 4.3.1.bridge模式 4.3.2. ...

最新文章

  1. Spring Boot 多模块项目实践(附打包方法)
  2. Predator:比微软Kinect更强的视频追踪算法-来自捷克博士论文
  3. Oracle订单号就是授权号码,oracle多单号的说明
  4. SSH详解以及免密登录配置,深入理解
  5. Bootstrap3 表单帮助文本
  6. 【luogu3834】【POJ2104】【模板】可持久化线段树 1 [主席树]
  7. linux使用running网卡ping,Linux CentOS 7 IP地址配置及网络问题排查
  8. nodeAPI--TCP
  9. Not a git repository (or any of the parent directories): .git
  10. 记录4 最近贺题时做的题 cf611e,cf873f,cf264d,cf1320d,cf1438c,hdu6833,hdu3602,cf1187g,cf1051e,cf925d,cf840c,etc
  11. sqlserver2012下载地址
  12. MPEG-7描述子(0)——颜色空间
  13. html相册制作成视频,教你一招把手机相册里照片制作成视频,非常简单,一学就会...
  14. 35岁 学java_35岁没基础,现在去学java编程还来得及吗?应该注意哪些事项?
  15. Asp.Net常见问题及技术实现方案(一)
  16. python数据结构基础(单链表,多链表,二叉树)
  17. valine评论系统使用
  18. Word在试图打开文件时遇到错误。 请尝试下列方法: * 检查文档或驱动器的文件权限。 * 确保有足够的内存和磁盘空间。 * 用文件恢复转换器打开文件。
  19. 概念澄清:如何直接拿到promise的返回值
  20. 简单的android ant 批量打包

热门文章

  1. mysql 最多查询数据库_mysql 查询全表某字段值最大的10条数据
  2. 【idea】idea常用快捷键
  3. 兼容ie的文字超出显示省略号
  4. 北大肖臻老师《区块链技术与应用》系列课程学习笔记[10]BTC思考
  5. java构造函数未定义_错误:隐式超级构造函数Person()未定义.必须显式调用另一个构造函数....
  6. Tomcat 8080 端口被占用解决方案
  7. 变电所运维云平台在电力系统中的应用
  8. openlayer 绘制扇形
  9. js|BMI指数计算(含测试源码)
  10. linux 上plsql命令_Linux环境Oracle常用命令