恭喜大家,学到这里,对于 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 访问页面

http://宿主机IP:8000

另外,我们通过 docker ps 命令,也能看到启动了两个容器。

6、docker-compose.yml 规则

上面的例子很简单,但是里面有一个核心就是 docker-compsoe.yml 文件的编写,下面我们就来详细介绍这个文件的编写规则。

官方规则介绍:

https://docs.docker.com/compose/compose-file/

# 第一层:版本
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的更多相关文章

  1. docker从入门到精通再到放弃

    docker说明 docker三大功能:构建(build).运输(ship).运行(run),只需要记下这三大功能就可以了 1.docker入门 docker安装及配置 a.docker源配置 cur ...

  2. docker 从入门到精通

    转载请注明出处!!!! 1.Docker 基本指令 下载镜像 docker pull 镜像名称:版本 查看已有镜像 docker images 查看已有容器 docker ps 启动docker do ...

  3. 《OD Docker实战》Docker从入门到精通

    一. 安装Docker http://wiki.jikexueyuan.com/project/docker-technology-and-combat/ https://mos.meituan.co ...

  4. Docker从入门到精通(二)——安装Docker

    通过上面文章,我们大概知道了什么是Docker,但那都是文字功夫,具体想要理解,还得实操,于是这篇文章带着大家来手动安装Docker. 1.官方教程 https://docs.docker.com/e ...

  5. Docker从入门到精通(三)——概念与执行流程

    前面我们大概介绍了docker是什么以及如何安装docker,但是对里面出现的一些名词,可能大家还不熟悉,这篇文章就来为大家解惑. 1.容器化平台 Docker 是提供应用打包,部署与运行应用的容器化 ...

  6. Docker从入门到精通(四)——常用命令

    话不多说,本篇文章给大家介绍 docker 的常用命令,基本上会覆盖我们日常使用的命令. 1.万能帮助命令 docker 命令 --help 假设你想用某个命令,但是又不知道该命令的一些参数怎么用,这 ...

  7. Docker从入门到精通(七)——容器数据共享

    什么是容器数据共享?简单来说就是容器与容器之间数据共享,容器与宿主机数据共享. 1.为什么需要数据共享? ①.数据持久化 比如我们有一个MySQL集群,通过容器启动,那么项目运行过程中的数据是保存在容 ...

  8. Docker从入门到精通

    1 容器简介1.1 什么是 Linux 容器1.2 容器不就是虚拟化吗1.3 容器发展简史2 什么是 Docker?2.1 Docker 如何工作?2.2 Docker 技术是否与传统的 Linux ...

  9. MyBatis从入门到精通(八):MyBatis动态Sql之foreach标签的用法

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用foreach ...

  10. Docker从入门到放弃(1) Docker简介与安装

    ​ 目录 一.Docker简介 1.Docker是什么: 2.为什么有docke的出现: 3.docker与传统容器的区别: 4.docker基本组成 5.docker工作原理: 二.Docker安装 ...

随机推荐

  1. 痞子衡嵌入式:嵌入式Cortex-M系统中断延迟及其测量方法简介

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是Cortex-M系统中断延迟及其测量方法. 在嵌入式领域里,实时性是个经常被我们挂在嘴边的概念,这里的实时性主要强调得是当外界事件发生时 ...

  2. Java安全之Axis漏洞分析

    Java安全之Axis漏洞分析 0x00 前言 看到个别代码常出现里面有一些Axis组件,没去仔细研究过该漏洞.研究记录一下. 0x01 漏洞复现 漏洞版本:axis=<1.4 Axis1.4 ...

  3. Atcoder M-SOLUTIONS Programming Contest C - Best-of-(2n-1)(无穷级数求和+组合恒等式)

    Atcoder 题面传送门 & 洛谷题面传送门 无穷级数求和的简单题,稍微写写吧,正好也算帮我回忆下组合数这一块的内容. 首先我们不妨假设 A 赢,B 赢的情况就直接镜像一下即可.我们枚举 B ...

  4. 巩固javaweb第十二天

    巩固内容: HTML 图像- 图像标签( <img>)和源属性(Src) 在 HTML 中,图像由<img> 标签定义. <img> 是空标签,意思是说,它只包含属 ...

  5. apostrophe

    apostrophe 者,', 0x27, 十进制39,ASCII里的single quote (单引号) 也.one of the 'inverted commas'. 在书写上可以表示所有格.省略 ...

  6. accessory, accident

    accessory 1. belt, scarf, handbag, Penny用rhinestone做的小首饰(Penny Blossom)都是accessory2. With default se ...

  7. cephfs文件系统场景

    创建cephfs文件系统: [cephfsd@ceph-admin ceph]$ cd /etc/ceph [cephfsd@ceph-admin ceph]$ ceph fs ls No files ...

  8. java9 模块化 jigsaw

    java9并没有在语言层面做出很多改变,而是致力于一些新特性,如模块化,其核心就是解决历史遗留问题,为以后的jar包森林理清道路.模块化是一个很大的命题,就不讲那么细致了,关于java9的特性也有很多 ...

  9. Spark基础:(五)Spark编程进阶

    共享变量 (1)累加器:是用来对信息进行聚合的,同时也是Spark中提供的一种分布式的变量机制,其原理类似于mapreduce,即分布式的改变,然后聚合这些改变.累加器的一个常见用途是在调试时对作业执 ...

  10. 谈谈你对volatile的理解

    1.volatile是Java虚拟机提供的轻量级的同步机制 1.1保证可见性1.2不保证原子性1.3禁止指令重排 JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象 ...