Docker进阶篇 - (一)Docker Compose
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:
- Define your app’s environment with a
Dockerfile
so it can be reproduced anywhere. - Define the services that make up your app in
docker-compose.yml
so they can be run together in an isolated environment. - Run
docker compose up
and the Docker compose command starts and runs your entire app. You can alternatively rundocker-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相关推荐
- 【Docke进阶篇】Docker网络模式与容器间通信
本篇主要是Docker网络模式与容器间通信. 上一篇:[Docker基础篇]Docker核心概念与指令 文章目录 一.预备知识点 二.Docker网络模式 1.查看Docker网络模式 2.bridg ...
- Docker 进阶篇
1 Docker 安装MySQL主从复制 1.1 主从复制原理 MySQL 主从复制的核心就是二进制日志,过程如下 如上图所示,过程分为三步 1.master 主库在事务提交时,会把数据变更记录在二进 ...
- docker进阶篇(一) ---- Volume(数据卷)
引言 docker的镜像是由多个只读的文件系统叠加在一起形成的.当我们在我启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层.这时如果修改正在运行的容器中已有的 ...
- Docker进阶篇之DockerFile,教你用DockerFile构建镜像
文章目录 一.DockerFile介绍 二.DockerFile构建过程 三.DockerFile指令 四.实战测试 4.1 对比原生CentOS 五.CMD 和 ENTRYPOINT 的区别 5.1 ...
- Docker入门篇-搭建docker私服(注册表)
在我们开始使用docker之前,我们先把私服搭建起来,这种顺序通常适用于生产级或实际工作的时使用docker的习惯.我们遵循这样的习惯. 概念 当我们执行docker pusll xxx的时候,默认是 ...
- Docker学习篇——使用Docker部署账单微服务项目
Docker概念 Docker 是一个开源的应用容器引擎 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc) Docker 可以让开发者打包他们 ...
- 【狂神说】Docker【进阶篇】
[狂神说Java]Docker进阶篇超详细版教程通俗易懂_哔哩哔哩_bilibili 官网:https://www.docker.com/ 文档地址: https://docs.docker.com/ ...
- Docker 数据卷之进阶篇
Docker 数据卷之进阶篇 原文:Docker 数据卷之进阶篇 笔者在<Docker 基础 : 数据管理>一文中介绍了 docker 数据卷(volume) 的基本用法.随着使用的深入, ...
- 【Docker】Docker进阶(二)
Docker进阶 三.Docker发布微服务 四.Docker网络 4.1.Docker 网卡 4.2.docker网络命令 4.3.Docker 网络模式 4.3.1.bridge模式 4.3.2. ...
最新文章
- Spring Boot 多模块项目实践(附打包方法)
- Predator:比微软Kinect更强的视频追踪算法-来自捷克博士论文
- Oracle订单号就是授权号码,oracle多单号的说明
- SSH详解以及免密登录配置,深入理解
- Bootstrap3 表单帮助文本
- 【luogu3834】【POJ2104】【模板】可持久化线段树 1 [主席树]
- linux使用running网卡ping,Linux CentOS 7 IP地址配置及网络问题排查
- nodeAPI--TCP
- Not a git repository (or any of the parent directories): .git
- 记录4 最近贺题时做的题 cf611e,cf873f,cf264d,cf1320d,cf1438c,hdu6833,hdu3602,cf1187g,cf1051e,cf925d,cf840c,etc
- sqlserver2012下载地址
- MPEG-7描述子(0)——颜色空间
- html相册制作成视频,教你一招把手机相册里照片制作成视频,非常简单,一学就会...
- 35岁 学java_35岁没基础,现在去学java编程还来得及吗?应该注意哪些事项?
- Asp.Net常见问题及技术实现方案(一)
- python数据结构基础(单链表,多链表,二叉树)
- valine评论系统使用
- Word在试图打开文件时遇到错误。 请尝试下列方法: * 检查文档或驱动器的文件权限。 * 确保有足够的内存和磁盘空间。 * 用文件恢复转换器打开文件。
- 概念澄清:如何直接拿到promise的返回值
- 简单的android ant 批量打包
热门文章
- mysql 最多查询数据库_mysql 查询全表某字段值最大的10条数据
- 【idea】idea常用快捷键
- 兼容ie的文字超出显示省略号
- 北大肖臻老师《区块链技术与应用》系列课程学习笔记[10]BTC思考
- java构造函数未定义_错误:隐式超级构造函数Person()未定义.必须显式调用另一个构造函数....
- Tomcat 8080 端口被占用解决方案
- 变电所运维云平台在电力系统中的应用
- openlayer 绘制扇形
- js|BMI指数计算(含测试源码)
- linux 上plsql命令_Linux环境Oracle常用命令