Docker知識手冊

Docker


docker文件系統(tǒng)層


容器


啟動docker:docker start

查看docker運(yùn)行狀態(tài):docker stats? ? //查看CPU,IO,PID等信息

停止docker:docker stop


創(chuàng)建容器:docker run -it -d 鏡像名 -c "echo hello word"

-i:保證容器中STDIN開啟

-t:為創(chuàng)建的容器創(chuàng)造一個偽tty終端,這樣可以提供一個交互式Shell

--name:為容器命名,未指定由docker自行創(chuàng)建

-d:以后臺方式運(yùn)行

-c:啟動后在容器中運(yùn)行命令?

-p:控制容器在運(yùn)行時公開哪些端口給宿主機(jī),如-p 8080:80將容器的80端口綁定到宿主機(jī)的8080端口

-P:該命令會將容器的80端口對本地宿主機(jī)公開,并綁定到宿主機(jī)的一個隨機(jī)端口,用該命令會將Dockerfile的EXPOSE指令的其他端口也一起公開

-w:運(yùn)行時覆蓋工作目錄

-e:運(yùn)行時環(huán)境變量,只會在運(yùn)行時有效

-u:指定容器以哪個用戶身份運(yùn)行

-h:設(shè)置容器主機(jī)名,默認(rèn)將容器主機(jī)名設(shè)置為容器ID。

-v:將宿主機(jī)的目錄作為卷,掛載到容器里。當(dāng)提交或創(chuàng)建鏡像時,卷不被包含在鏡像里。

--link:連接其他容器。該標(biāo)志需要兩個參數(shù),一個是連接的容器名字,另一個是別名。如redis:db

--privileged:啟動docker的特權(quán)模式,這種模式允許我們以其宿主機(jī)具有的所有能力來運(yùn)行容器,包括一些內(nèi)核特性和設(shè)備的訪問。

--volumes-from:復(fù)用其他容器掛載的卷

--rm:該標(biāo)志會在進(jìn)程運(yùn)行完后自動刪除容器


查看容器內(nèi)部日志:docker logs -t? --tail 0 -f 容器名/容器ID

-t:加入時間戳

---tail 0 -f :跟蹤最新日志而不去讀取整個日志文件


重新啟動已經(jīng)停止的容器:docker start 容器名/容器ID

啟動后進(jìn)入容器:docker attach 容器名/容器ID

停止容器:docker stop?容器名/容器ID

自動重啟容器:docker run --restart=always?容器名/容器ID

? ? always:無論容器退出代碼是什么都自動重啟該容器

? ? on-failure:當(dāng)容器退出代碼為非0值時才會自動重啟

? ? on-failure:5:設(shè)置自動重啟次數(shù)


查看容器內(nèi)的進(jìn)程:docker top?容器名/容器ID

查看容器詳細(xì)信息:docker inspect?容器名/容器ID //可查看名次,命令,網(wǎng)絡(luò)配置等


在容器中運(yùn)行后臺任務(wù):docker exec -d?容器名/容器ID touch /home/new_file

進(jìn)入容器內(nèi)部運(yùn)行交互命令:docker exec -it?容器名/容器ID /bin/bash


刪除容器:docker rm?容器名/容器ID

一次性刪除所有容器:docker rm $(docker ps -aq ) //-a (ALL) 查看所有容器,-q只返回ID


鏡像


列出所有鏡像:docker images? ??

拉取鏡像:docker run 命令啟動一個容器時,Docker會先從docker hub上下載,如果沒有指定標(biāo)簽,則自動下載latest標(biāo)簽的鏡像。

拉取指定鏡像:docker pull redis:3.0.0 ????//拉取帶標(biāo)簽的鏡像

查找鏡像:docker search 鏡像名

????NAME:倉庫名? ? ?DESCRIPTION:描述????STARS:受歡迎程度? OFFICIAL:是否官方? ? ????AUTOMATED:自動構(gòu)建,表示這個鏡像是由github自動構(gòu)建流程創(chuàng)建的。


Dockerfile構(gòu)建容器鏡像

示例

? ? Dockerfile由一系列指令和參數(shù)組成,指令必須大寫后面要跟一個參數(shù),Dockerfile中的指令會按順序從上到下執(zhí)行,每條指令都會創(chuàng)建一個新的鏡像層并對鏡像層進(jìn)行提交。?

