Docker


容器
啟動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)建鏡像指令: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指令。如下:

? ? 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è)置多個用來切換不同的工作目錄)

????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)????



在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內(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接口的范圍是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)。

? ? 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地址后,可以不用映射到宿主機(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容器互連

? ? 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)
? ??

?
? ??