從虛擬機(jī)到容器
1.環(huán)境配置的難題
軟件開發(fā)最大的麻煩事之一,就是環(huán)境配置。用戶計算機(jī)的環(huán)境都不相同,你怎么知道自家的軟件,能在那些機(jī)器跑起來?
用戶必須保證兩件事:操作系統(tǒng)的設(shè)置,各種庫和組件的安裝。只有它們都正確,軟件才能運(yùn)行。舉例來說,安裝一個 Python 應(yīng)用,計算機(jī)必須有 Python 引擎,還必須有各種依賴,可能還要配置環(huán)境變量。
如果某些老舊的模塊與當(dāng)前環(huán)境不兼容,那就麻煩了。開發(fā)者常常會說:"它在我的機(jī)器可以跑了"(It works on my machine),言下之意就是,其他機(jī)器很可能跑不了。
環(huán)境配置如此麻煩,換一臺機(jī)器,就要重來一次,曠日費時。很多人想到,能不能從根本上解決問題,軟件可以帶環(huán)境安裝?也就是說,安裝的時候,把原始環(huán)境一模一樣地復(fù)制過來。
2.虛擬機(jī)
虛擬機(jī)(virtual machine)就是帶環(huán)境安裝的一種解決方案。它可以在一種操作系統(tǒng)里面運(yùn)行另一種操作系統(tǒng),比如在 Windows 系統(tǒng)里面運(yùn)行 Linux 系統(tǒng)。應(yīng)用程序?qū)Υ撕翢o感知,因為虛擬機(jī)看上去跟真實系統(tǒng)一模一樣,而對于底層系統(tǒng)來說,虛擬機(jī)就是一個普通文件,不需要了就刪掉,對其他部分毫無影響。
雖然用戶可以通過虛擬機(jī)還原軟件的原始環(huán)境。但是,這個方案有幾個缺點。
- 資源占用多,虛擬機(jī)會獨占一部分內(nèi)存和硬盤空間。它運(yùn)行的時候,其他程序就不能使用這些資源了。哪怕虛擬機(jī)里面的應(yīng)用程序,真正使用的內(nèi)存只有 1MB,虛擬機(jī)依然需要幾百 MB 的內(nèi)存才能運(yùn)行。
- 冗余步驟多,虛擬機(jī)是完整的操作系統(tǒng),一些系統(tǒng)級別的操作步驟,往往無法跳過,比如用戶登錄。
- 啟動慢,操作系統(tǒng)需要多久,啟動虛擬機(jī)就需要多久??赡芤葞追昼?,應(yīng)用程序才能真正運(yùn)行。
3.Linux 容器
由于虛擬機(jī)存在這些缺點,Linux 發(fā)展出了另一種虛擬化技術(shù):Linux 容器(Linux Containers,縮寫為 LXC)。
Linux 容器不是模擬一個完整的操作系統(tǒng),而是對進(jìn)程進(jìn)行隔離?;蛘哒f,在正常進(jìn)程的外面套了一個保護(hù)層。對于容器里面的進(jìn)程來說,它接觸到的各種資源都是虛擬的,從而實現(xiàn)與底層系統(tǒng)的隔離。
由于容器是進(jìn)程級別的,相比虛擬機(jī)有很多優(yōu)勢。
- 啟動快,容器里面的應(yīng)用,直接就是底層系統(tǒng)的一個進(jìn)程,而不是虛擬機(jī)內(nèi)部的進(jìn)程。所以,啟動容器相當(dāng)于啟動本機(jī)的一個進(jìn)程,而不是啟動一個操作系統(tǒng),速度就快很多。
- 資源占用少,容器只占用需要的資源,不占用那些沒有用到的資源;虛擬機(jī)由于是完整的操作系統(tǒng),不可避免要占用所有資源。另外,多個容器可以共享資源,虛擬機(jī)都是獨享資源。
- 體積小,容器只要包含用到的組件即可,而虛擬機(jī)是整個操作系統(tǒng)的打包,所以容器文件比虛擬機(jī)文件要小很多。
總之,容器有點像輕量級的虛擬機(jī),能夠提供虛擬化的環(huán)境,但是成本開銷小得多。
4.Docker
Docker 屬于 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。
Docker 將應(yīng)用程序與該程序的依賴,打包在一個文件里面。運(yùn)行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器里運(yùn)行,就好像在真實的物理機(jī)上運(yùn)行一樣。有了 Docker,就不用擔(dān)心環(huán)境問題。
總體來說,Docker 的接口相當(dāng)簡單,用戶可以方便地創(chuàng)建和使用容器,把自己的應(yīng)用放入容器。容器還可以進(jìn)行版本管理、復(fù)制、分享、修改,就像管理普通的代碼一樣。
5.Window Wsl
Wsl安裝:https://learn.microsoft.com/zh-cn/windows/wsl/install-manual
列出Wsl正在運(yùn)行的組件:wsl -l -v --all
Docker實現(xiàn)原理簡述
1.進(jìn)程隔離—Namespace
Linux Namespace(Linux 命名空間)是 Linux 內(nèi)核(Kernel)提供的功能,它可以隔離一系列的系統(tǒng)資源,如 PID(進(jìn)程 ID,Process ID)、User ID、Network、文件系統(tǒng)等。
Linux Namespace是在當(dāng)前運(yùn)行的系統(tǒng)環(huán)境中創(chuàng)建(隔離)另一個進(jìn)程的運(yùn)行環(huán)境出來,并在此運(yùn)行環(huán)境中將一些必要的系統(tǒng)全局資源進(jìn)行【虛擬化】。進(jìn)程可以運(yùn)行在指定的namespace中,因此,namespace中的每個進(jìn)程都認(rèn)為自己擁有所有這些虛擬化的全局資源。
2.資源限制—Linux Cgroups
Docker 容器本質(zhì)依舊是一個進(jìn)程,多個 Docker 容器運(yùn)行時,如果其中一個 Docker 進(jìn)程占用大量 CPU 和內(nèi)存就會導(dǎo)致其他 Docker 進(jìn)程響應(yīng)緩慢,為了避免這種情況,可以通過 Linux Cgroups 技術(shù)對資源進(jìn)行限制。
Linux Cgroups(Linux Contorl Groups,簡稱 Cgroups)可以對一組進(jìn)程及這些進(jìn)程的子進(jìn)程進(jìn)行資源限制、控制和統(tǒng)計的能力,其中包括 CPU、內(nèi)存、存儲、網(wǎng)絡(luò)、設(shè)備訪問權(quán)限等,通過 Cgroups 可以很輕松的限制某個進(jìn)程的資源占用并且統(tǒng)計該進(jìn)程的實時使用情況。
Cgroups 由 3 個組件構(gòu)成,分別是 cgroup(控制組)、subsystem(子系統(tǒng))以及 hierarchy(層級樹),3 者相互協(xié)同作用。
- cgroup 是對進(jìn)程分組管理的一種機(jī)制,一個 cgroup 通常包含一組(多個)進(jìn)程,Cgroups 中的資源控制都以 cgroup 為單位實現(xiàn)。
- subsystem 是一組(多個)資源控制的模塊,每個 subsystem 會管理到某個 cgroup 上,對該 cgroup 中的進(jìn)程做出相應(yīng)的限制和控制。
- hierarchy 會將一組(多個)cgroup 構(gòu)建成一個樹狀結(jié)構(gòu),Cgropus 可以利用該結(jié)構(gòu)實現(xiàn)繼承等功能
3.分層結(jié)構(gòu)—Union File System
Docker 鏡像是一種分層結(jié)構(gòu),每一層構(gòu)建在其他層之上,從而實現(xiàn)增量增加內(nèi)容的功能。
Union File System(簡稱,UnionFS),它是為 Linux 系統(tǒng)設(shè)計的將其他文件系統(tǒng)聯(lián)合到一個聯(lián)合掛載點的文件系統(tǒng)服務(wù)。UnionFS 使用 branch(分支)將不同文件系統(tǒng)的文件和目錄透明地疊加覆蓋,形成一個單一一致的文件系統(tǒng),此外 UnionFS 使用寫時復(fù)制(Copy on Write,簡稱,CoW)技術(shù)來提高合并后文件系統(tǒng)的資源利用。
Docker 架構(gòu)
1.基本概念
- 鏡像(Image):Docker 鏡像(Image),就相當(dāng)于是一個 root 文件系統(tǒng)。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統(tǒng)的 root 文件系統(tǒng)。
- 容器(Container):鏡像(Image)和容器(Container)的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計中的類和實例一樣,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時的實體。容器可以被創(chuàng)建、啟動、停止、刪除、暫停等。
- 倉庫(Repository):倉庫可看成一個代碼控制中心,用來保存鏡像。
Docker 使用客戶端-服務(wù)器 (C/S) 架構(gòu)模式,使用遠(yuǎn)程API來管理和創(chuàng)建Docker容器。Docker 容器通過 Docker 鏡像來創(chuàng)建。容器與鏡像的關(guān)系類似于面向?qū)ο缶幊讨械膶ο笈c類。
2.概念組成
- Docker 鏡像(Images)是用于創(chuàng)建 Docker 容器的模板,比如 Ubuntu 系統(tǒng)。
- Docker 容器(Container)是獨立運(yùn)行的一個或一組應(yīng)用,是鏡像運(yùn)行時的實體。
- Docker 客戶端(Client)通過命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 與 Docker 的守護(hù)進(jìn)程通信。
- Docker 主機(jī)(Host)是一個物理或者虛擬的機(jī)器用于執(zhí)行 Docker 守護(hù)進(jìn)程和容器。
- Docker Registry用來保存鏡像,可以理解為代碼控制中的代碼倉庫。
- Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用。一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標(biāo)簽(Tag);每個標(biāo)簽對應(yīng)一個鏡像。通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標(biāo)簽就常用于對應(yīng)該軟件的各個版本。我們可以通過 <倉庫名>:<標(biāo)簽> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標(biāo)簽,將以 latest 作為默認(rèn)標(biāo)簽。
- Docker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應(yīng)的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。
Docker入門
官方文檔
Docker Engine:https://docs.docker.com/engine/,Docker核心
Docker Desktop:https://docs.docker.com/desktop/,可視化操作。
Docker Composer:https://docs.docker.com/compose/,編排容器。
拓展
Window Linux子系統(tǒng):https://docs.microsoft.com/zh-cn/windows/dev-environment/
1.Docker安裝
官方文檔上有詳細(xì)的說明,這里以centos7.6作為操作實例。(https://docs.docker.com/engine/install/centos/)
官方建議如果安裝過舊版本,先卸載后安裝。舊版docker-engine現(xiàn)在被稱為docker-ce.
# 這個可以理解為字符串換行連接符
$ sudo yum remove docker docker-client docker-client-latest docker-common
docker-latest docker-latest-logrotate docker-logrotate docker-engine
然后配置yum倉庫源,命令行開始:
# 安裝yum-utils,一般都有裝
$ yum install -y yum-utils
# 配置倉庫源
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
開始安裝最新版本的 Docker Engine、containerd 和 Docker Compose
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
此命令會安裝 Docker,但不會啟動 Docker。它還會創(chuàng)建一個 docker組,但是默認(rèn)情況下它不會將任何用戶添加到該組中。
安裝完成,查看docker版本信息,命令如下:
$ docker version
# 或者
$ docker info
啟動docker ,命令如下:
# service 命令的用法
$ sudo service docker start
# systemctl 命令的用法
$ sudo systemctl start docker
# 測試安裝是否正常
$ docker run hello-world
提示
docker --help 、docker command --help,查看命令的功能說明
鏡像image
Docker 把應(yīng)用程序及其依賴,打包在 image 文件里面。只有通過這個文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根據(jù) image 文件生成容器的實例。同一個 image 文件,可以生成多個同時運(yùn)行的容器實例。
鏡像是一種輕量級、可執(zhí)行的獨立軟件包,用來打包軟件運(yùn)行環(huán)境和基于運(yùn)行環(huán)境開發(fā)的軟件,它包含運(yùn)行某個軟件所需要的所有內(nèi)容,包括代碼,運(yùn)行時(一個程序在運(yùn)行或者在被執(zhí)行的依賴)、庫,環(huán)境變量和配置文件。其實也可以理解為一個文件目錄
image 是二進(jìn)制文件。實際開發(fā)中,一個 image 文件往往通過繼承另一個 image 文件,加上一些個性化設(shè)置而生成。舉例來說,你可以在 Ubuntu 的 image 基礎(chǔ)上,往里面加入 Apache 服務(wù)器,形成你的 image。
image 文件是通用的,一臺機(jī)器的 image 文件拷貝到另一臺機(jī)器,照樣可以使用。一般來說,為了節(jié)省時間,我們應(yīng)該盡量使用別人制作好的 image 文件,而不是自己制作。即使要定制,也應(yīng)該基于別人的 image 文件進(jìn)行加工,而不是從零開始制作。
為了方便共享,image 文件制作完成后,可以上傳到網(wǎng)上的倉庫。Docker 的官方倉庫 Docker Hub 是最重要、最常用的 image 倉庫。此外,出售自己制作的 image 文件也是可以的。
相關(guān)參考
https://blog.csdn.net/sinat_33087001/article/details/123029844
鏡像倉庫
1.修改鏡像倉庫源
添加鏡像倉庫之后下載鏡像時會先從鏡像倉庫進(jìn)行下載;
以centos為例,編輯/etc/docker/daemon.json文件;
{
"registry-mirrors": ["https://alzgoonw.mirror.aliyuncs.com"]
}
然后重啟docker:
# 重載配置
$ systemctl daemon-reload
# 重啟docker
$ systemctl restart docker
# 查看docker信息
$ docker info
Window Docker Desktop:
- 打開Docker Desktop應(yīng)用程序。
- 點擊屏幕右上角的齒輪圖標(biāo),打開設(shè)置菜單。
- 在左側(cè)導(dǎo)航欄中選擇"Docker Engine"選項。
- 在編輯器中找到或創(chuàng)建一個JSON配置文件。如果已經(jīng)存在,請確保它是可編輯狀態(tài)。
- 在JSON配置文件中,添加或修改registry-mirrors鍵的值。將其設(shè)置為你想要使用的鏡像源地址。如果你想同時使用多個鏡像源,可以在該鍵的值中提供一個逗號分隔的列表。
- 例如,假設(shè)你要使用阿里云的鏡像源,你可以將registry-mirrors設(shè)置為:"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
- 保存并關(guān)閉配置文件。
- 重新啟動Docker Desktop,以使配置更改生效。
2.登錄倉庫 docker login
登陸到一個Docker鏡像倉庫,如果未指定鏡像倉庫地址,默認(rèn)為官方倉庫 Docker Hub(https://hub.docker.com/)
# 登錄,不指定地址,默認(rèn)為官方倉庫
$ docker login -u 用戶名 -p 密碼
3.退出登錄 docker logout
# 退出指定倉庫的登錄
$ docker logout [OPTIONS] [SERVER]
4.搜索鏡像 docker search
我們可以從 Docker Hub 網(wǎng)站來搜索鏡像,Docker Hub 網(wǎng)址為: https://hub.docker.com/
我們也可以使用 docker search 命令來搜索鏡像。比如我們需要一個 openresty的鏡像來作為我們的 web 服務(wù)。我們可以通過 docker search 命令搜索 openresty來尋找適合我們的鏡像。
[root@VM-0-11-centos ~]# docker search Openresty
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
openresty/openresty OpenResty Official Docker Images - a dynamic… 370 [OK]
ficusio/openresty Minimalist OpenResty image 22 [OK]
3scale/openresty Latest Openresty with redis and some handy p… 16 [OK]
- NAME: 鏡像倉庫源的名稱
- DESCRIPTION: 鏡像的描述
- OFFICIAL: 是否 docker 官方發(fā)布
- stars: 類似 Github 里面的 star,表示點贊、喜歡的意思。
- AUTOMATED: 自動構(gòu)建。
5.拉取鏡像 docker pull
# 拉取指定的鏡像(name為上方鏡像倉庫源名稱)
# -a :拉取所有 tagged 鏡像
# name可以是一個在倉庫存在的鏡像名,也可以是代表鏡像的一個遠(yuǎn)程地址
$ docker pull [OPTIONS] NAME[:TAG|@DIGEST]
6.上傳倉庫 docker push
用于將本地的鏡像上傳到鏡像倉庫,要先登陸到鏡像倉庫。
# docker push [OPTIONS] NAME[:TAG]
# 上傳本地鏡像myapache:v1到鏡像倉庫中。
$ docker push myapache:v1
# OPTIONS --disable-content-trust :忽略鏡像的校驗,默認(rèn)開啟
向指定遠(yuǎn)程倉庫推送鏡像
# 在本地登錄到遠(yuǎn)程倉庫:
$ docker login --username=[用戶名] -p=[密碼] 遠(yuǎn)程ip:端口
# 給本地鏡像打標(biāo)簽, [遠(yuǎn)程ip:端口/自定義路徑/*]:[版本號] 就是:[標(biāo)簽名:版本號]
$ docker tag [鏡像id:標(biāo)簽] [遠(yuǎn)程ip:端口/自定義路徑/*]:[版本號]
# 推送
$ docker push [遠(yuǎn)程ip:端口/自定義路徑/*]:[版本號]
實際操作:
$ docker tag hello-world daocloud.io/zter/hello-world:v1
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 9 weeks ago 1.84 kB
hello-world v1 fce289e99eb9 9 weeks ago 1.84 kB
hello-world v2 fce289e99eb9 9 weeks ago 1.84 kB
daocloud.io/zter/hello-world v1 fce289e99eb9 9 weeks ago 1.84 kB
$ docker push daocloud.io/zter/hello-world:v1
The push refers to a repository [daocloud.io/zter/hello-world]
af0b15c8625b: Pushed
v1: digest: sha256:39bbd4a41b5d3b164632d3b4a295c0db31139992a8fe985f949dac7ccff7aa54 size: 524
本地鏡像管理
1.查看鏡像列表 docker images
docker images [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS說明:
- -a :列出本地所有的鏡像(含中間映像層,默認(rèn)情況下,過濾掉中間映像層);
- --digests :顯示鏡像的摘要信息;
- -f :顯示滿足條件的鏡像;
- --format :指定返回值的模板文件;
- --no-trunc :顯示完整的鏡像信息;
- -q :只顯示鏡像ID。
[root@VM-0-11-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 9 months ago 13.3kB
- REPOSITORY:表示鏡像的倉庫源
- TAG:鏡像的標(biāo)簽
- IMAGE ID:鏡像ID
- CREATED:鏡像創(chuàng)建時間
- SIZE:鏡像大小
2.刪除鏡像 docker rmi
# 刪除指定鏡像
$ docker rmi name
3.創(chuàng)建歷史 docker history
$ docker history [OPTIONS] IMAGE
OPTIONS說明:
- -H :以可讀的格式打印鏡像大小和日期,默認(rèn)為true;
- --no-trunc :顯示完整的提交記錄;
- -q :僅列出提交記錄ID。
# 查看本地鏡像nice/ubuntu:v3的創(chuàng)建歷史。
$ docker history nice/ubuntu:v3
4.鏡像歸檔 dcoker save
$ docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS 說明:
- -o :輸出到的文件。
# 將鏡像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文檔
$ docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
經(jīng)過測試,導(dǎo)出鏡像可以,導(dǎo)出容器不行
導(dǎo)出時通過參數(shù)-o指定的值必須是一個文件名,不能是目錄名。
5.鏡像導(dǎo)入 dcoker load
導(dǎo)入使用 docker save 命令導(dǎo)出的鏡像。
$ docker load [OPTIONS]
OPTIONS 說明:
- --input , -i : 指定導(dǎo)入的文件,代替 STDIN。
- --quiet , -q : 精簡輸出信息。
6.鏡像標(biāo)簽 docker tag
標(biāo)記本地鏡像,將其歸入某一倉庫。
$ docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
$ docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
容器生命周期
1.創(chuàng)建容器 docker create
# 創(chuàng)建一個容器,類似 docker run -d 命令
$ docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker create 創(chuàng)建的容器并未實際啟動,還需要執(zhí)行 docker start 命令或 docker run 命令以啟動容器。docker create 命令常用于在啟動容器之前進(jìn)行必要的設(shè)置。 參數(shù)類似run。
2.容器運(yùn)行 docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- -d, --detach=false 指定容器運(yùn)行于前臺還是后臺,默認(rèn)為 false。
- -i, --interactive=false 打開 STDIN,用于控制臺交互。
- -t, --tty=false 分配 tty 設(shè)備,該可以支持終端登錄,默認(rèn)為 false。
- -u, --user="" 指定容器的用戶。
- -a, --attach=[] 登錄容器(必須是以 docker run -d 啟動的容器)。
- -w, --workdir="" 指定容器的工作目錄。
- -c, --cpu-shares=0 設(shè)置容器 CPU 權(quán)重,在 CPU 共享場景使用。
- -e, --env=[] 指定環(huán)境變量,容器中可以使用該環(huán)境變量。
- -m, --memory="" 指定容器的內(nèi)存上限。
- -P, --publish-all=false 指定容器暴露的端口。
- -p, --publish=[] 指定容器暴露的端口。
- -h, --hostname="" 指定容器的主機(jī)名。
- -v, --volume=[] 給容器掛載存儲卷,掛載到容器的某個目錄。(-v 主機(jī)目錄:容器目錄)
- - -volumes-from=[] 給容器掛載其他容器上的卷,掛載到容器的某個目錄。
- - -cap-add=[] 添加權(quán)限。
- - -cap-drop=[] 刪除權(quán)限。
- - -cidfile="" 運(yùn)行容器后,在指定文件中寫入容器 PID 值,一種典型的監(jiān)控系統(tǒng)用法。
- - -cpuset="" 設(shè)置容器可以使用哪些 CPU,此參數(shù)可以用來容器獨占 CPU。
- - -device=[] 添加主機(jī)設(shè)備給容器,相當(dāng)于設(shè)備直通。
- - -dns=[] 指定容器的 dns 服務(wù)器。
- - -dns-search=[] 指定容器的 dns 搜索域名,寫入到容器的 /etc/resolv.conf 文件。
- - -entrypoint="" 覆蓋 image 的入口點。
- - -env-file=[] 指定環(huán)境變量文件,文件格式為每行一個環(huán)境變量。
- - -expose=[] 指定容器暴露的端口,即修改鏡像的暴露端口。
- - -link=[] 指定容器間的關(guān)聯(lián),使用其他容器的 IP、env 等信息。
- - -lxc-conf=[] 指定容器的配置文件,只有在指定 --exec-driver=lxc 時使用。
- - -name="" 指定容器名字,后續(xù)可以通過名字進(jìn)行容器管理,links 特性需要使用名字。
- - -network=“bridge” 器網(wǎng)絡(luò)設(shè)置,
bridge
使用 docker daemon 指定的網(wǎng)橋;host
容器使用主機(jī)的網(wǎng)絡(luò);container:NAME_or_ID
使用其他容器的網(wǎng)路,共享 IP 和 PORT 等網(wǎng)絡(luò)資源;none
容器使用自己的網(wǎng)絡(luò)(類似- -network=bridge),但是不進(jìn)行配置。 - - -privileged=false 指定容器是否為特權(quán)容器,特權(quán)容器擁有所有的 capabilities。
- -restart=“no” 指定容器停止后的重啟策略: no:容器退出時不重啟,on-failure:容器故障退出(返回值非零)時重啟, always:容器退出時總是重啟。 - - -rm=false 指定容器停止后自動刪除容器(不支持以 docker run -d 啟動的容器)。
- - -sig-proxy=true 設(shè)置由代理接受并處理信號,但是 SIGCHLD、SIGSTOP 和 SIGKILL 不能被代理。
示例:
docker run -idt -v /:/home/lnmp --network host centos:centos7 /bin/bash
COMMAND、ARG...
代表容器運(yùn)行之后,要執(zhí)行的命令行命令和參數(shù)
# 運(yùn)行容器,并進(jìn)入bash
$ docker run -it nginx:latest /bin/bash
3.啟動容器docker start
$ docker start [OPTIONS] CONTAINER [CONTAINER...]
Options:
- -a, --attach ,連接容器的標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯誤
- --detach-keys,覆蓋分離容器的鍵的順序
- -i, --interactive,連接容器的標(biāo)準(zhǔn)輸入
4.停止容器 docker stop
$ docker stop [OPTIONS] CONTAINER [CONTAINER...]
Options:
- -t, --time ,在停止之前等待的秒數(shù),默認(rèn)為10s;
5.重啟容器docker restart
$ docker restart contanier
6.強(qiáng)制停止 docker kill
$ docker kill container
7.刪除容器 docker rm
docker rm [OPTIONS] CONTAINER [CONTAINER...]
Option參數(shù):
- -f 通過 SIGKILL 信號強(qiáng)制刪除一個運(yùn)行中的容器。
- -l 移除容器間的網(wǎng)絡(luò)連接,而非容器本身。
- -v:-v 刪除與容器關(guān)聯(lián)的卷。
8.暫停、恢復(fù) docker pause/unpause
暫停、恢復(fù)容器內(nèi)的進(jìn)程的運(yùn)行。
$ docker pause CONTAINER [CONTAINER...]
$ docker unpause CONTAINER [CONTAINER...]
9.執(zhí)行命令 docker exec
docker exec 用于在一個運(yùn)行中的容器內(nèi)執(zhí)行command。
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS說明:
- --detach, -d 后臺運(yùn)行模式,在后臺執(zhí)行命令相關(guān)命令。
- --detach-keys 覆蓋容器后臺運(yùn)行的一些參數(shù)信息。
- --env, -e 設(shè)置環(huán)境變量。
- --interactive, -i 展示容器輸入信息 STDIN。
- --privileged 為命令提供一些擴(kuò)展權(quán)限。
- --tty, -t 命令行交互模式。
- --user, -u 設(shè)置用戶名。
# 在指定容器打開一個bash環(huán)境的交互式終端
$ docker exec -i -t mynginx /bin/bash
容器運(yùn)維
1.列出容器 docker ps
$ docker ps [OPTIONS]
OPTIONS說明:
- 無參 默認(rèn)顯示正在運(yùn)行的容器。
- -a 顯示所有的容器,包括未運(yùn)行的。
- -f 根據(jù)條件過濾顯示的內(nèi)容。
- - -format 指定返回值的模板文件。
- -l 顯示最近創(chuàng)建的容器。
- -n 列出最近創(chuàng)建的n個容器。
- - -no-trunc 不截斷輸出。
- -q 靜默模式,只顯示容器編號。
- -s 顯示總的文件大小。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- CONTAINER ID: 容器 ID。
- IMAGE: 使用的鏡像。
- COMMAND: 啟動容器時運(yùn)行的命令。
- CREATED: 容器的創(chuàng)建時間。
- STATUS: 容器狀態(tài)。狀態(tài)有7種:created(已創(chuàng)建)、restarting(重啟中)、running(運(yùn)行中)、removing(遷移中)、paused(暫停)、exited(停止)、dead(死亡)
- PORTS: 容器的端口信息和使用的連接類型(tcpudp)。
- NAMES: 自動分配的容器名稱。
2.查看容器內(nèi)正在運(yùn)行的進(jìn)程信息
容器運(yùn)行時不一定有/bin/bash終端來交互執(zhí)行top命令,而且容器還不一定有top命令,可以使用docker top來實現(xiàn)查看container中正在運(yùn)行的進(jìn)程
$ docker top CONTAINER [ps OPTIONS]
3.連接容器 docker attach
關(guān)聯(lián)容器的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、錯誤輸出到容器到本機(jī)
$ docker attach [OPTIONS] CONTAINER
options 說明
- --detach-keys 覆蓋用于分離容器的鍵序列
- --no-stdin 不要附加標(biāo)準(zhǔn)輸入
- --sig-proxy 所有接收到的信號代理到進(jìn)程
4.阻塞容器 docker wait
阻塞容器運(yùn)行,直到容器停止運(yùn)行,同時輸出退出的狀態(tài)碼,通過狀態(tài)碼判斷容器的退出狀態(tài)。
$ docker wait CONTAINER [CONTAINER...]
5.端口映射 docker port
docker port 命令可以用于列出指定的 Docker容器 的端口映射,或者將容器里的端口映射到宿主機(jī)。該命令后面的 CONTAINER 可以是容器Id,或者是容器名。
$ docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]
$ docker port mysql
$ docker port mysql 3306/tcp
6.元數(shù)據(jù) docker inspect
$ docker inspect [OPTIONS] NAME|ID [NAME|ID...]
OPTIONS說明:
- -f 指定返回值的模板文件。
- -s 顯示總的文件大小。
- - -type 為指定類型返回JSON。
7.容器重命名 docker rename
$ docker rename CONTAINER NEW_NAME
8.統(tǒng)計 docker stats
docker stats 命令可以用于動態(tài)顯示 Docker容器 的資源消耗情況,包括:CPU、內(nèi)存、網(wǎng)絡(luò)I/O。docker stats命令也可以指定已停止的容器,但是不會返回任何信息。
docker stats [options] [container...]
OPTIONS參數(shù):
- - -all, -a 查看所有容器信息(默認(rèn)顯示運(yùn)行中的)。
- - -format Go模板展示鏡像信息。
- - -no-stream 不展示容器的一些動態(tài)信息。
9.更新配置docker update
docker update [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS說明:
- - -cpu-shares 更新 cpu-shares。
- - -kernel-memory 更新內(nèi)核內(nèi)存限制。
- - -memory 更新內(nèi)存限制。
- - -restart 更新重啟策略。
10.容器導(dǎo)出 docker export
將 Docker容器 里的文件系統(tǒng)作為一個 tar 歸檔文件導(dǎo)出。docker export 命令后面的 CONTAINER 可以是容器Id,或者是容器名。
$ docker export [OPTIONS] CONTAINER
OPTIONS說明:
- -o 將輸入內(nèi)容寫到文件。
11.導(dǎo)入鏡像 docker import
用于導(dǎo)入export導(dǎo)出的鏡像歸檔文件。
$ docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
$ docker images nicen/ubuntu:v4
區(qū)別、側(cè)重點
參考
https://blog.csdn.net/JineD/article/details/118761569
1.docker save和docker export的區(qū)別
- docker save保存的是鏡像(image)
- docker export保存的是容器(container)
2.docker load和docker import的區(qū)別
- docker load用來載入鏡像包;
- docker import用來載入容器包,但兩者都會恢復(fù)為鏡像;
- docker load不能對載入的鏡像重命名;
- docker import可以為鏡像指定新名稱。;
3.打包鏡像和打包容器的區(qū)別
從文件的角度來說,打包容器僅僅會打包容器的當(dāng)前狀態(tài)(類似服務(wù)器快照),會丟棄所有的歷史記錄和元數(shù)據(jù)信息。而打包鏡像則是導(dǎo)出完整的歷史記錄和元信息。
Docker日志
1.實時事件 docker events
從服務(wù)器獲取實時事件
docker events [OPTIONS]
OPTIONS說明:
- -f :根據(jù)條件過濾事件;
- --since :從指定的時間戳后顯示所有事件;
- --until :流水時間顯示到指定的時間為止;
2.歷史版本 dcoker history
打印出指定的 Docker鏡像 的歷史版本信息。
docker history [OPTIONS] IMAGE
OPTIONS說明:
- docker history -H, --human 以可讀的格式打印鏡像大小和日期,默認(rèn)為 true。
- docker history --no-trunc 顯示完整的提交記錄。
- docker history -q, --quiet 僅列出提交記錄 ID。
3.輸出日志 docker log
獲取容器運(yùn)行時輸出的日志信息
docker logs [OPTIONS] CONTAINER
- docker logs --details 顯示 log 信息的額外的詳細(xì)信息。docker logs -f, --follow 跟蹤日志輸出。docker logs --since 顯示某個開始時間的所有日志。docker logs --tail 僅列出最新 N 條容器日志。
- docker logs -t, --timestamps 顯示時間戳。
Docker rootfs命令
1.docker commit
docker commit 命令用于根據(jù) Docker容器 的更改創(chuàng)建一個新的 Docker鏡像。該命令后面的 CONTAINER 可以是容器Id,或者是容器名。
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS說明:
- -a, --author string 作者。
- -c, --change list 應(yīng)用 dockerfile 指令來創(chuàng)建圖像。
- -m, --message string 提交信息。
- -p, --pause 提交期間暫停容器(默認(rèn)為true)。
2.docker cp
# 從容器復(fù)制到宿主機(jī)
$ docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
# 從宿主機(jī)復(fù)制到容器
$ docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
OPTIONS說明:
- -a, --archive 歸檔模式(復(fù)制所有UID / GID信息)
- -L, --follow-link 總是跟在源地址符號鏈接
命令說明
- docker cp 命令類似于 Linux 中的 cp -a 命令,遞歸復(fù)制目錄下的所有子目錄和文件。
- docker cp 命令中的 - 表示通過標(biāo)準(zhǔn)輸入/輸出設(shè)備以流的方式讀取或?qū)懭?tar 文件。
- 本地文件系統(tǒng)中的路徑可以是絕對路徑,也可以是相對路徑,相對于當(dāng)前命令執(zhí)行的路徑。
- 容器中的路徑都是相對容器的 / 根路徑。
- docker cp 命令操作的容器可以是在運(yùn)行狀態(tài),也可以是停止?fàn)顟B(tài)。
- docker cp 命令不能復(fù)制 /proc、 /sys、 /dev、 tmpfs 和容器中 mount 的路徑下的文件。
3.docker diff
docker diff 命令用于比較一個 Docker容器 不同版本提交的文件差異。該命令后面的 CONTAINER 可以是容器Id,或者是容器名。
docker diff命令會列出 3 種容器內(nèi)文件狀態(tài)變化(A - Add, D - Delete, C - Change )的列表清單。
$ docker diff CONTAINER
制作鏡像
1.docker build
docker build 命令可以用來使用 Dockerfile 創(chuàng)建鏡像。
$ docker build [OPTIONS] PATH | URL | -
相關(guān)文檔:https://www.runoob.com/docker/docker-build-command.html、https://www.runoob.com/docker/docker-dockerfile.html
2.docker Dockerfile
Dockerfile 是一個用來構(gòu)建鏡像的文本文件,文本內(nèi)容包含了一條條構(gòu)建鏡像所需的指令和說明。
相關(guān)說明:https://www.runoob.com/docker/docker-dockerfile.html
3.docker composer
Compose 是用于定義和運(yùn)行多容器 Docker 應(yīng)用程序的工具。通過 Compose,您可以使用 YML 文件來配置應(yīng)用程序需要的所有服務(wù)。然后,使用一個命令,就可以從 YML 文件配置中創(chuàng)建并啟動所有服務(wù)。
相關(guān)說明:https://www.runoob.com/docker/docker-compose.html
Docker容器網(wǎng)絡(luò)
原文
https://blog.csdn.net/qq_42418169/article/details/119102917
1.介紹
容器網(wǎng)絡(luò)實質(zhì)上也是由Docker為應(yīng)用程序所創(chuàng)造的虛擬環(huán)境的一部分,它能讓應(yīng)用從宿主機(jī)操作系統(tǒng)的網(wǎng)絡(luò)環(huán)境中獨立出來,形成容器自有的網(wǎng)絡(luò)設(shè)備、IP協(xié)議棧、端口套接字、IP路由表、防火墻等等與網(wǎng)絡(luò)相關(guān)的模塊。
Docker
Docker網(wǎng)絡(luò)中有三個核心概念:沙盒(Sandbox)、網(wǎng)絡(luò)(Network)、端點(Endpoint)。
- 沙盒,提供了容器的虛擬網(wǎng)絡(luò)棧,也即端口套接字、IP路由表、防火墻等內(nèi)容。隔離容器網(wǎng)絡(luò)與宿主機(jī)網(wǎng)絡(luò),形成了完全獨立的容器網(wǎng)絡(luò)環(huán)境。
- 網(wǎng)絡(luò),可以理解為Docker內(nèi)部的虛擬子網(wǎng),網(wǎng)絡(luò)內(nèi)的參與者相互可見并能夠進(jìn)行通訊。Docker的虛擬網(wǎng)絡(luò)和宿主機(jī)網(wǎng)絡(luò)是存在隔離關(guān)系的,其目的主要是形成容器間的安全通訊環(huán)境。
- 端點,位于容器或網(wǎng)絡(luò)隔離墻之上的洞,主要目的是形成一個可以控制的突破封閉的網(wǎng)絡(luò)環(huán)境的出入口。當(dāng)容器的端點與網(wǎng)絡(luò)的端點形成配對后,就如同在這兩者之間搭建了橋梁,便能夠進(jìn)行數(shù)據(jù)傳輸了。
這三者形成Docker網(wǎng)絡(luò)核心模型,也就是容器網(wǎng)絡(luò)模型(Container Network Model)。
2.Docker的網(wǎng)絡(luò)實現(xiàn)
容器網(wǎng)絡(luò)模型為容器引擎提供了一套標(biāo)準(zhǔn)的網(wǎng)絡(luò)對接范式,Docker中,實現(xiàn)這套范式的是Docker所封裝的libnetwork模塊。
Docker官方提供了五種Docker網(wǎng)絡(luò)驅(qū)動,分別是:Bridge Driver、Host Driver、Overlay Driver、MacLan Driver、None Driver。Bridge和 Overlay在開發(fā)中使用頻率較高。
- host(主機(jī)模式) 相當(dāng)于Vmware中的橋接模式,與宿主機(jī)在同一個網(wǎng)絡(luò)中,但沒有獨立IP地址
- bridge(橋梁模式) 相當(dāng)于Vmware中的Nat模式,容器使用獨立network Namespace,并連接到docker0虛擬網(wǎng)卡(默認(rèn)模式)。
- overlay(覆蓋模式) Overlay網(wǎng)絡(luò)是指在不改變現(xiàn)有網(wǎng)絡(luò)基礎(chǔ)設(shè)施的前提下,通過某種約定通信協(xié)議,把二層報文封裝在IP報文之上的新的數(shù)據(jù)格式。
- container(容器模式) 在理解了host模式后,這個模式也就好理解了。這個模式指定新創(chuàng)建的容器和已經(jīng)存在的一個容器共享一個Network Namespace,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個指定的容器共享IP、端口范圍等。同樣,兩個容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。兩個容器的進(jìn)程可以通過lo網(wǎng)卡設(shè)備通信。
- none(無網(wǎng)絡(luò)模式) 該模式將容器放置在它自己的網(wǎng)絡(luò)棧中,但是并不進(jìn)行任何配置。實際上,該模式關(guān)閉了容器的網(wǎng)絡(luò)功能,在以下兩種情況下是有用的:容器并不需要網(wǎng)絡(luò)(例如只需要寫磁盤卷的批處理任務(wù))。
3.默認(rèn)網(wǎng)絡(luò)(docker 0)
當(dāng)你安裝Docker時,它會自動創(chuàng)建三個網(wǎng)絡(luò)。你可以使用docker network ls命令列出這些網(wǎng)絡(luò):
C:UsersAdmin>docker network ls
NETWORK ID NAME DRIVER SCOPE
ff3025b2bb75 bridge bridge local
4db4c96b8fad host host local
075e1e639650 none null local
Docker內(nèi)置這三個網(wǎng)絡(luò),運(yùn)行容器時,你可以在run運(yùn)行容器時使用--network
標(biāo)志來指定容器應(yīng)連接到哪個網(wǎng)絡(luò)。
不指定network時,默認(rèn)將容器連接到bridge網(wǎng)絡(luò)。
4.host網(wǎng)絡(luò)模式
相當(dāng)于Vmware中的橋接模式,與宿主機(jī)在同一個網(wǎng)絡(luò)中,但沒有獨立IP地址。
Docker使用了Linux的Namespaces技術(shù)來進(jìn)行資源隔離,如PID Namespace隔離進(jìn)程,Mount Namespace隔離文件系統(tǒng),Network Namespace隔離網(wǎng)絡(luò)等。
一個Network Namespace提供了一份獨立的網(wǎng)絡(luò)環(huán)境,包括網(wǎng)卡、路由、Iptable規(guī)則等都與其他的Network Namespace隔離。一個Docker容器一般會分配一個獨立的Network Namespace。但如果啟動容器的時候使用host模式,那么這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機(jī)共用一個Network Namespace。容器將不會虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機(jī)的IP和端口。
5.bridge網(wǎng)絡(luò)模式
相當(dāng)于Vmware中的Nat模式,容器使用獨立network Namespace,并連接到docker0虛擬網(wǎng)卡(默認(rèn)模式)。通過docker0網(wǎng)橋以及Iptables nat表配置與宿主機(jī)通信;bridge模式是Docker默認(rèn)的網(wǎng)絡(luò)設(shè)置,此模式會為每一個容器分配Network Namespace、設(shè)置IP等,并將一個主機(jī)上的Docker容器連接到一個虛擬網(wǎng)橋上。
Docker 默認(rèn)的 bridge 網(wǎng)絡(luò)是不支持通過 Docker DNS 服務(wù)進(jìn)行域名解析的,自定義橋接網(wǎng)絡(luò)是可以的。
5.1Bridge模式的拓?fù)?/h4>
當(dāng)Docker server啟動時,會在主機(jī)上創(chuàng)建一個名為docker0的虛擬網(wǎng)橋,此主機(jī)上啟動的Docker容器會連接到這個虛擬網(wǎng)橋上。
虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過交換機(jī)連在了一個二層網(wǎng)絡(luò)中。接下來就要為容器分配IP了,Docker會從RFC1918所定義的私有IP網(wǎng)段中,選擇一個和宿主機(jī)不同的IP地址和子網(wǎng)分配給docker0,連接到docker0的容器就從這個子網(wǎng)中選擇一個未占用的IP使用。
如一般Docker會使用172.17.0.0/16這個網(wǎng)段,并將172.17.0.1/16分配給docker0網(wǎng)橋(在主機(jī)上使用ifconfig命令是可以看到docker0的,可以認(rèn)為它是網(wǎng)橋的管理接口,在宿主機(jī)上作為一塊虛擬網(wǎng)卡使用)。單機(jī)環(huán)境下的網(wǎng)絡(luò)拓?fù)淙缦?,主機(jī)地址為10.10.0.186/24。
Dokcer
Docker完成以上網(wǎng)絡(luò)配置的過程大致是這樣的:
- 在主機(jī)上創(chuàng)建一對虛擬網(wǎng)卡veth pair設(shè)備。veth設(shè)備總是成對出現(xiàn)的,它們組成了一個數(shù)據(jù)的通道,數(shù)據(jù)從一個設(shè)備進(jìn)入,就會從另一個設(shè)備出來。因此,veth設(shè)備常用來連接兩個網(wǎng)絡(luò)設(shè)備。
- Docker將veth pair設(shè)備的一端放在新創(chuàng)建的容器中,并命名為eth0。另一端放在主機(jī)中,以veth65f9這樣類似的名字命名,并將這個網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中
- 從docker0子網(wǎng)中分配一個IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。
6.docker overlay模式
Overlay網(wǎng)絡(luò)是指在不改變現(xiàn)有網(wǎng)絡(luò)基礎(chǔ)設(shè)施的前提下,通過某種約定通信協(xié)議,把二層報文封裝在IP報文之上的新的數(shù)據(jù)格式。這樣不但能夠充分利用成熟的IP路由協(xié)議進(jìn)程數(shù)據(jù)分發(fā);而且在Overlay技術(shù)中采用擴(kuò)展的隔離標(biāo)識位數(shù),能夠突破VLAN的4000數(shù)量限制支持高達(dá)16M的用戶,并在必要時可將廣播流量轉(zhuǎn)化為組播流量,避免廣播數(shù)據(jù)泛濫。
因此,Overlay網(wǎng)絡(luò)實際上是目前最主流的容器跨節(jié)點數(shù)據(jù)傳輸和路由方案。
要想使用Docker原生Overlay網(wǎng)絡(luò),需要滿足下列任意條件
- Docker 運(yùn)行在Swarm
- 使用鍵值存儲的Docker主機(jī)集群
Docker Network
docker network inspect # 根據(jù)網(wǎng)絡(luò)的ID展示網(wǎng)絡(luò)的詳細(xì)信息
docker network ls # 展示所有的網(wǎng)絡(luò),以列表形式
docker network create # 創(chuàng)建一個自定義網(wǎng)絡(luò)
docker network connect # 連接一個容器到指定網(wǎng)絡(luò)上
docker network disconnect # 讓一個容器從指定網(wǎng)絡(luò)上斷開
docker network prune # 刪除所有未使用的網(wǎng)絡(luò)
docker network rm # 根據(jù)網(wǎng)絡(luò)的ID,刪除一個或多個網(wǎng)絡(luò)
Docker Machine
Docker Machine 是 Docker 官方提供的一個工具,它可以幫助我們在遠(yuǎn)程的機(jī)器上安裝 Docker,或者在虛擬機(jī) host 上直接安裝虛擬機(jī)并在虛擬機(jī)中安裝 Docker。我們還可以通過 docker-machine 命令來管理這些虛擬機(jī)和 Docker。