Docker从入门到精通(八)——Docker Compose
恭喜大家,学到这里,对于 docker 的基础玩法大家应该都会了,下面会介绍 docker的一些编排工具。
1、为什么需要 Docker Compose?
官网镇楼:https://www.runoob.com/docker/docker-compose.html
一句话概括:
帮助我们批量有规则的管理容器。
前面基础教程,我们介绍了 Dockerfile ,启动服务都是通过 Dockerfile 构建镜像,启动容器,对于几个服务,我们一个一个的build,run 还能接收,但是实际生产环境是有几百上千个的,这个时候难道我们还有手动一个一个启动吗?
另外,服务与服务之间是有依赖关系的,比如一个 Tomcat 部署的服务依赖MySQL,依赖Redis,我们启动 Tomcat 服务时,需要先启动MySQL和Redis,这个顺序也是很重要的。
有了 Docker Compose ,那我们就可以告别手动繁琐的步骤,提前定义好规则,统一管理即可。
2、Docker Compose 局限性
首先说明,Docker Compose 虽然是官方提供的容器编排工具,但是实际生产环境是不用的(用什么?比如Swarm、K8S,后面会介绍),因为其局限性很大,这里介绍大家了解即可。
只支持单机多容器,不支持集群环境管理。
3、安装
参考官方文档即可:https://docs.docker.com/compose/install/
Mac/Windows 安装docker默认提供了 Docker Compose,所以不需要我们安装,但是Linux环境需要手动安装。
3.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
上面是官方提供的,但是下载会比较慢,可以使用国内的下载地址:
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
3.2 授权
sudo chmod +x /usr/local/bin/docker-compose
3.3 验证安装
docker-compose version
3.4 卸载
sudo rm /usr/local/bin/docker-compose
4、用法
根据官方提示,使用 Docker Compose 分为三个步骤:
- 第一步:使用 Dockerfile 定义应用程序的环境。
- 第二步:使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 第三步:执行 docker-compose up 命令来启动并运行整个应用程序。
具体如何用,下面我通过两个小例子来演示说明。
5、部署WP博客
这也是官方提供的实例:https://docs.docker.com/samples/wordpress/
WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客。
5.1 创建项目目录
名称任意,用来存放 docker-compose.yml 文件
mkdir my_wordpress
我们按照官方创建一个名为 my_wordpress 目录。
5.2 创建 docker-compose.yml
新建一个 docker-compose.yml 文件,内容如下:
version: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
5.3 构建项目
docker-compose up -d
注意要切换到my_wordpress 目录,否则要增加 -f 参数指定 docker-compose.yml 文件。
看到上面截图即表示启动成功。
5.4 访问页面
另外,我们通过 docker ps 命令,也能看到启动了两个容器。
6、docker-compose.yml 规则
上面的例子很简单,但是里面有一个核心就是 docker-compsoe.yml 文件的编写,下面我们就来详细介绍这个文件的编写规则。
官方规则介绍:
# 第一层:版本
version: "3.9"
# 第二层:服务
services:
# 服务名称
db:
# 镜像名称
image: mysql:5.7
# 挂载的容器卷
volumes:
- db_data:/var/lib/mysql
# 服务挂掉是否自动重启
restart: always
# 环境变量设置
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
# 服务名称
wordpress:
# 依赖的服务
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
# 第三层:其他配置,包括网络,容器卷等等
volumes:
db_data: {}
wordpress_data: {}
其实主要就是三层配置,具体的每个配置项,大家可以看名知意,然后不懂的官网其实也有很详细的说明。
7、Docker Comopose 部署自定义服务
下面我们自己写一个服务,不用官方服务,带着大家手动玩一遍。
每次访问 Tomcat的服务,Redis计数器加1
7.1 编写 Tomcat服务
新建一个springboot项目,然后新建一个controller类:
package com.itcoke.counter.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class CounterController {
@Autowired
StringRedisTemplate redisTemplate;
@GetMapping("/visit")
public String count(HttpServletRequest request){
String remoteHost = request.getRemoteHost();
Long increment = redisTemplate.opsForValue().increment(remoteHost);
return remoteHost +"访问次数"+increment.toString();
}
}
Springboot 服务的配置文件 application.yml:
server:
port: 8080
servlet:
context-path: /counter
spring:
redis:
host: counterRedis
7.2 Dockerfile
FROM openjdk:8-jdk
COPY *.jar /counter.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/counter.jar"]
7.3 docker-compose.yml
version: "3.8"
services:
itcokecounter:
build: .
image: itcokecounter
depends_on:
- counterRedis
ports:
- "8080:8080"
counterRedis:
image: "redis:6.0-alpine"
7.4 测试
在Linux服务器新建 counter 文件夹,把下面三个文件拷贝到其中。
然后执行如下命令构建:
docker-compose up
执行完成便会出现如下启动成功界面:
然后,我们在浏览器输入网址:
http://{ip}:8080/counter/visit
每刷新一次,还会增加一次。
Docker从入门到精通(八)——Docker Compose的更多相关文章
- docker从入门到精通再到放弃
docker说明 docker三大功能:构建(build).运输(ship).运行(run),只需要记下这三大功能就可以了 1.docker入门 docker安装及配置 a.docker源配置 cur ...
- docker 从入门到精通
转载请注明出处!!!! 1.Docker 基本指令 下载镜像 docker pull 镜像名称:版本 查看已有镜像 docker images 查看已有容器 docker ps 启动docker do ...
- 《OD Docker实战》Docker从入门到精通
一. 安装Docker http://wiki.jikexueyuan.com/project/docker-technology-and-combat/ https://mos.meituan.co ...
- Docker从入门到精通(二)——安装Docker
通过上面文章,我们大概知道了什么是Docker,但那都是文字功夫,具体想要理解,还得实操,于是这篇文章带着大家来手动安装Docker. 1.官方教程 https://docs.docker.com/e ...
- Docker从入门到精通(三)——概念与执行流程
前面我们大概介绍了docker是什么以及如何安装docker,但是对里面出现的一些名词,可能大家还不熟悉,这篇文章就来为大家解惑. 1.容器化平台 Docker 是提供应用打包,部署与运行应用的容器化 ...
- Docker从入门到精通(四)——常用命令
话不多说,本篇文章给大家介绍 docker 的常用命令,基本上会覆盖我们日常使用的命令. 1.万能帮助命令 docker 命令 --help 假设你想用某个命令,但是又不知道该命令的一些参数怎么用,这 ...
- Docker从入门到精通(七)——容器数据共享
什么是容器数据共享?简单来说就是容器与容器之间数据共享,容器与宿主机数据共享. 1.为什么需要数据共享? ①.数据持久化 比如我们有一个MySQL集群,通过容器启动,那么项目运行过程中的数据是保存在容 ...
- Docker从入门到精通
1 容器简介1.1 什么是 Linux 容器1.2 容器不就是虚拟化吗1.3 容器发展简史2 什么是 Docker?2.1 Docker 如何工作?2.2 Docker 技术是否与传统的 Linux ...
- MyBatis从入门到精通(八):MyBatis动态Sql之foreach标签的用法
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用foreach ...
- Docker从入门到放弃(1) Docker简介与安装
目录 一.Docker简介 1.Docker是什么: 2.为什么有docke的出现: 3.docker与传统容器的区别: 4.docker基本组成 5.docker工作原理: 二.Docker安装 ...
随机推荐
- Mybatis类型转换BUG
案例:mybatis框架的使用中是否遇到过前台传入数据后mybatis后台并不执行sql的情况呢? 比如:前台传入一个状态var flag //空字符,0,1 然后你用int接收,到mybatis框架 ...
- nvm安装以及管理多版本node教程
安装nvm.node.npm 下载nvm安装包,推荐使用1.1.7,我个人使用1.1.8会有中文乱码的报错 点击exe文件,注意修改nvm的安装根目录以及node的安装根目录,后者是以后管理多版本no ...
- 洛谷 P2791 - 幼儿园篮球题(第二类斯特林数)
题面传送门 首先写出式子: \[ans=\sum\limits_{i=0}^m\dbinom{m}{i}\dbinom{n-m}{k-i}·i^L \] 看到后面有个幂,我们看它不爽,因此考虑将其拆开 ...
- Codeforces 1446D2 - Frequency Problem (Hard Version)(根分)
Codeforces 题面传送门 & 洛谷题面传送门 人菜结论题做不动/kk 首先考虑此题一个非常关键的结论:我们设整个数列的众数为 \(G\),那么在最优子段中,\(G\) 一定是该子段的众 ...
- Codeforces 434E - Furukawa Nagisa's Tree(三元环+点分治)
Codeforces 题面传送门 & 洛谷题面传送门 场号 hopping,刚好是我的学号(指 round 的编号) 注:下文中分别用 \(X,Y,K\) 代替题目中的 \(x,y,k\) 注 ...
- 洛谷 P7154 - [USACO20DEC] Sleeping Cows P(dp)
Portal 题意: 给出两个序列 \(a_1,a_2,\dots,a_n\),\(b_1,b_2,\dots,b_n\),\(i\) 与 \(j\) 能匹配当且仅当 \(a_i\leq b_j\). ...
- 洛谷 P3266 - [JLOI2015]骗我呢(容斥原理+组合数学)
题面传送门 神仙题. 首先乍一看此题非常棘手,不过注意到有一个条件 \(0\le x_{i,j}\le m\),而整个矩阵恰好有 \(m\) 列,这就启发我们考虑将每个元素的上下界求出来,如果我们第一 ...
- spring通过注解注册bean的方式+spring生命周期
spring容器通过注解注册bean的方式 @ComponentScan + 组件标注注解 (@Component/@Service...) @ComponentScan(value = " ...
- jenkins原理简析
持续集成Continuous Integration(CI) 原理图: Gitlab作为git server.Gitlab的功能和Github差不多,但是是开源的,可以用来搭建私有git server ...
- 去空格及换行制表符【c#】
string returnStr = tbxContractNO.Text.Replace("\n", "").Replace(" ", & ...