在平时的开发中工作中,环境的搭建其实一直都是一个很麻烦的事情

特别是现在,系统越来越复杂,所需要连接的一些中间件也越来越多.

然而要顺利的安装好这些中间件也是一个比较费时费力的工作.

俗话说"工欲善其事,必先利其器",这篇文章,就跟大家一起分享一下使用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能做到的事情远不只这些 .

有兴趣的同学可深入了解 .

关于本文内容 , 欢迎大家的意见跟建议

代码仓库 (博客配套代码)

使用docker快速搭建本地环境的更多相关文章

  1. spring boot / cloud (十八) 使用docker快速搭建本地环境

    spring boot / cloud (十八) 使用docker快速搭建本地环境 在平时的开发中工作中,环境的搭建其实一直都是一个很麻烦的事情 特别是现在,系统越来越复杂,所需要连接的一些中间件也越 ...

  2. 使用Docker快速搭建ELK环境

    今天由于Win系统的笔记本没带回家,其次Docker在非Linux系统下都需要安装额外的软件去镜像才行 所以感觉没有差别,先直接用Mac搭建一遍呢, 本篇部分命令和配置内容为摘抄 Mac下使用Dock ...

  3. 使用docker快速搭建hive环境

    记录一下使用docker快速搭建部署hive环境 目录 写在前面 步骤 安装docker 安装docker 安装docker-compose 配置docker国内镜像源(可选) 安装git & ...

  4. Docker快速搭建LNMP环境

    一.使用Dockerfile制作镜像 前面的博客中已经介绍了如何基于容器制作镜像,此方法的原理是使用一个正在运行的容器,根据生产所需进行配置更改等操作后,使其满足生产环境,再将这个容器打包制作为镜像, ...

  5. 【Rocketmq】通过 docker 快速搭建 rocketmq 环境

    1. 安装 Namesrv 拉取镜像 docker pull rocketmqinc/rocketmq:4.4.0` 启动容器 docker run -d -p 9876:9876 -v {RmHom ...

  6. 利用Docker Compose快速搭建本地测试环境

    前言 Compose是一个定义和运行多个Docker应用的工具,用一个YAML(dockder-compose.yml)文件就能配置我们的应用.然后用一个简单命令就能启动所有的服务.Compose编排 ...

  7. 一文教您如何通过 Docker 快速搭建各种测试环境(Mysql, Redis, Elasticsearch, MongoDB) | 建议收藏

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  8. 五分钟用Docker快速搭建Go开发环境

    挺早以前在我写过一篇用 `Docker`搭建LNMP开发环境的文章:[用Docker搭建Laravel开发环境](http://mp.weixin.qq.com/s?__biz=MzUzNTY5MzU ...

  9. Docker-教你如何通过 Docker 快速搭建各种测试环境

    今天给大家分享的主题是,如何通过 Docker 快速搭建各种测试环境,本文列举的,也是作者在工作中经常用到的,其中包括 MySQL.Redis.Elasticsearch.MongoDB 安装步骤,通 ...

随机推荐

  1. java学习笔记(基础篇)—面向对象编程之封装、继承、多态

    一. OOP中的基本概念 Java的编程语言是面向对象的,采用这种语言进行编程称为面向对象编程(Object-Oriented Programming, OOP), 它允许设计者将面向对象设计实现为一 ...

  2. RabbitMQ 从入门到精通(二)

    目录 1. 消息如何保障百分之百的投递成功? 1.1 方案一:消息落库,对消息状态进行打标 1.2 方案二:消息的延迟投递,做二次确认,回调检查 2. 幂等性 2.1 幂等性是什么? 2.2 消息端幂 ...

  3. JS浅学

    (变量的名字.focus(); )让打开的新的页面获取焦点 (变量的名字.close();)关闭打开的页面 可以用(!变量名)直接判断是否打开过新的页面 用(变量名.closed)判断是不是被关闭了 ...

  4. C#3.0新增功能09 LINQ 基础03 LINQ 和泛型类型

    连载目录    [已更新最新开发文章,点击查看详细] LINQ 查询基于 .NET Framework 版本 2.0 中引入的泛型类型. 无需深入了解泛型即可开始编写查询. 但是,可能需要了解 2 个 ...

  5. CSS画出三角形(利用Border)

    画出三角形的原理是调整border(边框)的四个方向的宽度,线条样式以及颜色. 如果你将宽度调的足够大,改变不同方向的颜色,你就可以发现盒模型的border是四个梯形一样的线条. div{ width ...

  6. 为何出现了trx_mysql_thread_id为0 的事务是什么

    今天巡检时突然发现有很多锁等待超时的情况,原以为是一个简单的小事,一查,结果令人深思. 1.  问题现象 发现日志中出现了大量的 ERROR 1205 (HY000): Lock wait timeo ...

  7. ssm框架下的文件上传和文件下载

    最近在做一个ssm的项目,遇到了添加附件和下载的功能,在网上查了很多资料,发现很多都不好用,经过摸索,发现了一套简便的方法,和大家分享一下. 1.在自己已经构建好的maven  web项目中 pom. ...

  8. 记一次搭建ftp服务器的简略经历

    需求:在linux中搭建一个ftp 服务器,用户为:user1 目录为 /data/use1  ,          安全设置:限制权限,只能访问自己目录,限制端口,只允许特定ip访问. 1,安装vs ...

  9. 使用钉钉对接禅道的bug系统,实现禅道提的bug实时在钉钉提醒并艾特对应的开发人员处理

    现在公司测试中有一个痛点是每次测试人员提完bug后,需要定期去提醒开发人员查看禅道的bug记录及修复bug. 导致测试人员在项目测试中不仅要测试整个软件,还要负起实时监督提醒功能的“保姆角色”,身心疲 ...

  10. Pow共识算法

    谈到哈希算法,每个程序员都不陌生,但是谈到比特币共识算法PoW,如果没有接触过的技术人员可能觉得应该会很复杂,毕竟全球的比特币节点数量如此庞大,达成共识的算法应该不会很简单.但其实如果你已掌握哈希算法 ...