Docker學習二:Docker鏡像原理

Docker鏡像原理

鏡像定義

輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基於運行環境開發的軟件

所有的應用,直接打包docker鏡像,就可以跑起來。

獲取鏡像:

  • 從遠程倉庫
  • 拷貝
  • 自己製作DockerFile

Docker鏡像加載原理

UnionFS:封層、輕量級並且高性能的文件系統。支持對文件系統的修改和提交來一層層疊加

Docker的鏡像其實就是一層一層的文件系統組成

對一些精簡的OS,rootfs可以很小。只需要基本的命令。工具和程序庫。底層直接用Host的kernel

Docker分層理解

如果有之前已有的文件層,不會重複下載,而是進行復用。類似疊加的操作

提交分層鏡像 Commit

1.啓動一個默認的tomcat
2.將一些文件拷貝進去
3.將容器作爲一個新的鏡像進行commit
4.想要保存當前的容器狀態,就可以通過commit來提交,獲得一個鏡像

image-20200524161949673

Docker容器數據卷

定義

docker的理念:將應用和環境打包成一個鏡像!

如果劇都在容器中,那麼容器刪除,數據就會丟失 —> 需求,數據可以持久化

容器之間可以由一個數據共享的技術!Docker容器中產生的數據,同步到本地

將容器內的目錄,掛載到linux上面。

總結:容器的持久化和同步操作!容器間可以實現數據共享!

使用數據卷

方式一:使用命令掛載 -v

docker run -it -v 主機目錄:容器內目錄
# 掛載本地與容器
docker run -it -v /home/test:/home centos /bin/bash

#啓動後用docker inspect進行測試

image-20200524162909989

運行結果:

image-20200524163111581

同理,宿主主機上的文件修改也會在容器中同步。

以後修改只需要在本地修改即可:容器內會自動同步

安裝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 設置運行時的進程名


image-20200524165806722

刪除容器後,掛載到本地的數據卷依舊會被保留 — 實現了數據的持久化

# 匿名掛載:沒有起名字 -- 僅指明瞭容器內的數據目錄 -- 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
#這裏的每個命令就是鏡像的一層

image-20200524171423832

image-20200524171836720

這個卷和外部一定有一個同步的目錄! — 匿名掛載

image-20200524172405409

這是一個匿名掛載卷

數據卷容器

多個mysql共享數據!

利用一個容器實現多個容器之間的數據共享

#在創建容器的時候使用命令 --volumes-from [容器1]
新創建的容器會與容器1的數據進行同步。 --- 這裏的容器1就是數據卷容器
# 實驗,刪除了最開始鏈接的dennis1之後,dennis2與dennis3之間還是可以保持數據共享

image-20200524173651079

這是一種備份的機制

多個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
#這個時候,可以實現兩個容器的數據同步

結論:

  • 容器之間配置信息的傳遞,數據卷容器的生命週期一直持續到沒有容器使用爲止
  • 但是一旦持久化到了本地,這個時候,本地的數據不會被刪除
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章