Docker鏡像原理
鏡像定義
輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基於運行環境開發的軟件
所有的應用,直接打包docker鏡像,就可以跑起來。
獲取鏡像:
- 從遠程倉庫
- 拷貝
- 自己製作DockerFile
Docker鏡像加載原理
UnionFS:封層、輕量級並且高性能的文件系統。支持對文件系統的修改和提交來一層層疊加
Docker的鏡像其實就是一層一層的文件系統組成
對一些精簡的OS,rootfs可以很小。只需要基本的命令。工具和程序庫。底層直接用Host的kernel
Docker分層理解
如果有之前已有的文件層,不會重複下載,而是進行復用。類似疊加的操作
提交分層鏡像 Commit
1.啓動一個默認的tomcat
2.將一些文件拷貝進去
3.將容器作爲一個新的鏡像進行commit
4.想要保存當前的容器狀態,就可以通過commit來提交,獲得一個鏡像
Docker容器數據卷
定義
docker的理念:將應用和環境打包成一個鏡像!
如果劇都在容器中,那麼容器刪除,數據就會丟失 —> 需求,數據可以持久化
容器之間可以由一個數據共享的技術!Docker容器中產生的數據,同步到本地
將容器內的目錄,掛載到linux上面。
總結:容器的持久化和同步操作!容器間可以實現數據共享!
使用數據卷
方式一:使用命令掛載 -v
docker run -it -v 主機目錄:容器內目錄
# 掛載本地與容器
docker run -it -v /home/test:/home centos /bin/bash
#啓動後用docker inspect進行測試
運行結果:
同理,宿主主機上的文件修改也會在容器中同步。
以後修改只需要在本地修改即可:容器內會自動同步
安裝MySQL
注意需要配置一個初識密碼密碼
#設置初識密碼
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# -d 後臺運行
# -p 端口映射
# -v 數據卷掛載
# -e 設置mysql的初識密碼
# --name 設置運行時的進程名
刪除容器後,掛載到本地的數據卷依舊會被保留 — 實現了數據的持久化
# 匿名掛載:沒有起名字 -- 僅指明瞭容器內的數據目錄 -- etc/var
# -P 隨機端口映射
docker run -d -P --name nginx-1 -v etc/var nginx
# 具名掛載,通過 -v 加上容器內路徑 -- 建議使用
大部分時候都是用具名掛載
-v 容器內路徑 #匿名掛載
-v 卷名:容器內路徑 # 具名掛載
-v /宿主機路徑::容器內路徑 #指定路徑掛載
拓展
# 通過 -v 容器內路徑:ro rw 改變讀寫權限
ro -- 只讀
rw -- 可讀可寫
# 一旦設置了容器權限,容器對我們掛載的內容就有限定了
# ro 只能通過宿主主機來操作
DockerFile初識
DockerFile是用來構建docker鏡像的構建文件!命令腳本
通過腳本生成鏡像,鏡像是一層層的,腳本的一個個命令,都是一層
docker build -f dockerfile1 -t dennis/centos:1.0 .
#其中dockerfile1的內容如下。指令都是大寫的
FROM centos
VOLUME ["volume1","volume2"]
CMD echo "-----end---"
CMD /bin/bash
#這裏的每個命令就是鏡像的一層
這個卷和外部一定有一個同步的目錄! — 匿名掛載
這是一個匿名掛載卷
數據卷容器
多個mysql共享數據!
利用一個容器實現多個容器之間的數據共享
#在創建容器的時候使用命令 --volumes-from [容器1]
新創建的容器會與容器1的數據進行同步。 --- 這裏的容器1就是數據卷容器
# 實驗,刪除了最開始鏈接的dennis1之後,dennis2與dennis3之間還是可以保持數據共享
這是一種備份的機制
多個mysql數據共享
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3311:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
#這個時候,可以實現兩個容器的數據同步
結論:
- 容器之間配置信息的傳遞,數據卷容器的生命週期一直持續到沒有容器使用爲止
- 但是一旦持久化到了本地,這個時候,本地的數據不會被刪除