在平時的開發中工做中,環境的搭建其實一直都是一個很麻煩的事情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能作到的事情遠不僅這些 .
有興趣的同窗可深刻了解 .
關於本文內容 , 歡迎你們的意見跟建議
想得到最快更新,請關注公衆號