在平時的開發中工作中,環境的搭建其實一直都是一個很麻煩的事情
特別是現在,系統越來越復雜,所需要連接的一些中間件也越來越多.
然而要順利的安裝好這些中間件也是一個比較費時費力的工作.
俗話說"工欲善其事,必先利其器",這篇文章,就跟大家一起分享一下使用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能做到的事情遠不只這些 .
有興趣的同學可深入了解 .
關於本文內容 , 歡迎大家的意見跟建議
代碼倉庫 (博客配套代碼)
- 轉載 https://gitee.com/wangkang/udf