構(gòu)建流程

????????構(gòu)建鏡像指令:docker build -t="鏡像名:鏡像標(biāo)簽"? //構(gòu)建鏡像時會將之前的鏡像進(jìn)行緩存,如不需要構(gòu)建時進(jìn)行緩存可以使用--no-cache標(biāo)識。

? ? ????查看鏡像構(gòu)建過程指令:docker history 容器ID????

? ? ? ? 刪除鏡像:docker rmi 鏡像名:鏡像標(biāo)簽/鏡像ID

? ? ? ? 刪除所有鏡像:docker rmi $(docker images -aq)


? ? Dockerfile指令介紹:

? ? FROM:指定一個已經(jīng)存在的鏡像,后續(xù)指令都基于該鏡像進(jìn)行,這個鏡像稱為基礎(chǔ)鏡像。

? ? MAINTAINER:告訴docker鏡像作者是誰以及郵箱地址等。

? ? RUN:RUN指令會在當(dāng)前鏡像中運(yùn)行指定的命令,每條RUN指令都會創(chuàng)建一個新的鏡像層,如果該指令執(zhí)行成功,就會將該鏡像層提交,執(zhí)行后續(xù)指令。默認(rèn)情況下RUN指令會在shell里使用命令包裝器/bin/sh -c來執(zhí)行,如果平臺不支持shell可以使用exec指令。如下:

exec格式的RUN指令

? ? CMD:容器啟動時要運(yùn)行的命令,類似于RUN,只是RUN是指定鏡像被構(gòu)建時運(yùn)行的指令,CMD是容器啟動時運(yùn)行的命令。注意:Dockerfile只能有一條CMD命令,如設(shè)置多條也只會運(yùn)行最后一條。另外docker run 命令可以覆蓋CMD命令。

? ? ENTRYPOINT:與CMD指令很類似,區(qū)別在于該命令會接收docker run所指定的所有參數(shù),不容易在啟動時被覆蓋。如? ?EXTRYPOINT ["/usr/sbin/nginx"],執(zhí)行docker run xxx -g "deamon off",這個參數(shù)會傳遞給ENTRYPOINT指定的命令,在這里命令為/usr/sbin/nginx -g "deamon of"。

? ? EXPOSE:告訴docker將會使用容器的哪些端口,出于安全原因,指定后也不會自動打開該端口,需要在docker run -p運(yùn)行容器時指定需要打開哪些端口。

? ? ENV:設(shè)置環(huán)境變量。 新的環(huán)境變量可以在后續(xù)的任何RUN指令中使用

? ? WORKDIR:在容器內(nèi)部設(shè)置一個工作目錄,ENRRYPOINT,CMD或/指定的程序會在這個目錄下執(zhí)行。(可設(shè)置多個用來切換不同的工作目錄)

在其他指令中使用環(huán)境變量

????USER:基于該鏡像啟動的容器會以指定的用戶身份運(yùn)行,我們可以指定用戶名,UID以及組或GID,甚至兩者組合:USER user | USER user:group |USER uid |USER uid:gid...,可以在docker run -u選項(xiàng)覆蓋該值,如果不指定USER默認(rèn)以root運(yùn)行。

? ? VOLUME:用來向基于鏡像創(chuàng)建的容器添加卷,一個卷可以可以存在于一個或者多個容器內(nèi)的指定的目錄,并提供以下共享數(shù)據(jù)或者對數(shù)據(jù)進(jìn)行持久化的功能

? ? 1:卷可以在容器間共享和重用????

? ? 2:對卷的修改是立即生效的

? ? 3:對卷的修改不會對更新鏡像產(chǎn)生影響

? ? 4:卷會一直存在直到?jīng)]有任何容器使用它

? ?例子:VOLUME ["/opt/project",'/data'],這條指令會為基于該鏡像創(chuàng)建的任何容器創(chuàng)建指定的兩個掛載點(diǎn)

? ? ADD:將構(gòu)建環(huán)境下的文件或目錄復(fù)制到鏡像中,不能對構(gòu)建上下文外的文件進(jìn)行ADD操作,另外也可以使用URL作為文件源,另外如果文件以gzip,bzip2,xz結(jié)尾,Docker還會進(jìn)行自動解壓

