前面我們已經學會了在linux下安裝軟體,也發現了docker能極大的幫助我們快速完成工作,但想必也被那冗長的docker run指令困擾。一個兩個還好,若是微服務生産環境下幾百上千的服務節點,也這樣手工維護的的話,恐怕死的不知道怎麼死的。學習是為了實戰,幸得大佬指點,開始了學習dockerfile的過程
本文筆者還在學習初始階段,執行個體完成度也不高,僅供參考
首先了解dockerfile是什麼
dockerfile可以類比為java開發的pom檔案,通過配置檔案的方式編寫需要安裝部署的鏡像(docker compose文法),使用docker stack指令一鍵完成多個服務(服務組)的部署。
一.準備:
本文環境:centos7
安裝需要部署的鏡像,其實隻要知道鏡像名稱就行,如果本地沒有鏡像,docker會自動去遠端拉取
docker pull [redis | rabbitmq:management | jenkins/jenkins | season/fastdfs | nginx]
二.建立網關
相當于在虛拟機内部隔離一塊獨立的空間提供服務,隻能通過指定的網關通路
docker network create --driver overlay app :建立一個名為app、驅動為overlay、作用域為swarm的網絡
docker network ls :檢視網絡
如果出現docker datastore for scope "global" is not initialized錯誤,通過以下指令解決
docker run swarm create
docker swarm init
三.編輯運作環境程式的yml檔案
3.1建立目錄
此處為了示範和學習,目錄全部在root下自行建立
在root下建立docker,dockerfile.yml檔案放在此處運作
在docker裡分别建立static,nginx,jenkins_home,fastdfs_home檔案夾。在fastdfs_home裡建立tracker_data,storage_data檔案夾
3.2編寫yml檔案
此處配置檔案使用的是docker compose V3文法,運作java程式所需要啟動提供的服務
version: "3.1"
services:
redis:
image: docker.io/redis:latest
command: redis-server --requirepass redis
restart: always
ports:
- 6379:6379
networks:
- app
rabbitmq:
image: docker.io/rabbitmq:management
restart: always
ports:
- 5672:5672
- 15672:15672
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin
networks:
- app
jenkins:
image: docker.io/jenkins/jenkins:latest
restart: always
ports:
- 8085:8080
- 50000:50000
volumes:
- /var/jenkins_home:/root/docker/jenkins_home
networks:
- app
tracker:
image: docker.io/season/fastdfs:latest
command: sh tracker.sh
restart: always
ports:
- 22122:22122
network_mode: host
volumes:
- ~/tracker_data:/root/docker/fastdfs_home/tracker_data
networks:
- app
storage:
image: docker.io/season/fastdfs:latest
command: sh storage.sh
environment:
- GROUP_NAME=group1
- TRACKER_IP=47.102.43.84:22122
ports:
- 8083:8080
- 23000:23000
volumes:
- ~/storage_data:/root/docker/fastdfs_home/storage_data
- ~/store_path:/root/docker/fastdfs_home/storage_path
networks:
- app
nginx:
image: docker.io/nginx
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./nginx/nginx.conf:/root/docker/nginx/nginx.conf
- ./nginx/conf.d:/root/docker/nginx/conf.d
- ./static:/root/docker/static #靜态資源通路
networks:
- app
networks:
app:
external:
name: app
四.使用docker stack 運作docker鏡像
将編輯好的檔案命名為app.yml,上傳到docker目錄中,指令視窗cd進入該目錄
docker stack deploy -c app.yml app :使用stack的方式根據配置檔案部署啟動docker
docker stack ls : 檢視運作的堆
docker stack ps app :檢視app裡運作的堆
如下圖:
結果大家都看到啦,就redis和rabbitmq成功運作了,其他都報錯了而且在不停的重試,報的錯也看不全,而且我也不知道去哪兒看,應該是yml配置的問題了,具體的配置還要根據官方文檔慢慢試了。
測試:
在浏覽器輸入ip:15672通路rabbitmq控制台,輸入admin/admin看能否通路
五.編寫項目jar的dockerfile
FROM maven:3.6.0-jdk-8-alpine
EXPOSE 8080
VOLUME /tmp
ADD ./target/xxx.jar /admin.jar
ENV TIME_ZONE Asia/Shanghai
RUN bash -c 'touch /admin.jar' \
&& echo "${TIME_ZONE}" > /etc/timezone \
&& ln -snf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime
ENTRYPOINT ["java","-jar","/admin.jar"]
此處是dockerfile 檔案,将我們指定的target目錄下的jar打成admin.jar鏡像
在linux中安裝svn和maven,将上述編輯好的Dockerfile檔案放入項目根目錄下,和src、target、pom在同一目錄下。
編寫項目的yml檔案,同啟動redis一樣,此處将擷取admin鏡像,并将其釋出為一個服務,将該檔案命名為stack-admin放在java目錄下。
version: "3.1"
services:
gt_admin:
image: admin:v1
deploy:
mode: replicated
replicas: 1
environment:
- spring.profiles.active=beta
ports:
- 8081:8081
volumes:
- /root/service/file:/root/service/file
編寫啟動配置檔案
cd /java
svn update
cd /java/gt-parent
mvn clean install -Dmaven.test.skip=true
cd /java/gt-admin
docker build -t admin:v1 .
cd /java
docker stack deploy -c stack-admin.yml admin
該檔案第一句代碼更新線上代碼,第二句代碼将線上代碼打包,第三句代碼調用之前的dockerfile檔案用admin.jar建立一個名為admin:v1的鏡像,第四句代碼時調用前面建立的yml檔案,将admin:v1鏡像釋出為一個服務。
六.總結
慢慢學吧,這配置檔案實在是不好搞。不過dockerfile要是能用好了,絕對是屠龍之技啊 -> 這不就喬峰:你們一起上吧