摘要:由于隔離的進程獨立于宿主和其它的隔離的進程,因此也稱其為容器。鏡像實際是由多層文件系統聯合組成。容器可以被創建啟動停止刪除暫停等。容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行于屬于自己的獨立的命名空間。
Docker簡介
Docker 使用 Google 公司推出的 Go 語言 進行開發實現,基于 Linux 內核的 cgroup,namespace,以及 AUFS 類的 Union FS 等技術,對進程進行封裝隔離,屬于 操作系統層面的虛擬化技術。由于隔離的進程獨立于宿主和其它的隔離的進程,因此也稱其為容器。最初實現是基于 LXC,從 0.7 版本以后開始去除 LXC,轉而使用自行開發的 libcontainer,從 1.11 開始,則進一步演進為使用 runC 和 containerd。
Docker 在容器的基礎上,進行了進一步的封裝,從文件系統、網絡互聯到進程隔離等等,極大的簡化了容器的創建和維護。使得 Docker 技術比虛擬機技術更為輕便、快捷。
下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處。傳統虛擬機技術是虛擬出一套硬件后,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行于宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更為輕便。----Docker gitbook
Docker通常用于如下場景:
web應用的自動化打包和發布;
自動化測試和持續集成、發布;
在服務型環境中部署和調整數據庫或其他的后臺應用;
從頭編譯或者擴展現有的OpenShift或Cloud Foundry平臺來搭建自己的PaaS環境。
關于容器、鏡像、倉庫等基本概念見Docker gitbook--基本概念
鏡像容器是鏡像的運行實例。Docker鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。 鏡像不包含任何動態數據,其內容在構建之后也不會被改變。---- http://dockone.io/article/6051
鏡像的實現原理Docker 鏡像是怎么實現增量的修改和維護的?
每個鏡像都由很多層次構成,Docker 使用 Union FS 將這些不同的層結合到一個鏡像中去。
通常 Union FS 有兩個用途, 一方面可以實現不借助 LVM、RAID 將多個 disk 掛到同一個目錄下,另一個更常用的就是將一個只讀的分支和一個可寫的分支聯合在一起,Live CD 正是基于此方法可以允許在鏡像不變的基礎上允許用戶在其上進行一些寫操作。
Docker 在 AUFS 上構建的容器也是利用了類似的原理。關于聯合文件系統UFS可見http://www.dockerinfo.net/175...
Docker設計時,就充分利用Union FS的技術,將其設計為分層存儲的架構。 鏡像實際是由多層文件系統聯合組成。
鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構建鏡像的時候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。
相關命令搜索可用的鏡像
docker search mysql
拉取鏡像
docker pull image_name:tag // 如 docker pull mysql:5.7
刪除鏡像
docker rmi image_name:tag docker rmi image_id
刪除空懸鏡像
docker image prune // or : docker rmi $(docker images -aq -f dangling=true)
導出、導出鏡像
有時候我們需要將自己構造的鏡像分享給別人,但又不想放在倉庫上,那么就可以將鏡像導出為文件,然后copy給別人,再由其導入即可分享給他人使用。
docker save image_name -o /home/xxx/tar_name.tar docker load -i /home/xxx/tar_name.tar
鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的 類 和 實例 一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行于屬于自己的獨立的 命名空間。因此容器可以擁有自己的 root 文件系統、自己的網絡配置、自己的進程空間,甚至自己的用戶 ID 空間。容器內的進程是運行在一個隔離的環境里,使用起來,就好像是在一個獨立于宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。也因為這種隔離的特性,很多人初學 Docker 時常常會混淆容器和虛擬機。
容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存于容器存儲層的信息都會隨容器刪除而丟失。按照 Docker 最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用 數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。----《docker gitbook》
相關命令run
docker run [options] image [command] options: -i: 讓容器的標準輸入保持打開 -t: 讓docker 分配一個偽終端pseudo-tty -d: 后臺運行并返回一個唯一的id。要獲取容器的輸出信息,可以通過 docker [container] logs [container ID or NAMES] 命令。
當利用 docker run 來創建容器時,Docker 在后臺運行的標準操作包括:
檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
利用鏡像創建并啟動一個容器
分配一個文件系統,并在只讀的鏡像層外面掛載一層可讀寫層
從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
從地址池配置一個 ip 地址給容器
執行用戶指定的應用程序
執行完畢后容器被終止
start
啟動已經終止的容器
docker start container
容器的核心為所執行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,并沒有其它的資源。可以在偽終端中利用 ps 或 top 來查看進程信息
stop
docke r [container] stop contain_id_or_name // 停止所有的容器 // docker ps -a 的作用是列出所有的容器,-q 的作用是取出容器的id docker stop $(docker ps -aq)
rm
刪除容器
docker [container] rm container_id
prune
刪除終止的容器
docker rm $(docker ps -aq)
在使用 -d 參數時,容器啟動后會進入后臺模式運行。
某些時候需要進入容器進行操作,包括使用 docker attach 命令或 docker exec 命令,推薦大家使用 docker exec 命令,原因會在下面說明。
attach
docker attach container_id
注意: 如果從這個 stdin 中 exit,會導致容器的停止。
exec
docker exec [options] container_id command options: -i: 輸出 -t: 終端 如: docker exec -it 69d1 bash
stdin 中 exit,不會導致容器的停止。這就是為什么推薦大家使用 docker exec 的原因。
更多參數說明請使用 docker exec --help 查看。
有時候我們會需要將自己機器的容器定期保存下來或者分享給其他人,那么就可以使用導入/導出的功能
export
docker export container_id > your_container_file example: docker export fe3 > ubuntu
這樣將導出容器快照到本地文件。
import
cat you_container_file > docker import - yourlibrary/your_image:tag
可以使用 docker import 從容器快照文件中再導入為鏡像。
此外,也可以通過指定 URL 或者某個目錄來導入,例如
docker import http://example.com/exampleimage.tgz example/imagerepo
用戶既可以使用 docker load 來導入鏡像存儲文件到本地鏡像庫,也可以使用 docker import 來導入一個容器快照到本地鏡像庫。這兩者的區別在于容器快照文件將丟棄所有的歷史記錄和元數據信息( 即僅保存容器當時的快照狀態) ,而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標簽等元數據信息
數據卷數據卷 是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:
數據卷 可以在容器之間共享和重用
對 數據卷 的修改會立馬生效
對 數據卷 的更新,不會影響鏡像
數據卷 默認會一直存在,即使容器被刪除
注意: 數據卷 的使用,類似于 Linux 下對目錄或文件進行 mount,鏡像中的被指定為掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的 數據卷 。因此你的容器目錄dir有一個文件為temp.data,如果你在dir掛載了一個數據卷,那么你就再也不能讀取temp.data,除非你移除該數據卷。
創建數據卷docker volume create volume_name查看數據卷
docker volume ls // 列出數據卷列表 docker volume inspect volume_name //查看指定的數據卷信息 -------------------------------------------------------------- 輸出: [ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my-vol/_data", "Name": "my-vol", "Options": {}, "Scope": "local" } ]掛載數據卷
docker run [options] --name container_name --mount source=volume_name,targe=path_in_container image_name_or_id [command]
查看掛載信息,在輸出的信息的Mount字段包含了掛載信息
docker inspect container_name result: "Mounts": [ { "Type": "volume", "Name": "my-vol", "Source": "/var/lib/docker/volumes/my-vol/_data", "Destination": "/app", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ]刪除數據卷
docker volume rm volume_name
刪除無主數據卷:即沒有被容器使用的數據卷
docker volume prune掛載主機目錄作為數據卷
docker run [option] [--name container_name] -- mount type=bind,source=host_path,target=container_path image_name [command]
上面的命令加載主機的 /src/webapp 目錄到容器的 /opt/webapp 目錄。這個功能在進行測試的時候十分方便,比如用戶可以放置一些程序到本地目錄中,來查看容器是否正常工作。本地目錄的路徑必須是絕對路徑,以前使用 -v 參數時如果本地目錄不存在 Docker 會自動為你創建一個文件夾,現在使用 --mount 參數時如果本地目錄不存在,Docker 會報錯。
也可以為docker數據卷指定讀寫權限
-- mount type=bind,source=host_path,target=container_path,readonly
這樣你就不能在容器中寫container_path的目錄了
也可以掛載文件
-- mount type=bind,source=host_path,target=container_path
下一節:Docker 筆記(2):Dockerfile
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27052.html
摘要:年月發布了內核對進行了重新設計。年發布了內核更加徹底的改造了,稱為,并且認可其已經穩定。集群工具,多宿主管理運行。通過的設置通過設置將設置上標簽。使用兩種方式傳遞給宿主其的主機位置,環境變量和文件。 https://www.youtube.com/watch?v=heBI7oQvHZU http://v.qq.com/page/o/8/j/o03134mlm8j.html 基本介紹 D...
摘要:是由一系列命令和參數構成的腳本,這些命令應用于基礎鏡像并最終創建一個新的鏡像。每個中只能有一個,當指定多個時,只有最后一個生效。是改變工作目錄,則是改變之后層的執行以及這類命令的身份。 Dockerfile是由一系列命令和參數構成的腳本,這些命令應用于基礎鏡像并最終創建一個新的鏡像。 常用的選項 例子: FROM node:latest MAINTAINER my_name ADD ....
摘要:實現前述目的的方式有兩種在一個文件中指定一個基礎鏡像及需要完成的修改或通過運行一個鏡像,對其進行修改并提交。容器對外公開服務是必要的,因此允許公開容器的特定端口。鏡像必須完全可移植,不允許例外。 Docker是一個相對較新且發展非常快速的項目,可用來創建非常輕量的虛擬機。注意,這里的引號非常重要,Docker創建的并非真正的虛擬機,而更像是打了激素的chroot,嗯,是大量的激素。 D...
摘要:時間年月日星期六說明本文部分內容均來自慕課網。必填用于執行命令,當執行完畢后,將產生一個新的文件層。可選指定此鏡像啟動時默認執行命令。可選用于指定需要暴露的網絡端口號。可選向鏡像中掛載一個卷組。 時間:2017年09月16日星期六說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com 教學源碼:無 學習源碼:無 第一章:課程簡介 1-1 課程介紹 Docke...
摘要:拉取鏡像啟動發現后端創建集群創建主管理員操作對象因為這里的既是主管理員又是發現服務后臺,所以和的都是。主管理員操作節點的容器查看集群節點的容器列表刪除容器啟停容器與直接操作的區別就是后面加了 搭建基礎環境 官方文檔中演示時用到了五臺主機/虛擬機; showImg(https://segmentfault.com/img/bVzce2); 這里因為資源有限,只用三臺; showImg(h...
閱讀 1261·2023-04-25 19:10
閱讀 1140·2021-09-10 10:50
閱讀 3028·2021-09-02 15:21
閱讀 1383·2019-08-30 15:52
閱讀 1681·2019-08-30 13:56
閱讀 2077·2019-08-30 12:53
閱讀 1870·2019-08-28 18:22
閱讀 2115·2019-08-26 13:47