? ? 例子:ADD latest.tar.gz /var/www/wordpress,將歸檔文件解壓到/var/www/wordpress目錄下,如果目的位置下已經(jīng)存在同名文件或目錄,那么目的位置的文件或目錄不會被覆蓋,如果目的位置不存在的話docker會自動創(chuàng)建,包括路徑中的任何目錄,文件模式為0755,并且UID和GID都是0。

? ? COPY:類似于ADD,不同的是只復(fù)制,不做提取和解壓

? ? ONBUILD:為鏡像添加觸發(fā)器,當(dāng)鏡像被其他鏡像作為基礎(chǔ)鏡像時,該觸發(fā)器將會被執(zhí)行。觸發(fā)器是緊跟在FROM后指定的,觸發(fā)器可以是任何構(gòu)建指令。

? ? 例子:ONBUILD ADD . /app/src? ? ?

? ? ? ? ? ? ? ? ONBUILD RUN cd /app/src && make? ?

? ? 可以通過docker inspect 查看鏡像中的ONBUILD指令,注意:FROM,MAINTAINER和ONBUILD本身不能再ONBUILD指令中使用。


Docker Registry

? ? 有時我們可能希望構(gòu)建和存儲包含不想被公開的信息或數(shù)據(jù)鏡像??梢杂幸韵聝蓚€選擇:

? ? 1利用Docker Hub上的私有倉庫

? ? 2防火墻后面運(yùn)行自己的Registry

從容器中運(yùn)行Registry

? ? docker run -p 5000:5000 registry

將自己的鏡像打標(biāo)簽

? ? docker tag 鏡像ID 主機(jī)名:5000/倉庫名/鏡像名?

將鏡像推送至新Registry

? ? docker push 主機(jī)名:5000/倉庫名/鏡像名

?注意:? ?可能會出現(xiàn)無法push鏡像到私有倉庫的問題。提示

這是因?yàn)槲覀儐拥膔egistry服務(wù)不是安全可信賴的。這時需要修改客戶端docker的配置文件/etc/docker/daemon.json,添加下面的內(nèi)容(registry服務(wù)地址)

{"registry-mirrors": [ "https://pee6w651.mirror.aliyuncs.com"],"insecure-registries": ["主機(jī)名:5000"]},修改好之后需要重啟Docker服務(wù)才能生效,執(zhí)行命令:systemctl restart docker?,再push即可。


Docker構(gòu)建靜態(tài)網(wǎng)站步驟

1 創(chuàng)建一個目錄用于存放Dockerfile文件,創(chuàng)建一個子目錄放置靜態(tài)資源文件。

2.編寫nginx配置文件(一個nginx.conf,一個global.conf)????

global.conf


nginx.conf

在nginx.conf配置文件里,deamon off選項(xiàng)阻止Nginx進(jìn)入后臺,強(qiáng)制在前臺運(yùn)行。這是因?yàn)橄胍WCdocker容器的活躍狀態(tài),需要其中的進(jìn)程不能中斷,默認(rèn)情況下,nginx會以守護(hù)進(jìn)程方式啟動,這會導(dǎo)致容器只是短暫執(zhí)行,在守護(hù)進(jìn)程被fork啟動后,發(fā)起守護(hù)進(jìn)程的原始進(jìn)程就會退出,這時容器就停止運(yùn)行了。

3.編寫Dockerfile

Dockerfile

Dockerfile內(nèi)容包括以下幾項(xiàng):1.安裝nginx????2.在容器創(chuàng)建/var/www/html用于放置靜態(tài)資源文件????

?????????????????????????????????????????????????3.將nginx配置文件添加到鏡像中? ? 4.公開鏡像的80端口

4.執(zhí)行docker build -t 鏡像名 .??

5.使用鏡像構(gòu)建容器docker run -d -p 8080:80 --name 容器名 -v 宿主機(jī)資源目錄:容器目錄 鏡像名


?docker內(nèi)部網(wǎng)絡(luò)

? ? 在安裝Docker時,會創(chuàng)建一個新的網(wǎng)絡(luò)接口,名字是docker0。每個docker容器都會在這個接口上分配一個ip地址。

