天天看點

Docker進階一 使用dockerfile建構服務

前面我們已經學會了在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裡運作的堆

如下圖:

Docker進階一 使用dockerfile建構服務

結果大家都看到啦,就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要是能用好了,絕對是屠龍之技啊 -> 這不就喬峰:你們一起上吧

Docker進階一 使用dockerfile建構服務

繼續閱讀