spring boot / cloud (十八) 使用docker快速搭建本地环境
spring boot / cloud (十八) 使用docker快速搭建本地环境
在平时的开发中工作中,环境的搭建其实一直都是一个很麻烦的事情
特别是现在,系统越来越复杂,所需要连接的一些中间件也越来越多.
然而要顺利的安装好这些中间件也是一个比较费时费力的工作.
俗话说"工欲善其事,必先利其器",这篇文章,就跟大家一起分享一下使用docker在本地环境或者测试环境快速搭建我们常用的一些中间件容器的方法,
(这里没有提及生产环境,并不是说生产环境不能使用docker,只是说要在生产环境上使用,请务必根据自身的实际情况,做好充分的评估)
docker安装
docker支持多种操作系统,本文的内容则是基于centos7操作系统的
docker的文档写的很清晰,大家可以在
https://docs.docker.com/engine/installation/linux/docker-ce/centos/
站点中按照文档的步骤一步一步的安装docker , 假如一切正常 , 大家在命令行输入version , 会得到如下结果 :
$ sudo docker version
# 结果输出 :
Client:
Version: 17.09.0-ce-rc2
API version: 1.32
Go version: go1.8.3
Git commit: 363a3e7
Built: Thu Sep 14 01:54:43 2017
OS/Arch: linux/amd64
Server:
Version: 17.09.0-ce-rc2
API version: 1.32 (minimum version 1.12)
Go version: go1.8.3
Git commit: 363a3e7
Built: Thu Sep 14 01:56:05 2017
OS/Arch: linux/amd64
Experimental: false
常用的docker的基本命令
docker images : 列出当前docker所有的镜像
docker ps -a : 列出当前docker正在运行中的容器 , 去掉-a , 则列出所有的容器
docker rmi {镜像ID} : 删除docker镜像 , 追加-f指令 , 则为强制删除镜像 (删除镜像后,关联此镜像的容器也会被删除)
docker rm {容器ID/容器名称} : 删除容器 , 追加-f指令 , 则为强制删除容器
docker run XXXX : 运行容器 , 本文后续会对run命令的相关指令做详细解释
docker stop {容器ID/容器名称} : 停止容器
docker start {容器ID/容器名称} : 启动容器
docker stats : 查看docker所有容器的运行状态
docker log {容器ID/容器名称} : 查看容器的运行日志
docker cp {容器ID/容器名称}:{容器路径} {宿主机路径} : 从容器中拷贝文件到宿主机
docker exec -it {容器ID/容器名称} /bin/bash : 进入指定容器进行操作 , 使用exit退出
docker的命令还有很多 , 大家可以在 :
https://docs.docker.com/reference/
站点中找到其他命令的文档
docker run 命令的主要参数
一般情况,我们使用run命令来创建一个容器 , 此命令的主要格式如下 :
docker run {指令/参数} {registry地址}/{组织名称}/{镜像名称}:{版本}
docker镜像的唯一标识
{registry地址}/{组织名称}/{镜像名称}:{版本} 这一串内容组成了一个docker镜像唯一的标识 , 具体值可能是这样的 :
wjrfy32i.mirror.aliyuncs.com/library/nginx:latest
以上字符串描述了阿里云的nginx镜像,然后是latest版本 (指的是最新版本)
docker run命令的常用指令
-d : 容器后台启动
-it : 容器交互式启动
-p {宿主机端口}:{容器端口} : 指定宿主机和容器端口的映射关系 , 可以多个
--name {容器名称} : 指定容器的名字
-v {宿主机目录}:{容器目录} : 将宿主机文件目录映射到容器的文件目录中 , 可以多个
--restart=always : 指定容器永远随docker服务启动
--hostname {容器hostname} : 指定容器的hostname
--link={容器名称}:{hostname} : 将其他容器加入当前容器的hosts文件中,并且指定其访问的hostname , 可以多个
**其他指令
-e TZ="Asia/Shanghai" : 指定容器的时区
-v /etc/localtime:/etc/localtime:ro : 设置容器的时钟与宿主机一致
创建mysql容器
准备
$ sudo mkdir /var/lib/mysql && chown -R 200 /var/lib/mysql
以上命令创建了一个目录,用于存放mysql数据库文件
创建
$ sudo docker run \
-d \
--restart=always \
-p 3306:3306 \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime:ro \
-v /var/lib/mysql:/var/lib/mysql \
--name mysql \
-e MYSQL_ROOT_PASSWORD=XXX \
wjrfy32i.mirror.aliyuncs.com/library/mysql:latest
其中-e MYSQL_ROOT_PASSWORD=XXX指定了mysql数据库的root密码
创建rabbitmq容器
准备
$ sudo mkdir /var/lib/rabbitmq && chown -R 200 /var/lib/rabbitmq
$ sudo mkdir /var/log/rabbitmq && chown -R 200 /var/log/rabbitmq
以上命令创建了用于存放rabbitmq数据文件和日志文件的路径
创建
$ sudo docker run \
-d \
--restart=always \
--hostname rabbitmq \
--name rabbitmq \
-p 15672:15672 \
-p 5672:5672 \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime:ro \
-v /var/lib/rabbitmq:/var/lib/rabbitmq \
-v /var/log/rabbitmq:/var/log/rabbitmq \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=xxx \
wjrfy32i.mirror.aliyuncs.com/library/rabbitmq:3.6.10-management-alpine
其中-e RABBITMQ_DEFAULT_USER和-e RABBITMQ_DEFAULT_PASS用于指定rabbitmq控制台管理员的账户和密码
创建redis容器
准备
$ sudo mkdir /var/lib/redis && chown -R 200 /var/lib/redis
$ sudo mkdir /var/lib/redis_conf && chown -R 200 /var/lib/redis_conf
以上命令创建了用于存放redis数据文件和配置文件的目录
另外,配置文件可以从redis.conf可以从redis官网获取,并且上传至宿主机的/var/lib/redis_conf目录
创建
$ sudo docker run \
-d \
--restart=always \
--hostname redis \
--name redis \
-p 6379:6379 \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime:ro \
-v /var/lib/redis:/data \
-v /var/lib/redis_conf/redis.conf:/usr/local/etc/redis/redis.conf \
wjrfy32i.mirror.aliyuncs.com/library/redis:latest \
redis-server /usr/local/etc/redis/redis.conf
在将宿主机的/var/lib/redis_conf/redis.conf映射到容器中,并且指定redis-server使用的配置文件
创建nginx容器
准备
$ sudo mkdir /var/lib/nginx && chown -R 200 /var/lib/nginx
$ sudo mkdir /var/lib/nginx/conf.d && chown -R 200 /var/lib/nginx/conf.d
$ sudo mkdir /var/lib/nginx_conf && chown -R 200 /var/lib/nginx_conf
$ sudo mkdir /var/lib/nginx_content && chown -R 200 /var/lib/nginx_content
$ sudo mkdir /var/log/nginx && chown -R 200 /var/log/nginx
$ sudo mkdir /var/lib/nginx_file && chown -R 200 /var/lib/nginx_file
$ sudo docker run -d --hostname nginx --name nginx -p 80:80 wjrfy32i.mirror.aliyuncs.com/library/nginx:latest
$ sudo docker cp nginx:/etc/nginx/nginx.conf /var/lib/nginx/nginx.conf
$ sudo docker cp nginx:/etc/nginx/conf.d/default.conf /var/lib/nginx/conf.d/default.conf
$ sudo docker cp nginx:/usr/share/nginx/html/50x.html /var/lib/nginx_content/50x.html
$ sudo docker cp nginx:/usr/share/nginx/html/index.html /var/lib/nginx_content/index.html
$ sudo docker rm -f nginx
以上命令创建了一些列目录,用于存放nginx的静态文件以及配置文件,
并且使用cp命令从nginx中拷贝了原始的配置文件,以及默认的html文件
最后删除了用于拷贝文件而创建的容器
创建
$ sudo docker run \
-d \
--restart=always \
--hostname nginx \
--name nginx \
--link=rabbitmq:rabbitmq \
-p 81:81 \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime:ro \
-v /var/lib/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /var/lib/nginx/conf.d:/etc/nginx/conf.d:ro \
-v /var/lib/nginx_content:/usr/share/nginx/html:ro \
-v /var/lib/nginx_file:/usr/share/nginx/file:ro \
-v /var/log/nginx:/var/log/nginx \
wjrfy32i.mirror.aliyuncs.com/library/nginx:latest
以上命令映射了一系列目录到容器中,主要用于不同场景的静态文件
将spring boot应用打包成docker镜像
在pom中添加插件
<!-- docker -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>192.168.1.10:5000/${project.groupId}/${project.artifactId}:latest</imageName>
<baseImage>192.168.1.10:5000/org.itkk/java:8</baseImage>
<maintainer>wangkangit@163.com</maintainer>
<exposes>${server.port}</exposes>
<cmd></cmd>
<entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
imageName : 指定镜像的唯一标志,这里使用maven的groupId和artifactId来设定
baseImage : 指定镜像的父类镜像 , 这里指定的是java8的镜像
maintainer : 指定镜像的作者
exposes : 指定镜像所开放的端口好 , 这里跟应用的端口号一致
entryPoint : 指容器的时候,应该执行的命令,这里通过java -jar命令启动的spring boot应用
构建
$ sudo mvn clean install package docker:build
执行以上命令,在maven构建完成后docker:build会将其构建成docker镜像
注意
自己创建镜像需要有docker registry支持 , 可以使用公共的 , 也可以自建 .
本文因篇幅原因 , 不讲解docker registry的搭建过程 , 有兴趣的同学可以自行百度 .
另外 , 由于构建出来的镜像往往会比较大(至少有100M左右) , 所以使用公共docker registry的同学 , 请注意网速问题 .
结束
在以上的内容中 , 我们创建了rabbitmq,mysql,nginx,rabbitmq这4个常用的中间件 ,
使用docker命令 , 我们可以非常快速的创建这些服务 ,
相比传统的方式来说 , 确实节省了不少的时间和经历 .
当然 , 以上内容都是一些基本的玩法 , docker能做到的事情远不只这些 .
有兴趣的同学可深入了解 .
关于本文内容 , 欢迎大家的意见跟建议
代码仓库 (博客配套代码)
想获得最快更新,请关注公众号

