文档章节

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

wangkang80
 wangkang80
发布于 2017/09/26 08:50
字数 2164
阅读 1049
收藏 44

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能做到的事情远不只这些 .

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

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

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


想获得最快更新,请关注公众号

输入图片说明

© 著作权归作者所有

wangkang80

wangkang80

粉丝 368
博文 22
码字总数 34117
作品 3
浦东
高级程序员
私信 提问
加载中

评论(3)

Aschrius
Aschrius
哈哈哈哈和我一样。把docker当成开箱即用的虚拟机。
wangkang80
wangkang80 博主

引用来自“哎码”的评论

docker ps -a : 列出当前docker正在运行中的容器 , 去掉-a , 则列出所有的容

这条写反了吧?
哈,还真写反了...
哎码
哎码
docker ps -a : 列出当前docker正在运行中的容器 , 去掉-a , 则列出所有的容

这条写反了吧?
使用 Docker 部署 Spring Boot之项目的构建

Docker通常用于如下场景: web应用的自动化打包和发布; 自动化测试和持续集成、发布; 在服务型环境中部署和调整数据库或其他的后台应用; 从头编译或者扩展现有的OpenShift或Cloud Foundry...

qq_28089993
2018/04/21
0
0
Docker-通过docker-maven-plugin插件实现docker镜像构建并自动发布到远程docker服务器

我们知道,docker能实现应用打包隔离,实现快速部署和迁移。如果我们开发应用使用了spring cloud + spring boot架构,那么,通过docker-maven-plugin实现快速构建镜像并发布到远程docker服务...

funnyboy0128
2018/11/19
0
0
快速使用 Docker 部署 Spring Boot 项目

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/GitChat/article/details/96216242 如今 Docker 的使用已经非常普遍,...

GitChat技术杂谈
07/17
0
0
Spring Boot 2.0(五):感受 Docker 魅力, 排解决多应用部署之疼

我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your felling 。 前期了解概念什么的确实比较无聊,请不...

纯洁微笑
2018/06/26
0
0
FEBS Cloud v1.1 发布,整合 Spring Cloud Alibaba

FEBS Cloud是一款使用Spring Cloud Greenwich.SR3、Spring Cloud OAuth2 & Spring Cloud Alibaba构建的低耦合权限管理系统,前端(FEBS Cloud Web)采用vue element admin构建。FEBS意指:F...

mrbird
09/22
874
0

没有更多内容

加载失败,请刷新页面

加载更多

nettysocetio-demo2(nettysocetio通讯,两客户端聊天,群发消息改造)

前言: 网上大多数都是只能群发,或者只能发给自己.并没有一个案例完整的群发并且又可以客户端之间聊天的案例,特此改造好的案例给大家分享一下.只要是一对一聊天,一对多群发. 此案例是在服务器...

RobertZhou
7分钟前
2
0
@JsonFormat与@DateTimeFormat注解的使用

背景:从数据库获取时间传到前端进行展示的时候,我们有时候可能无法得到一个满意的时间格式的时间日期,在数据库中显示的是正确的时间格式,获取出来却变成了很丑的时间戳,@JsonFormat注解...

万建宁
10分钟前
2
0
辍学北漂,从月薪2k服务员到2W报表工程师,我的数据追梦故事

本文为真实故事,绝无虚构 每个数据人在与数为伴,全力奔跑的日子里,总会有一些难忘的体验。 那些加班最深的夜,那些磨练后的成长,那些因数据带来的新的见遇,都让我们的人生变得丰富多彩。...

朕想上头条
15分钟前
2
0
Scrapy - [twisted] CRITICAL: Unhandled error in Deferred-你的配置文件还在吗?

找到问题的那一刻,骂了自己N次的猪脑子!!! 问题:爬虫脚本本来一切正常的,临时有其他事情耽搁了,然后回头正式运行的时候发现一只报错 [twisted] CRITICAL: Unhandled error in Deferre...

fang_faye
29分钟前
2
0
在Serverless Kubernetes集群中轻松运行Argo Workflow

导读 Argo是一个基于kubernetes实现的一个Workflow(工作流)开源工具,基于kubernetes的调度能力实现了工作流的控制和任务的运行。 目前阿里云容器服务ACK集群中已经支持工作流的部署和调度,...

阿里云官方博客
45分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部