Docker 使用下 (二)
文章目錄
- Docker 使用下 (二)
- 前言
- 一、初識Docker
- 1.1 、Docker概述
- 1.2 、Docker的歷史
- 1.3 、Docker解決了什么問題
- 1.4 、Docker 的優點
- 1.5 、Docker的架構圖
- 二、鏡像
- 三、容器
- 四、數據卷
- 4.1、數據卷的概念
- 4.2 、數據卷的作用
- 4.3 、配置容器數據卷
- 五、搭建服務
- 5.1、創建容器步驟
- 六、DockerFile
- 6.1 、Docker鏡像原理
- 6.2 、Docker鏡像如何制作
- 6.2.1、容器轉為鏡像
- 6.2.2、壓縮文件轉變為鏡像
- 6.3 Dockerfile概念
- 6.4 制作dockerfile文件
- 6.4.1 制作項目jar文件
- 6.4.2 下載idk8鏡像
- 6.4.3 創建dockerfile文件
- 6.4.4 編寫dockerfile文件
- 6.4.5 執行生成鏡像
- 6.4.6 把鏡像生成為容器
- 6.4.7 測試
- 七、Docker服務編排
- 7.1 服務編排概念
- 7.2 Docker Compose 概述
- 7.3 Docker Compose安裝和使用
- 7.4 Docker compose卸載
- 7.5 使用Docker compose編排項目
- 7.5.1 創建文件夾
- 7.5.2 創建docker-compose.yml
- 7.5.3 編寫docker-compose.yml
- 7.5.4 創建./nginx/conf.d日錄
- 7.5.5 編寫nginx的配置文件
- 7.5.6 使用docker-compose啟動容器
- 7.5.7 測試訪問
- 八、Docker容器虛擬化與傳統虛擬機的比較
- 8.1 什么是虛擬機
- 8.2 什么是Docker
- 8.3 區別
- 8.4 注意區別總結
前言
我們寫的代碼會接觸到好幾個環境:開發環境,測試環境以及生產環境,導致代碼"水土不服"的問題該怎么解決?開發人員可以把容器(代碼+環境)統一發給測試人員,測試人員測試通過后再把容器發給運維人員,從而解決了軟件跨環境遷移的所導致的水土不服的問題。
一、初識Docker
1.1 、Docker概述
? Docker是一個開源的應用容器引擎,基于 Go 語言并從 Apache2.0 協議開源。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中然后發布到任何流行的 Linux機器上,也可以實現虛擬化。容器是完全使用 沙箱 機制,相互之間不會有任何接口(類似 ipPhone 的 app),更重要的是容器性能開銷極低。
什么是沙箱?沙箱也叫網絡編程虛擬執行環境, 英文名sandbox(sandboxie),可以看做是一種容器,里面所做的一切都可以推倒重來。
? 原理引用官方網站的一段話:電腦就像一張紙,程序的運行與改動,就像將字寫在紙上,而Sandboxie就相當于在紙上放了塊玻璃,程序的運行與改動就像寫在了那塊玻璃上,除去玻璃,紙上還是一點改變都沒有的,它創造了一個類似沙盒的獨立作業環境,在其內部運行的程序并不能對硬盤產生永久性的影響。其為一個獨立的虛擬環境,可以用來測試不受信任的應用程序或上網行為。
Docker從17.3版本之后,分為CE版(社區版),和EE版(企業版)
1.2 、Docker的歷史
Docker 公司位于舊金山,由法裔美籍開發者和企業家 Solumon Hykes 創立,其標志如下圖所示。
1.3 、Docker解決了什么問題
- 解決了環境配置的難題。軟件開發最大的麻煩事之一,就是環境配置。用戶計算機的環境都不相同,你怎么知道自家的軟件,能在那些機器跑起來?
- 用戶必須保證兩件事:操作系統的設置,各種庫和組件的安裝。只有它們都正確,軟件才能運行。舉例來說,安裝一個python 應用,計算機必須有 Python 引擎,還必須有各種依賴,可能還要配置環境變量。
- 如果某些老舊的模塊與當前環境不兼容,那就麻煩了。開發者常常會說:“它在我的機器可以跑了”(It works on my machine),言下之意就是,其他機器很可能跑不了。
- 環境配置如此麻煩,換一臺機器,就要重來一次,曠日楚時,很多人想到,能不能從根本上解決問題,軟件可以帶環境安裝?也就是說,安裝的時候,把原始環境-模一樣地復制過來。
1.4 、Docker 的優點
? Docker是一個用于開發,交付和運行應用程序的開放平臺。Docker 使您能夠將應用程序與基礎架構分開,從而可以快速交付軟件,借助 Docker,您可以與管理應用程序相同的方式來管理基礎架構。通過利用 Docker 的方法來快速交付,測試和部署代碼,您可以大大減少編寫代碼和在生產環境中運行代碼之間的延遲。
1.5 、Docker的架構圖
鏡像,容器和倉庫的關系?
- 鏡像(lmage) :Docker鏡像,就相當于是一個root文件系統。鏡像相當于java中的一個類,是一個模板,一個鏡像可以生成多個容器實例。
- 容器(Container): 鏡像和容器的關系就像是類與對象的關系一樣。鏡像是靜態的定義,容器是鏡像運行時的實體,容器可以被創建,啟動,停止,刪除,暫停等。
- 倉庫(Repository):倉庫可以看做是一個代碼控制中心,或者Maven中央倉庫,用來保存鏡像。
二、鏡像
相當于還沒有安裝的app
REPOSITORY
: 表示鏡像的倉庫源
TAG
: 鏡像的標簽
IMAGE ID
: 鏡像的ID(唯一的主鍵)
CREATED
: 鏡像的創建時間
SIZE
: 鏡像的大小
docker images[參數]
-a#列出本地所有的鏡像,含中間映像層
-q #只返回鏡像Id
-qa #-a與 -q的組合參數
-digests #一些鏡像的摘要說明
--no-trunc #顯示完整的鏡像信息
三、容器
相當于已經安裝好的App
鏡像與容器,宿主機的關系:
docker的圖標就是一個鯨魚上面裝有很多集裝箱,鯨魚游在大海里,大海就是宿主機,鯨魚背上的集裝箱就是一個個的容器實例,這個容器實例就來源于鏡像生成的。
有鏡像才能創建容器,Docker利用容器獨立運行一個或一組應用。容器是用鏡像創建的運行實例。它可以被啟動,開始,停止,刪除,每個容器都是相互隔離的,保證平臺的安全。
可以把容器看做是一個簡易版的linux運行環境,包括運行在里面的應用程序。Docker啟動是秒級的,容器只保留了內核,把硬件,網絡,打印機不相關的統統去掉了,所以它運行就快。
四、數據卷
4.1、數據卷的概念
- 問題1: docker容器刪除后,在容器中產生的數據還在嗎?
- 問題2: docker容器和外部機器可以直接交換文件嗎?
- 問題3: 容器之間想要進行數據交換該怎么解決?
數據卷是宿主機中的一個目錄或文件,當容器目錄和數據卷目錄綁定后,對方的修改會立即同步,一個數據卷可以被多個容器同時掛載,一個容器也可以掛載多個數據卷。
4.2 、數據卷的作用
- 容器數據持久化
- 外部機器和容器間接通信
- 容器之間數據交換
4.3 、配置容器數據卷
直接使用命令來掛載
需要先使用鏡像來啟動成為容器
docker run -it -v #主機目錄:容器目錄
#例如:
docker run -it -v /home/cesi:/home --name=centos0l centos /bin/bash
寫入文件
echo "abc">a.txt
查看是否掛載成功
docker inspect 容器ID
雙向綁定,數據同步
我們以后修改只需要在本地修改即可,容器內會自動同步!
注意事項:
- 目錄必須是絕對路徑
- 如果目錄不存在,會自動創建
五、搭建服務
5.1、創建容器步驟
設置端口、運行容器做數據掛載、端口映射、目錄映射
- 容器內的網絡服務和外部機不能直接通信
- 外部機器和宿主機可以直接通信
- 宿主機和容器可以直接通信
- 當容器中的網絡服務需要被外部機器訪問時,可以將容器中提供服務的端口映射到宿主機的端口上,外部機器訪問宿主機的該端口,從而間接訪問容器的服這種操作叫做端口映射。
六、DockerFile
思考:
- Docker鏡像本質是什么?
- Docker中一個
centos
鏡像為什么只有200MB
,而一個centos
操作系統的iso
文件要幾個G? - Docker中一個tomcat鏡像為什么有
500M
B,而一個tomcat
安裝包只有70MB
呢?
6.1 、Docker鏡像原理
操作系統組成部分:
- 進程調度子系統
- 進程通信子系統
- 內存管理子系統
- 設備管理子系統
- 網絡通信子系統
- 作業控制子系統
- 文件管理子系統
Linux 的文件系統由
bootfs
和rootfs
兩部分組成。fs
是fle system
的簡寫,包含bootloader
(引導加載程序)和kemel(內核)
。roots是root文件系統,包含的就是典型Linux系統中的
/dev,/proc,/bin,/etc
等標準目錄與文件。不同的Linux
發行版,boots基本一樣,而rootf不同
,如ubuntu與centos等。
docker鏡像是由特殊的文件疊加而成,最底端是boots,并使用宿主機的boots,就是說我們啟動了一個 Linux 的操作系統,在上面安裝了一個docker,Linux 啟動的時候要把內核加載起來,而docker的鏡像啟動的時候,也需要加載內核,boots 但不需要再次加載了,使用宿主機的 bootfs,第二層是 root 文件系統 rootfs ,稱為base image
,然后再往上可以疊加其他的鏡像文件
當你去下載
tomcat
的時候,它就去檢查看看有沒有idk
,沒有就去下載jdk
,再往下看有沒有基礎鏡像,沒有則繼續下載,這三部分組合起來稱之為tomcat鏡像
,對外暴露的tomcat
,它是一個只讀鏡像,這就是我說的鏡像就是一個千層餅。下載好tomcat
以后,我們再要去下載一個nginx
,這時候nginx
也需要基礎鏡像,它就不會再去下載了,而直接使用下載好的基礎鏡像,基礎的每一層鏡像都可以被別人復用。一個鏡像可以放在另一個鏡像的上面,位于下面的鏡像稱為父鏡像,最底部的鏡像稱為基礎鏡像。這些只讀鏡像都不能改動,因為你改動了,別的鏡像就不可以進行復用了。當從一個鏡像啟動容器時,Docker會在最頂層加載一個讀寫文件系統作為容器。
知道了docker的組成結構后,回答3個問題
- Docker鏡像本質是什么?
答:是一個分層文件系統
- Docker中一個centos鏡像為什么只有200MB,而一個centos操作系統的iso文件要幾個GB?
答:centos的iso鏡像文件包含bootfs和rootfs所以很大,而docker的centos鏡像復用操作系統的bootfs,只有rootfs和其他鏡像層,所以就小。
- Docker中一個tomcat鏡像為什么有500MB,而一個tomcat安裝包只有70MB呢?
答:由于docker中鏡像是分層的,tomcat雖然只有70MB,但它需要依賴父鏡像和基礎鏡像,所以整個對外暴.的tomcat鏡像就是500多MBdocker inspect tomcat:latest #查看鏡像的詳細信息
docker inspect tomcat:latest #查看鏡像的詳細信息
6.2 、Docker鏡像如何制作
6.2.1、容器轉為鏡像
docker commit 容器id 鏡像名稱:版本號
查看鏡像
docker images
把容器轉成鏡像后,再把鏡像轉成壓縮文件,這樣就可以直接把壓縮文件發給測試人員,測試人員把鏡像還原成容器,就可以直接測試了。
鏡像不可以直接傳輸只能轉變為壓縮文件才能傳輸。
鏡像轉變為壓縮文件:
docker save -o 壓縮文件名稱 鏡像名稱:版本號
6.2.2、壓縮文件轉變為鏡像
docker load -i 壓縮文件名稱 #i 就是input的意思
示例命令:
docker commit 04adada1e7f5 msi_tomcat:1.0 #把容器轉變為鏡像
docker save o msj_tomcat.tar msj_tomcat:1.0 #把鏡像做成壓縮文件
ll #查看生成的文件
#解壓測試
docker rmi bef5472c2c00 #刪除由容器轉換成的鏡像
docker oad i msj_tomcat.tar #解壓縮鏡像
總結:
1、由容器轉為鏡像
2、鏡像轉變為壓縮文件
3、下載壓縮文件,交由測試人員
4、測試人員拿到壓縮文件,上傳到宿主機
5、把壓縮文件轉化為鏡像
6、由鏡像再啟動為容器
注意:數據卷掛載的文件,不會連同一起打成壓縮文件。
6.3 Dockerfile概念
? dockerfle 本質上是一個文本文件,包含了一條條的指令,是用來制作鏡像的。每一條指令構建一層鏡像,基于基礎鏡像,最終構建出一個新的鏡像,對于開發人員,dockerfile可以為開發團隊提供一個完全一致的開發環境。對于運維人員,在部署時,可以實現應用的無縫移植。
去官網上查看其他 dockerfile
https://hub.docker.com
構建mysql的Dockerfile命令行:
https://github.com/CentOs/sig-cloud-instance-images/blob/b2d195220e1c5b181427c3172829c23ab9cd27eb/docker/Dockerfile
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /LABEL \org.label-schema.schema-version="1.0" \org.label-schema.name="CentOS Base Image" \org.label-schema.vendor="CentOS" \org.label-schema.license="GPLv2" \org.label-schema.build-date="20201113" \org.opencontainers.image.title="CentOS Base Image" \org.opencontainers.image.vendor="CentOS" \org.opencontainers.image.licenses="GPL-2.0-only" \org.opencontainers.image.created="2020-11-13 00:00:00+00:00"CMD ["/bin/bash"]
常用的 DockerFile 關鍵字列表
6.4 制作dockerfile文件
dockerfile文件編寫命令行步驟
#1 定義父鏡像 FROM java:8
#2 定義作者信息 MAINTAINER jShuai <3284484@qq.com>
#3 將jar包添加到容器 ADD docker-demo-01-0.0.1-SNAPSHOT.jar app.jar
#4 定義容器啟動執行的命令 CMD java -jar app.jar
#5 通過dockerfile構建鏡像 docker build -f dockerfile文件路徑 -t 鏡像名稱:版本
學習目的:制作dockerfile文件,發布并部署springboot項目
6.4.1 制作項目jar文件
制作springboot項目jar文件,上傳到根目錄的dockerfile文件夾下
6.4.2 下載idk8鏡像
docker pull java:8
6.4.3 創建dockerfile文件
vim springboot_dockerfile
6.4.4 編寫dockerfile文件
ROM java:8
MAINTAINER jShuai <3284484@qq.com>
ADD docker-demo-01-0.0.1-SNAPSHoT.jar app.jar
CMD java -jar app.jar
6.4.5 執行生成鏡像
docker build -f ./springboot_dockerfile -t app
6.4.6 把鏡像生成為容器
docker run -id -p 9000:8080 --name=app app
6.4.7 測試
http://192.168.0.101:9000/he71o
七、Docker服務編排
7.1 服務編排概念
? 微服務架構的應用系統中一般包含若干個微服務,每個微服務一般都會部署多個實例,如果每個微服務都要手動啟動和停止,維護的工作量會很大。雙11的時候,阿里的微服務達到上萬個。我們自己部署項目都會部署在docker之中,其中啟動的容器不僅僅有我們的項目,還有redis,mysql,nginx,還有tomcat等一些應用軟件。
服務編排就是按照一定的業務規則批量的管理容器
7.2 Docker Compose 概述
DockerCompose
是一個編排多容器分布式部署的工具,提供命令集管理容器化應用的完整開發周期,包括服務構建,啟動和停止,使用步驟:
- 利用
dockerfile
定義運行環境鏡像- 利用
docker-compose.yml
定義組成應用的各服務- 運行
docker-compose up
啟動應用
7.3 Docker Compose安裝和使用
我們可以從 Github 上下載它的二進制包來使用,最新發行的版本地址:
https://github.com/docker/compose/releases
運行以下命令以下載 Docker Compose 的當前穩定版本:
curl -L "https://github.com/docker /compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o
/usr/local/bin/docker-compose
要安裝其他版本的 Compose,請替換1.29.2。
網速較慢的話用
curl -L https://get.daocloud.io/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m`> /usr/local/bin/docker-compose
將可執行權限應用于二進制文件:
chmod +x/usr/local/bin/docker-compose
測試是否安裝成功:
docker-compose -v
7.4 Docker compose卸載
#二進制包方式安裝的,刪除二進制文件即可
rm /usr/local/bin/docker-compose
7.5 使用Docker compose編排項目
7.5.1 創建文件夾
mkdir ~/docker-compose
7.5.2 創建docker-compose.yml
cd ~/docker-compose
vim docker-compose.yml
7.5.3 編寫docker-compose.yml
version:'3'
services:nginx:image:nginxports:- 80:80links:- appvolumes :# 數據卷掛載- ./nginx/conf.d:/etc/nginx/conf.dapp:image: appexpose:-"8080"
說明:
Tinks: #當前的nginx可以訪問到app項目
volumes: #數據卷掛載
7.5.4 創建./nginx/conf.d日錄
mkoir -n./nginx/conf.d
cd ./nginx/cof.d
ll
vim nginx.conf
7.5.5 編寫nginx的配置文件
server{listen 80;access_log off;location /{proxy_pass http://app:8080;}
}
7.5.6 使用docker-compose啟動容器
cd ../../ #放到docker-compose目錄之下
docker-compose up
#或者后臺啟動
docker-compose up -d
7.5.7 測試訪問
http://192.168.0.101/hello
八、Docker容器虛擬化與傳統虛擬機的比較
8.1 什么是虛擬機
虛擬機在本質上就是在模擬一臺真實的計算機設備,同時遵循同樣的程序執行方式。虛擬機能夠利用"虛擬機管理程序"運行在物理設備之上。反過來,虛擬機管理
程序則可運行在主機設備或者“裸機”之上。傳統的虛擬機需要模擬整臺機器包括硬件,每臺虛擬機都需要有自己的操作系統,虛擬機一旦被開啟,預分配給他的資源將全部被占用。,每一個虛擬機包括應用,必要的二進制和庫,以及一個完整的用戶操作系統。
8.2 什么是Docker
Docker是一個集開發、打包、運行應用于一體的開放式平臺。Docker可以用來快速交付應用。使用Docker,你可以將應用程序從你的基礎設施中分離出來,并將基礎設施當做一個管理平臺。Docker可以加快打包時間,加快測試,加快發布,縮短開發及運行代碼之間的周期。Docker通過結合內核容器化特點和工作流,并使之工具化來實現這一切,幫助管理和發布你的應用。
8.3 區別
相同點:
容器與虛擬機具有相似的資源隔離和分配優勢
不同:
容器虛擬化的是操作系統,虛擬機虛擬化的是硬件
傳統虛擬機可以運行不同的操作系統,容器只能運行同一類型操作系統
8.4 注意區別總結
Docker和虛擬機有各自擅長的領域,在軟件開發、測試場景和生產運維場景中各有優劣。
Docker啟動快速屬于秒級別。虛擬機通常需要幾分鐘去啟動。
Docker需要的資源更少,Docker在操作系統級別進行虛擬化,Docker容器和內核交互,幾平沒有性能損耗Docker更輕量,Docker的架構可以共用一個內核與共享應用程序庫,所占內存極小,同樣的硬件環境,DocKer運行的鏡像數遠多于慮擬機數量,對系統的利用率非常高。