在平时的开发中工做中,环境的搭建其实一直都是一个很麻烦的事情html
特别是如今,系统愈来愈复杂,所须要链接的一些中间件也愈来愈多.java
然而要顺利的安装好这些中间件也是一个比较费时费力的工做.mysql
俗话说"工欲善其事,必先利其器",这篇文章,就跟你们一块儿分享一下使用docker在本地环境或者测试环境快速搭建咱们经常使用的一些中间件容器的方法,linux
(这里没有说起生产环境,并非说生产环境不能使用docker,只是说要在生产环境上使用,请务必根据自身的实际状况,作好充分的评估)nginx
docker支持多种操做系统,本文的内容则是基于centos7操做系统的git
docker的文档写的很清晰,你们能够在redis
https://docs.docker.com/engine/installation/linux/docker-ce/centos/spring
站点中按照文档的步骤一步一步的安装docker , 假如一切正常 , 你们在命令行输入version , 会获得以下结果 :sql
$ 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 images : 列出当前docker全部的镜像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/
站点中找到其余命令的文档
通常状况,咱们使用run命令来建立一个容器 , 此命令的主要格式以下 :
docker run {指令/参数} {registry地址}/{组织名称}/{镜像名称}:{版本}
{registry地址}/{组织名称}/{镜像名称}:{版本} 这一串内容组成了一个docker镜像惟一的标识 , 具体值多是这样的 :
wjrfy32i.mirror.aliyuncs.com/library/nginx:latest
以上字符串描述了阿里云的nginx镜像,而后是latest版本 (指的是最新版本)
-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 : 设置容器的时钟与宿主机一致
$ 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密码
$ 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控制台管理员的帐户和密码
$ 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使用的配置文件
$ 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
以上命令映射了一系列目录到容器中,主要用于不一样场景的静态文件
<!-- 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能作到的事情远不仅这些 .
有兴趣的同窗可深刻了解 .
关于本文内容 , 欢迎你们的意见跟建议
想得到最快更新,请关注公众号