spring boot / cloud (十八) 使用docker快速搭建本地环境的更多相关文章
- 使用docker快速搭建本地环境
在平时的开发中工作中,环境的搭建其实一直都是一个很麻烦的事情 特别是现在,系统越来越复杂,所需要连接的一些中间件也越来越多. 然而要顺利的安装好这些中间件也是一个比较费时费力的工作. 俗话说" ...
- spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法
spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...
- spring boot / cloud (十五) 分布式调度中心进阶
spring boot / cloud (十五) 分布式调度中心进阶 在<spring boot / cloud (十) 使用quartz搭建调度中心>这篇文章中介绍了如何在spring ...
- spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的?
spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的? 消息中间件在解决异步处理,模块间解耦和,和高流量场景的削峰,等情况下有着很广泛的应用 . 本文将跟大家一起 ...
- spring boot / cloud (十二) 异常统一处理进阶
spring boot / cloud (十二) 异常统一处理进阶 前言 在spring boot / cloud (二) 规范响应格式以及统一异常处理这篇博客中已经提到了使用@ExceptionHa ...
- spring boot / cloud (十六) 分布式ID生成服务
spring boot / cloud (十六) 分布式ID生成服务 在几乎所有的分布式系统或者采用了分库/分表设计的系统中,几乎都会需要生成数据的唯一标识ID的需求, 常规做法,是使用数据库中的自动 ...
- 使用Docker快速搭建ELK环境
今天由于Win系统的笔记本没带回家,其次Docker在非Linux系统下都需要安装额外的软件去镜像才行 所以感觉没有差别,先直接用Mac搭建一遍呢, 本篇部分命令和配置内容为摘抄 Mac下使用Dock ...
- 使用docker快速搭建hive环境
记录一下使用docker快速搭建部署hive环境 目录 写在前面 步骤 安装docker 安装docker 安装docker-compose 配置docker国内镜像源(可选) 安装git & ...
- Spring boot入门(一):快速搭建Spring boot项目
(一)Spring boot介绍 本部分摘自:https://www.zhihu.com/question/64671972/answer/223383505 Spring Boot是由Pivotal ...
随机推荐
- -webkit-overflow-scrolling 与滚动回弹效果.
参考来源:https://developer.mozilla.org/zh-CN/docs/Web/CSS/-webkit-overflow-scrolling https://www.w3cways ...
- C# 实现模拟登录功能,实现公共类分享。
前言 最近在研究模拟登录的各种方法, 主要想要实现的两个功能是: 1.点击按钮可以直接跳转并登录到某一个系统中. 2.抓取某一个系统中某一个页面中的特定数据. 为此在网上查了许多的资料,首先了解到自身 ...
- Struts2文件下载中文名乱码
Struts2中提供了快捷的下载方式,通过配置struts.xml文件即可实现文件的下载,但是功能实现后下载文件的文件名却出现乱码,或者直接来个***.action,让人很是无语,但很显然,这是中文乱 ...
- 处理 Vue 单页面应用 SEO 的另一种思路
vue-meta-info 官方地址: monkeyWangs/vue-meta-info (设置vue 单页面meta info信息,如果需要单页面SEO,可以和 prerender-spa-plu ...
- 融会贯通——最常用的“合成复用原则”技能点Get
复用一个类的时候,多使用对象的组合/聚合的关联关系,而不是继承. 之前提到的"依赖倒转原则",是以里氏代换原则为基础的实现开闭原则目标的手段,这一条路线涉及到的是类的继承(包括单继 ...
- c89和c99中/运算符和%运算符为负数时的区别
运算式 -8 / 5 = -1.6,在C89中取值为 -1 或 -2,C99的出现,CPU对除法的结果向零取整,上述运算式结果为 -1. 在C89和C99中都要确保 (a / b) * b + a % ...
- vue echarts 遇到的bug之一 无法渲染的问题
图表示这样的 页面上有很多个图表,由于没有查询按钮,就只是点击发送ajax数据,所以把所有图表的方法放在updated中, 功能是实现了没问题,但是加载页面的时候会发送很多的ajax请求,而且点击修改 ...
- git和github的重要性
Git是一款免费.开源的分布式版本控制系统,github是全球最大的同性交友平台啊呸,说错了github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就 ...
- mysql 5.7 Warning: Using a password on the command line interface can be insecure. 解决方案
百度了好多,发现都是lunix环境下的,没有找到windows和OS 的,在lunix环境下的解决方案一般就是修改数据库配置文件 my.conf 在Windows 中是没有my.cnf 文件,而是叫做 ...
- 转:【Java集合源码剖析】Vector源码剖析
转载请注明出处:http://blog.csdn.net/ns_code/article/details/35793865 Vector简介 Vector也是基于数组实现的,是一个动态数组,其容量 ...