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 <185048761@qq.com> # 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端口進行訪問了