Docker快速上手之部署SpringBoot專案
Docker是基於Go語言實現的雲開源專案。
Docker的主要目標是“Build,Ship and Run Any App,Anywhere”,也就是通過對應用元件的封裝、分發、部署、執行等生命週期的管理,使使用者的APP(可以是一個WEB應用或資料庫應用等等)及其執行環境能夠做到“一次封裝,到處執行”。
Linux 容器技術的出現就解決了這樣一個問題,而 Docker 就是在它的基礎上發展過來的。將應用執行在 Docker 容器上面,而 Docker 容器在任何作業系統上都是一致的,這就實現了跨平臺、跨伺服器。只需要一次配置好環境,換到別的機子上就可以一鍵部署好,大大簡化了操作。
一、我所理解的Docker
我喜歡將Docker比喻成"方便麵",為什麼說是方便麵,之前部署專案環境的配置十分麻煩,換一臺機器,就要重來一次,費力費時。舉個栗子,我們部署一個SpringBoot專案,我們需要在伺服器上面配置專案的執行環境,要安裝各種各樣的軟體JDK/MySQL/Redis/nginx,安裝和配置這些東西十分麻煩,下次需要換個伺服器重新部署又得重新安裝一遍,簡直要命。而Docker能將專案連帶著執行環境一同部署過去,就好像吃買泡麵吃,泡麵所需的調料包還有工具都附加在了裡面。一句話總結Docker的好處,Docker解決了執行環境和配置問題,方便做持續整合並有助於整體釋出的容器虛擬化技術。
二、Docker與虛擬機器的區別
Docker容器 | 虛擬機器(VM) | |
作業系統 | 與宿主機共享OS | 宿主機OS上執行虛擬機器OS |
儲存大小 | 映象小,便於儲存與傳輸 | 映象龐大(vmdk、vdi等) |
執行效能 | 幾乎無額外效能損失 | 作業系統額外的CPU、記憶體消耗 |
移植性 | 輕便、靈活,適用於Linux | 笨重,與虛擬化技術耦合度高 |
硬體親和性 | 面向軟體開發者 | 面向硬體運維者 |
三、Docker裡面三個重要的概念Dockerfile、映象(image)、容器(Container)
1.Dockerfile是用來構建Docker映象的構建檔案,是由一系列命令和引數構成的指令碼。
Dockerfile體系結構:
FROM 基礎映象,當前新映象是基於哪個映象的 MAINTAINER 映象維護者的姓名和郵箱地址 RUN 容器構建時需要執行的命令 EXPOSE 當前容器對外暴露出的埠 WORKDIR 指定在建立容器後,終端預設登入進來的工作目錄,一個落腳點 ENV 用來在構建映象過程中設定環境變數 AD 將宿主機目錄下的檔案拷貝進映象且ADD命令會自動處理URL和解壓tar壓縮包 COPY 類似ADD,拷貝檔案和目錄到映象中。將從構建上下文目錄中<源路徑>的檔案/目錄複製到新的一層的映象內的<目標路徑>位置 VOLUME 容器資料卷,用於資料儲存和持久化工作 CMD 指定一個容器啟動時要執行的命令。Dockerfile中可以有多個CMD指令,但只要最後一個生效,CMD會被docker run之後的引數替換 ENTRYPOINT 指定一個容器啟動時要執行的命令。ENTRYPOINT的目的和CMD一樣,都是在指定容器啟動程式及引數 ONBUILD 當構建一個被繼承的Dockerfile時執行命令,父映象在被子繼承後父映象的onbuild被觸發
2.映象是一種輕量級、可執行的獨立軟體包,用來打包軟體執行環境和基於執行環境開發的軟體,它包含執行某個軟體所需的所有內容,包括程式碼、執行時、庫、環境變數和配置檔案。
3.容器是用映象建立的執行例項。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。可以把容器看做是一個簡易版的Linux環境(包括root使用者許可權、使用者空間和網路空間等)和執行在其中的應用程式。
四、安裝Docker
1.安裝Docker依賴包
yum install -y yum-utils device-mapper-persistent-data lvm2
2.設定阿里雲映象源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安裝 Docker-CE
yum install docker-ce
4.檢視是否安裝成功
docker version
五、使用Docker安裝MySQL
1.使用Docker拉取Mysql映象(這裡安裝的是MySQL5.6版本)
docker pull mysql:5.6
2.安裝mysql命令
docker run -d -p 3306:3306 --name mysql -v /ray/mysql/conf:/etc/mysql/conf.d -v /ray/mysql/logs:/logs -v /ray/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin -d mysql:5.6
命令說明:
-p 3306:3306 將主機的3306埠對映到docker容器的3306埠 --name mysql 執行伺服器名字 -v /ray/mysql/conf:/etc/mysql/conf.d 將主機/ray/mysql目錄下的conf/my.cnf掛載到容器的/etc/mysql/conf.d -v /ray/mysql/logs:/logs 將主機/ray/mysql目錄下的logs目錄掛載到容器的/logs -v /ray/mysql/data:/var/lib/mysql 將主機/ray/mysql目錄下的data目錄掛載到容器的/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin 初始化root使用者的密碼 -d mysql:5.6 後臺程式執行mysql5.6
3.進入mysql
docker exec -it MySQL執行成功後的容器ID /bin/bash
然後即可登入MySQL,建立資料庫,或者使用Navicat等工具建立資料庫。
六、使用Docker安裝Redis
1.使用Docker拉取Redis映象(這裡安裝的是Redis3.2版本)
docker pull redis:3.2
2.安裝redis命令(這裡不對命令做解釋)
docker run -p 6379:6379 -v /ray/redis/data:/data -v /ray/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
七、Docker部署SpringBoot專案
1.將專案打包成jar包(假設名字為myblog.jar),並編寫一個Dockerfile檔案,檔案內容如下:
# Docker image for springboot file run # VERSION 0.0.1 # Author: Ray # 基礎映象使用java FROM java:8 # 作者 MAINTAINER Ray <[email protected]> # VOLUME 指定了臨時檔案目錄為/tmp。 # 其效果是在主機 /var/lib/docker 目錄下建立了一個臨時檔案,並連結到容器的/tmp VOLUME /tmp # 將jar包新增到容器中並更名為app.jar ADD myblog.jar app.jar # 執行jar包 RUN bash -c 'touch /app.jar' ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] #暴露8080埠 EXPOSE 80
2.將這兩個檔案一併上傳至伺服器中的同一個目錄下面,進入該資料夾後執行此命令構建映象:
docker build -t myblog.jar .
3.生成docker容器,並執行
docker run -d -p 80:80 myblog.jar
等一會兒,SpringBoot專案跑起來了後,就可以使用瀏覽器通過80埠進行訪