1. 程式人生 > >Docker快速上手之部署SpringBoot專案

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埠進行訪