docker0網(wǎng)絡(luò)接口

docker0接口的范圍是172.16~172.30。接口本身的地址172.17.42.1是這個docker網(wǎng)絡(luò)的網(wǎng)關(guān)地址,也是所有容器的網(wǎng)關(guān)地址。docker默認(rèn)會使用172.17.x.x作為子網(wǎng)地址,除非有人占用了這個子網(wǎng),如果有人占用了這個子網(wǎng),docker將會在172.16~172.30這個范圍內(nèi)嘗試創(chuàng)建子網(wǎng)。


容器內(nèi)部的eth0接口

? ? docker每創(chuàng)建一個容器就會創(chuàng)建一組互聯(lián)的網(wǎng)絡(luò)接口。這組接口就像管道的兩端。這組接口其中一端作為容器的eth0接口,而另一端統(tǒng)一命名為類似vethec6a這種名字,作為宿主機(jī)的一個端口,可以認(rèn)為veth接口是虛擬網(wǎng)線的一端,這個虛擬網(wǎng)線一端插在名為docker0的網(wǎng)橋上,另一端插到容器里,通過把每個veth*接口綁定到docker網(wǎng)橋,docker創(chuàng)建了一個虛擬子網(wǎng),這個子網(wǎng)由宿主機(jī)和所有docker容器共享。

????可以看到,Docker給容器分配了IP地址172.17.0.29作為宿主虛擬接口的另一端,這樣就能讓宿主網(wǎng)絡(luò)和容器相互通訊了。

查看容器的ip地址

? ? 在拿到容器的ip地址后,可以不用映射到宿主機(jī),直接使用該ip地址就可以連接到容器了。

? ? 注意:docker默認(rèn)會把公開的端口綁定到所有的網(wǎng)絡(luò)接口上。因此,也可以通過localhost或者127.0.0.1來訪問容器

? ? 這個互聯(lián)方案存在兩個問題。第一:要在應(yīng)用程序里對容器的ip地址做硬編碼。第二:重啟容器時docker會改變?nèi)萜鞯膇p地址。為解決這個問題,docker提供了連接(Link)功能,這個功能可以把一個或者多個容器連接起來,讓其相互通信。


docker容器互連

連接redis容器

? ? docker run 的--link標(biāo)志創(chuàng)建了兩個容器間的父子連接。該標(biāo)志需要兩個參數(shù),一個是要連接容器的名字,一個是連接后容器的別名。別名讓我們可以訪問公開信息,無需關(guān)注底層容器的名字,連接讓父容器有能力訪問子容器,并把子容器的一些連接細(xì)節(jié)分享給父容器。采用連接方式容器可以不暴露端口,減少應(yīng)用暴露的網(wǎng)絡(luò),提高安全性。

? ? 注意:被相連的容器必須運(yùn)行在同一個docker宿主機(jī)上,不同宿主機(jī)上運(yùn)行的容器無法連接。

? ? 最后,讓容器啟動時加載shell,而不是服務(wù)守護(hù)進(jìn)程,這樣可以查看容器是如何連接在一起的。docker在父容器里的以下兩個地方寫入了連接信息:

? ? 1:/etc/hosts文件中 (cat /etc/hosts)? ? ? ? 2:包含連接信息的環(huán)境變量中(env)

? ??


?

? ??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 9,021評論 1 21
  • 在前面兩節(jié)我們學(xué)習(xí)了如何安裝以及簡單的運(yùn)行管理docker容器,在本節(jié)我們將會更多的探討關(guān)于docker鏡像的知識...
    井底蛙蛙呱呱呱閱讀 4,282評論 0 5
  • 五、Docker 端口映射 無論如何,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問不到的。此外,除了...
    R_X閱讀 1,972評論 0 7
  • 0x01 核心概念 Docker鏡像類似于虛擬機(jī)鏡像,可以理解為一個面向Docker引擎的只讀模板,包含了文件系統(tǒng)...
    閑云逸心閱讀 4,980評論 0 9
  • 滴水之恩,當(dāng)涌泉相報! 客隨主便,卻反客為主! 友滴答滴答me,愛嘩啦嘩啦you!
    魔都一諾閱讀 111評論 0 0

友情鏈接更多精彩內(nèi)容