Docker運(yùn)行環(huán)境
docker 是支持跨平臺運(yùn)行,支持MacOS,Windows,Linux操作系統(tǒng)剪勿,詳見 https://docs.docker.com/get-docker/
- Docker (client-server 架構(gòu)) 包含一個守護(hù)進(jìn)程Docker daemon(Server端), 一個Docker Client(Cli)
- Linux centos 要求至少centos7 版本,Windows至少要windows10,MacOs至少要MacOS10.14
- Docker 支持RestAPI, 分兩類 Docker Engine API 與 Registry API
journalctl -u docker.service //linux查看Docker daemon日志
docker api 使用
vim /usr/lib/systemd/system/docker.service
在 ExecStart=/usr/bin/dockerd 后面直接添加 -H tcp://0.0.0.0:8088 -H unix:///var/run/docker.sock
systemctl daemon-reload
systemctl restart docker
curl -X GET http://127.0.0.1:8088/images/json //查看鏡像
詳見 https://docs.docker.com/engine/api/
Docker非 root賬號運(yùn)行
groupadd docker //添加docker組,默認(rèn)已有(安裝docker)
gpasswd -a s docker #s表示當(dāng)前使用的用戶
systemctl restart docker //重啟docker
Docker 鏡像管理
Docker基礎(chǔ)鏡像
Docker 提供了兩種方法來創(chuàng)建基礎(chǔ)鏡像撞芍,一種是通過引入tar包的形式,另外一種是通過一個空白的鏡像來一步一步構(gòu)建翩瓜,本文使用的是第二種方法受扳,既FROM scratch, 簡單例子如下
FROM scratch
ADD hello /
CMD ["/hello"]
Docker 的鏡像實際上由一層一層的文件系統(tǒng)組成,這種層級的文件系統(tǒng)就是上文說到的UnionFS兔跌。在Docker鏡像的最底層是bootfs勘高。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的,包含boot加載器和內(nèi)核坟桅。當(dāng)boot加載完成之后整個內(nèi)核就都在內(nèi)存中了华望,此時內(nèi)存的使用權(quán)已由bootfs轉(zhuǎn)交給內(nèi)核,此時系統(tǒng)也會卸載bootfs仅乓。Docker在bootfs之上的一層是rootfs(根文件系統(tǒng))赖舟。rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如Ubuntu夸楣,Centos等等宾抓。
常用基礎(chǔ)鏡像
- scratch :是Docker保留鏡像,不能pull豫喧,名稱不能被其他鏡像使用
- busybox :一個集成了一百多個最常用Linux命令和工具,可以理解為一個超級簡化版嵌入式Linux系統(tǒng)石洗,只有2M左右
- alpine :Alpine操作系統(tǒng)是一個面向安全的輕型Linux發(fā)行版。它不同于通常的Linux發(fā)行版紧显,Alpine采用了musl libc和BusyBox以減小系統(tǒng)的體積和運(yùn)行時資源消耗讲衫,只有5M左右,但功能上比BusyBox又完善得多。
- centos :centos操作系統(tǒng)鏡像約200M左右
- debian/ubuntu:debian系的服務(wù)器操作系統(tǒng)鏡像,約100M左右
構(gòu)建鏡像建議使用alpine鸟妙,此鏡像比busybox稍大焦人,但是比其他的系統(tǒng)鏡像都小,busybox沒有包管理工具重父,這帶來很多不便花椭,早期很多鏡像都是基于ubuntu/debian,現(xiàn)在大部分官網(wǎng)鏡像都改成alpine作為基礎(chǔ)鏡像房午,如果使用Alpine鏡像替換Ubuntu基礎(chǔ)鏡像矿辽,安裝軟件包時需要用apk包管理器替換apt工具,詳見 https://hub.docker.com/search?image_filter=official&type=image&category=base 官網(wǎng)基礎(chǔ)鏡像
Docker鏡像分層(CopyOnWrite)
docker通過一個叫做copy-on-write (CoW) 的策略來保證base鏡像的安全性郭厌,以及更高的性能和空間利用率袋倔。
- 啟動容器的時候,最上層容器層是可寫層折柠,之下的都是鏡像層宾娜,只讀層,保證鏡像的安全
- 當(dāng)容器需要添加文件時候,直接操作最上面容器層扇售,不會影響鏡像層
- 當(dāng)容器需要刪除文件時候前塔,從上往下找文件,在容器層記錄刪除承冰,軟刪除
- 當(dāng)容器需要修改文件時候华弓,從上往下層找文件,復(fù)制到容器層修改
- 當(dāng)容器需要讀取文件的時候困乒,從上往下層找寂屏,讀取并放入內(nèi)存,若已經(jīng)存在內(nèi)存直接使用
詳見 https://docs.docker.com/storage/storagedriver/
減小鏡像大小的方法
1.同層刪除
盡量將中間依賴的安裝與卸載操作放在一個步驟中娜搂,docker鏡像是一個由“層”來堆疊起來的“千層餅”迁霎,dockerfile里面每一條命令都會增加一層,所以我們需要將安裝百宇、使用欧引、卸載三個部分寫在一個步驟中,才能保證空間被釋放
FROM alpine:3.12
RUN truncate -s 50M /sample.dat
RUN rm -rf /sample.dat //刪除和創(chuàng)建不在同一層恳谎,永久保留進(jìn)鏡像層
FROM alpine:3.12
RUN truncate -s 50M /sample.dat && rm -rf /sample.dat // 同層刪除芝此,只有一層
2.多階段編譯(主流)
Docker 17.05版本以后,新引入了multi-stage builds這一概念,簡單來說因痛,multi-stage builds支持我們將Docker鏡像的編譯分成多個“階段”婚苹。比如常見的軟件編譯的情況,我們可以將編譯階段單獨(dú)提出來鸵膏,軟件編譯完成后直接將二進(jìn)制文件拷貝到一個新的基礎(chǔ)鏡像中膊升,這樣做最大的好處就是,第二個鏡像不再包含任何編譯階段使用的中間依賴.
以最常見JAVA項目為例谭企,編譯Jar包的時候廓译,我們需要使用到JDK评肆、Maven等工具,但在實際運(yùn)行階段非区,我們只需要JRE環(huán)境即可,簡單比較一下openjdk:8u275 與 openjdk:8u275-jre,相差一倍多瓜挽。
FROM golang:1.7.3 AS builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]
詳見: https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
3.使用slim版本的鏡像
Docker官方的Debian鏡像有個slim版本,這個版本的大小比默認(rèn)的版本要小一倍多,slim的中文意思就是“苗條的”征绸,顧名思義久橙,debian:stretch-slim確實苗條的多,原因是其刪除了man文檔等許多不會在容器里用到的文件管怠。有一些上層的鏡像會基于slim版本的debian進(jìn)行編寫淆衷,比如python。如果我們開發(fā)python的項目渤弛,可以使用python:slim這個基礎(chǔ)鏡像祝拯。
4.使用Alpine Linux基礎(chǔ)鏡像
Alpine Linux是一個基于BusyBox和Musl Libc的Linux發(fā)行版,其最大的優(yōu)勢就是小她肯。一個純的基礎(chǔ)Alpine Docker鏡像在壓縮后僅有2.67MB鹿驼。
改善鏡像構(gòu)建時間
Docker在構(gòu)建鏡像時,默認(rèn)文件名是Dockerfile, 位于當(dāng)前上下目錄中 docker build -t demo:v1 .,其中 . 指定的是上下文路徑而不是dockerfile文件的路徑辕宏。
什么是上下文
用戶會指定構(gòu)建鏡像上下文的路徑畜晰,docker build 命令得知這個路徑后,會將路徑下的所有內(nèi)容打包瑞筐,然后上傳給 Docker 引擎凄鼻。這樣Docker 引擎收到這個上下文包后,展開就會獲得構(gòu)建鏡像所需的一切文件聚假,因為Docker采用是C/S設(shè)計架構(gòu)块蚌,真正執(zhí)行構(gòu)建是在Server端
假設(shè)在Dockerfile 文件中 COPY ./package.json /app/ 復(fù)制上下文(context)目錄下的 package.json。
因此膘格,COPY 這類指令中的源文件的路徑都是相對路徑峭范。這也是初學(xué)者經(jīng)常會問的為什么 COPY ../package.json /app 或者 COPY /opt/xxxx /app 無法工作的原因,因為這些路徑已經(jīng)超出了上下文的范圍瘪贱,Docker 引擎無法獲得這些位置的文件纱控。如果真的需要那些文件,應(yīng)該將它們復(fù)制到上下文目錄中去
自定義構(gòu)建上下文和dockerfile
docker build -f ../Dockerfile1.php -t demo:v1 ../
# 指定dockerfile文件是當(dāng)前執(zhí)行命令目錄的上級目錄的Dockerfile1.php文件,
# 上下文是當(dāng)前執(zhí)行命令目錄的上級目錄
1.減小構(gòu)建上下文的大小
指定合適的上下文路徑菜秦,上下文路徑中的文件或者文件夾是構(gòu)建鏡像必須的
通過 .gitignore 一樣的語法寫一個 .dockerignore,用于剔除文件傳給Docker引擎
#comment #注釋 可以忽略
*/temp* #例如/somedir/temporary.txt 和目錄 /somedir/temp 被剔除
*/*/temp* #例如/somedir/subdir/temporary.txt 被剔除
temp? #例如/tempa 和 /tempb 目錄被剔除
詳見: https://docs.docker.com/engine/reference/builder/#dockerignore-file
2.采用registry鏡像
可以直接才本地registry鏡像拉取甜害,不需要每次都要docker hub官網(wǎng)拉取
3.復(fù)用鏡像層
設(shè)計鏡像層時要易變動的鏡像層獨(dú)立出來,萬一有變動球昨,重新構(gòu)建時尔店,其它沒有變動的鏡像層復(fù)用(Using cache)
Docker鏡像倉庫
鏡像拉取的過程(執(zhí)行pull)
-
第一步是下載Manifest, Manifest里包含了前面所說的配置文件和層列表
image - 第二部根據(jù)內(nèi)容里的config部分的digest(鏡像配置文件的sha256sum值,即鏡像id)下載鏡像配置文件以及層列表
鏡像配置文件存儲目錄:/var/lib/docker/image/overlay2/imagedb/content/sha256/${imageid}
鏡像層文件存儲目錄: /var/lib/docker/image/overlay2/layerdb/sha256/${diff_ids}
實際鏡像文件存儲目錄: /var/lib/docker/overlay2/...
設(shè)置內(nèi)網(wǎng)鏡像地址
vim /etc/docker/daemon.json //編輯文件
{
"registry-mirrors":["私服倉庫URL"]
}
部署內(nèi)網(wǎng)鏡像倉庫
Docker hub為我們提供了很多官方鏡像和個人上傳的鏡像,我們可以下載機(jī)構(gòu)或個人提供的鏡像(如ubuntu,centos...)嚣州,也可以上傳我們自己的本地鏡像鲫售,然后我們需要的時候也可以隨時下載「秒龋看著很是方便情竹,但是也有不方便的地方
- dockerhub 倉庫在外網(wǎng),帶寬受限
- 公司內(nèi)創(chuàng)建的鏡像不想對外開放,只允許內(nèi)網(wǎng)的開發(fā)人員下載使用
因此在內(nèi)部網(wǎng)絡(luò)搭建docker私有倉庫可以使內(nèi)網(wǎng)人員下載和上傳都非成陈快速,不受外網(wǎng)帶寬等因素的影響佳吞,同時不在內(nèi)網(wǎng)的人員無法下載我們的鏡像.
兩種搭建方式:
- 使用registry,簡易倉庫
docker pull registry
docker run -d -v /home/registry:/var/lib/registry -p 5000:5000 --restart always --privileged true --name myregistry registry:lastest
- 使用開源Harbor安裝, Harbor功能更齊全拱雏,含賬戶權(quán)限管理等功能,適用大規(guī)模docker集群部署提供倉庫服務(wù)(推薦使用)
官網(wǎng): https://goharbor.io/docs/2.1.0
github地址: https://github.com/goharbor/harbor/releases
下載harbor-offline-installer-v2.1.1.tgz
tar xf harbor-offline-installer-v2.1.1.tgz
cd harbor/
#修改harbor.yml配置信息,hostname 值改成機(jī)器ip,harbor_admin_passwrd 值為admin賬號的密碼, 如果不想使用https協(xié)議底扳,直接注釋掉 #https铸抑,#certificate:/your/certificate/path #private_key:/your/private/keypath
sh install.sh
訪問http://ip 直接訪問harbor
使用docker cli 需配置daemon.json 文件配置"insecure-registries":["ip"]
Docker網(wǎng)絡(luò)架構(gòu)
容器運(yùn)行設(shè)置 --network 參數(shù)指定網(wǎng)絡(luò),不指定的話默認(rèn)是bridge
安裝docker默認(rèn)創(chuàng)建三個網(wǎng)絡(luò):
docker network ls //查看存在的網(wǎng)絡(luò)
NETWORK_ID | NAME | DRIVER | SCOPE |
---|---|---|---|
... | bridge | bridge | local |
... | host | host | local |
... | none | null | local |
五種網(wǎng)絡(luò)模式
bridge 模式
啟動容器默認(rèn)的網(wǎng)絡(luò)驅(qū)動模式 --network bridge
容器的網(wǎng)絡(luò)是獨(dú)立,有獨(dú)立的ip和端口衷模,通過-p 做映射, 查看iptables -nvL
使用默認(rèn)的bridge網(wǎng)橋鹊汛,容器之間通信只能使用ip,而不能使用容器名和主機(jī)名通信阱冶,不建議將默認(rèn)bridge網(wǎng)絡(luò)用于生產(chǎn)環(huán)境刁憋,生產(chǎn)環(huán)境中獨(dú)立運(yùn)行的容器應(yīng)使用用戶自定義的網(wǎng)橋(自定義網(wǎng)橋,容器之間通信可以使用ip木蹬、容器名稱及主機(jī)名)
host 模式
容器的網(wǎng)絡(luò)堆棧不會與Docker宿主機(jī)隔離至耻,指定端口參數(shù)-p 或者 -P 不起作用,相當(dāng)于在宿主機(jī)啟動一個程序镊叁,占用宿主機(jī)的端口尘颓,即容器的端口就是宿主機(jī)的端口,容器沒有自己的獨(dú)立ip, 該網(wǎng)絡(luò)模式只支持linux系統(tǒng)的主機(jī)
overlay 模式
overlay網(wǎng)絡(luò)驅(qū)動程序會在多個docker守護(hù)程序(即多個主機(jī)上的docker守護(hù)程序)之間創(chuàng)建分布式網(wǎng)絡(luò),初始化swarm或?qū)ocker主機(jī)加入現(xiàn)有swarm時晦譬,會在該Docker主機(jī)上創(chuàng)建兩個新網(wǎng)絡(luò):
- 名稱為ingress的overlay網(wǎng)絡(luò)
- 名為docker_gwbridge的橋接網(wǎng)絡(luò)
macvlan
none 模式
--network none 完全禁用容器上的網(wǎng)絡(luò)堆棧,容器內(nèi)僅創(chuàng)建一個環(huán)回設(shè)備lo,沒有eth網(wǎng)絡(luò)
docker run --network none --name demo alpine:latest ash
docker exec demo ip route #查看容器路由表
自建網(wǎng)絡(luò)
管理自定義網(wǎng)絡(luò)
docker network create -d bridge my-net //創(chuàng)建網(wǎng)絡(luò)my-net疤苹,-d 指定網(wǎng)絡(luò)驅(qū)動模式,默認(rèn)是bridge
docker network rm my-net //刪除網(wǎng)絡(luò)
docker network connect my-net demo //容器demo 連接my-net網(wǎng)絡(luò)
docker network disconnect my-net demo //容器demo 斷開my-net網(wǎng)絡(luò)
生產(chǎn)環(huán)境應(yīng)該使用自定義網(wǎng)絡(luò)敛腌,不要使用默認(rèn)的網(wǎng)絡(luò)卧土,更安全更清晰
Docker資源限制
docker 作為容器的管理者,自然提供了控制容器資源的功能像樊。正如使用內(nèi)核的 namespace 來做容器之間的隔離夸溶,docker 也是通過內(nèi)核的 cgroups 來做容器的資源限制;包括CPU凶硅、內(nèi)存缝裁、磁盤三大方面,基本覆蓋了常見的資源配額和使用量控制
詳見: https://docs.docker.com/config/containers/resource_constraints/
內(nèi)存限制相關(guān)參數(shù)
執(zhí)行docker run命令時能使用的和內(nèi)存限制相關(guān)的所有選項如下。
參數(shù) | 描述 |
---|---|
-m,--memory | 內(nèi)存限制捷绑,格式是數(shù)字加單位韩脑,單位可以為 b,k,m,g。最小為 4M |
--memory-swap | 內(nèi)存+交換分區(qū)大小總限制粹污。格式同上段多。必須必-m設(shè)置的大 |
--memory-reservation | 內(nèi)存的軟性限制。格式同上 |
--oom-kill-disable | 是否阻止 OOM killer 殺死容器壮吩,默認(rèn)沒設(shè)置 |
--oom-score-adj | 容器被 OOM killer 殺死的優(yōu)先級进苍,范圍是[-1000, 1000],默認(rèn)為 0 |
--memory-swappiness | 用于設(shè)置容器的虛擬內(nèi)存控制行為鸭叙。值為 0~100 之間的整數(shù) |
--kernel-memory | 核心內(nèi)存限制觉啊。格式同上,最小為 4M |
java項目開發(fā),一般通過設(shè)置jvm參數(shù)來控制
ENV JAVA_OPTS '-Xms512M -Xmx512M'
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app.jar
docker run --rm -e JAVA_OPTS='-Xms1g -Xmx1g' tomcat
CPU限制
對容器最多能使用的 CPU 時間有兩種限制方式:一是有多個 CPU 密集型的容器競爭 CPU 時,設(shè)置各個容器能使用的 CPU 時間相對比例。二是以絕對的方式設(shè)置容器在每個調(diào)度周期內(nèi)最多能使用的 CPU 時間秉撇。
參數(shù) | 描述 |
---|---|
--cpuset-cpus="" | 允許使用的 CPU 集墓贿,值可以為 0-3,0,1 |
-c,--cpu-shares=0 | CPU 共享權(quán)值(相對權(quán)重) |
--cpu-period=0 | 限制 CPU CFS 的周期,范圍從 100ms~1s,即[1000, 1000000] |
--cpu-quota=0 | 限制 CPU CFS 配額,必須不小于1ms,即 >= 1000 |
--cpuset-mems="" | 允許在上執(zhí)行的內(nèi)存節(jié)點(MEMs)罩引,只對 NUMA 系統(tǒng)有效 |
CPU 資源的相對限制
我們可以設(shè)置容器可以在哪些 CPU 核上運(yùn)行。
例如:
$ docker run -it --cpuset-cpus="1,3" ubuntu:14.04 /bin/bash
表示容器中的進(jìn)程可以在 cpu 1 和 cpu 3 上執(zhí)行枝笨。
默認(rèn)情況下蜒程,所有的容器得到同等比例的 CPU 周期。在有多個容器競爭 CPU (競爭同一個cpu)時我們可以設(shè)置每個容器能使用的 CPU 時間比例伺帘。這個比例叫作共享權(quán)值昭躺,通過 -c或 --cpu-shares 設(shè)置。Docker 默認(rèn)每個容器的權(quán)值為 1024伪嫁。不設(shè)置或?qū)⑵湓O(shè)置為 0领炫,都將使用這個默認(rèn)值。系統(tǒng)會根據(jù)每個容器的共享權(quán)值和所有容器共享權(quán)值和比例來給容器分配 CPU 時間张咳。
CPU 資源的絕對限制
Linux 通過 CFS(Completely Fair Scheduler帝洪,完全公平調(diào)度器)來調(diào)度各個進(jìn)程對 CPU 的使用。CFS 默認(rèn)的調(diào)度周期是 100ms脚猾。我們可以設(shè)置每個容器進(jìn)程的調(diào)度周期葱峡,以及在這個周期內(nèi)各個容器最多能使用多少 CPU 時間。使用--cpu-period即可設(shè)置調(diào)度周期龙助,使用--cpu-quota即可設(shè)置在每個周期內(nèi)容器能使用的 CPU 時間砰奕。兩者一般配合使用。
例如:
$ docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:16.04 /bin/bash
將 CFS 調(diào)度的周期設(shè)為 50000,將容器在每個周期內(nèi)的 CPU 配額設(shè)置為 25000军援,表示該容器每 50ms 可以得到 50% 的 CPU 運(yùn)行時間仅淑。CFS 周期的有效范圍是 1ms~1s,對應(yīng)的--cpu-period的數(shù)值范圍是 1000 ~ 1000000胸哥。而容器的 CPU 配額必須不小于 1ms涯竟,即--cpu-quota的值必須 >= 1000】昭幔可以看出這兩個選項的單位都是 us庐船。
磁盤IO配額控制
相對于CPU和內(nèi)存的配額控制,docker對磁盤IO的控制相對不成熟嘲更,大多數(shù)都必須在有宿主機(jī)設(shè)備的情況下使用筐钟。主要包括以下參數(shù):
- –device-read-bps:限制此設(shè)備上的讀速度(bytes per second),單位可以是kb哮内、mb或者gb盗棵。
- –device-read-iops:通過每秒讀IO次數(shù)來限制指定設(shè)備的讀速度壮韭。
- –device-write-bps :限制此設(shè)備上的寫速度(bytes per second)北发,單位可以是kb、mb或者gb喷屋。
- –device-write-iops:通過每秒寫IO次數(shù)來限制指定設(shè)備的寫速度琳拨。
- –blkio-weight:容器默認(rèn)磁盤IO的加權(quán)值,有效值范圍為10-100屯曹。
- –blkio-weight-device: 針對特定設(shè)備的IO加權(quán)控制狱庇。其格式為DEVICE_NAME:WEIGHT
Docker故障排查
nsenter 工具(外部探測)
nsenter命令僅進(jìn)入該容器的網(wǎng)絡(luò)命名空間,使用宿主機(jī)的命令調(diào)試容器網(wǎng)絡(luò)
例如:
docker inspect -f {{.State.Pid}} containid #獲取容器的pid
nsenter -n -t pid #進(jìn)入容器的網(wǎng)絡(luò)命名空間
原理
namespace是Linux中一些進(jìn)程的屬性的作用域恶耽,使用命名空間密任,可以隔離不同的進(jìn)程。Linux在不斷的添加命名空間偷俭,目前有:
- mount:掛載命名空間浪讳,使進(jìn)程有一個獨(dú)立的掛載文件系統(tǒng),始于Linux 2.4.19
- ipc:ipc命名空間涌萤,使進(jìn)程有一個獨(dú)立的ipc淹遵,包括消息隊列,共享內(nèi)存和信號量负溪,始于Linux 2.6.19
- uts:uts命名空間透揣,使進(jìn)程有一個獨(dú)立的hostname和domainname,始于Linux 2.6.19
- net:network命令空間川抡,使進(jìn)程有一個獨(dú)立的網(wǎng)絡(luò)棧辐真,始于Linux 2.6.24
- pid:pid命名空間,使進(jìn)程有一個獨(dú)立的pid空間,始于Linux 2.6.24
- user:user命名空間拆祈,是進(jìn)程有一個獨(dú)立的user空間恨闪,始于Linux 2.6.23,結(jié)束于Linux 3.8
- cgroup:cgroup命名空間放坏,使進(jìn)程有一個獨(dú)立的cgroup控制組咙咽,始于Linux 4.6
Linux的每個進(jìn)程都具有命名空間,可以在/proc/PID/ns目錄中看到命名空間的文件描述符淤年。
使用
nsenter [options] [program [arguments]]
options:
-t, --target pid:指定被進(jìn)入命名空間的目標(biāo)進(jìn)程的pid
-m, --mount[=file]:進(jìn)入mount命令空間钧敞。如果指定了file,則進(jìn)入file的命令空間
-u, --uts[=file]:進(jìn)入uts命令空間麸粮。如果指定了file溉苛,則進(jìn)入file的命令空間
-i, --ipc[=file]:進(jìn)入ipc命令空間。如果指定了file弄诲,則進(jìn)入file的命令空間
-n, --net[=file]:進(jìn)入net命令空間愚战。如果指定了file,則進(jìn)入file的命令空間
-p, --pid[=file]:進(jìn)入pid命令空間齐遵。如果指定了file寂玲,則進(jìn)入file的命令空間
-U, --user[=file]:進(jìn)入user命令空間。如果指定了file梗摇,則進(jìn)入file的命令空間
-G, --setgid gid:設(shè)置運(yùn)行程序的gid
-S, --setuid uid:設(shè)置運(yùn)行程序的uid
-r, --root[=directory]:設(shè)置根目錄
-w, --wd[=directory]:設(shè)置工作目錄
Docker容器日志管理
docker logs CONTAINER 顯示當(dāng)前運(yùn)行的容器的日志信息拓哟, UNIX 和 Linux 的命令有三種 輸入輸出,分別是 STDIN(標(biāo)準(zhǔn)輸入)伶授、STDOUT(標(biāo)準(zhǔn)輸出)断序、STDERR(標(biāo)準(zhǔn)錯誤輸出),docker logs 顯示的內(nèi)容包含 STOUT 和 STDERR糜烹。在生產(chǎn)環(huán)境违诗,如果我們的應(yīng)用輸出到我們的日志文件里,所以我們在使用 docker logs 一般收集不到太多重要的日志信息疮蹦。
日志驅(qū)動全局配置
修改日志驅(qū)動诸迟,在配置文件 /etc/docker/daemon.json(注意該文件內(nèi)容是 JSON 格式的)進(jìn)行配置即可。
示例:
{
"log-driver": "json-file"
}
單一容器日志驅(qū)動配置
docker run -itd --log-driver none alpine ash # 這里指定的日志驅(qū)動為 none
使用 Docker-CE 版本挚币,docker logs命令 僅僅適用于以下三種驅(qū)動程序
local
默認(rèn)情況下亮蒋,local 日志驅(qū)動為每個容器保留 100MB 的日志信息,并啟用自動壓縮來保存妆毕。(經(jīng)過測試慎玖,保留100MB 的日志是指沒有經(jīng)過壓縮的日志) local 日志驅(qū)動的儲存位置 /var/lib/docker/containers/容器id/local-logs/ 以 container.log 命名,那么當(dāng)超過了 100MB 的日志文件笛粘,日志文件會繼續(xù)寫入到 container.log趁怔,但是會將 container.log 日志中老的日志刪除湿硝,追加新的
local 驅(qū)動支持的選項
選項 | 描述 | 示例值 |
---|---|---|
max-size | 切割之前日志的最大大小∪笈可取值為(k,m,g)关斜, 默認(rèn)為20m。 | --log-opt max-size=10m |
max-file | 可以存在的最大日志文件數(shù)铺浇。如果超過最大值痢畜,則會刪除最舊的文件。僅在max-size設(shè)置時有效鳍侣。默認(rèn)為5丁稀。 | --log-opt max-file=3 |
compress | 對應(yīng)切割日志文件是否啟用壓縮。默認(rèn)情況下啟用倚聚。 | --log-opt compress=false |
全局日志驅(qū)動設(shè)置為—local
在配置文件 /etc/docker/daemon.json(注意該文件內(nèi)容是 JSON 格式的)進(jìn)行配置即可线衫。
{
"log-driver": "local",
"log-opts": {
"max-size": "10m"
}
}
json-file
日志格式為JSON。Docker的默認(rèn)日志記錄驅(qū)動程序
json-file 日志驅(qū)動日志中不僅包含著 輸出日志惑折,還有時間戳和輸出格式授账,json-file 日志的路徑位于 /var/lib/docker/containers/container_id/container_id-json.log
json-file 的 日志驅(qū)動支持以下選項:
選項 | 描述 | 示例值 | |
---|---|---|---|
max-size | 切割之前日志的最大大小〔沂唬可取值單位為(k,m,g)白热, 默認(rèn)為-1(表示無限制)。 | --log-opt max-size=10m | |
max-file | 可以存在的最大日志文件數(shù)敞咧。如果切割日志會創(chuàng)建超過閾值的文件數(shù)棘捣,則會刪除最舊的文件辜腺。僅在max-size設(shè)置時有效休建。正整數(shù)。默認(rèn)為1评疗。 | --log-opt max-file=3 | |
labels | 適用于啟動Docker守護(hù)程序時测砂。此守護(hù)程序接受的以逗號分隔的與日志記錄相關(guān)的標(biāo)簽列表。 | --log-opt labels=production_status,geo | |
env | 適用于啟動Docker守護(hù)程序時百匆。此守護(hù)程序接受的以逗號分隔的與日志記錄相關(guān)的環(huán)境變量列表砌些。 | --log-opt env=os,customer | |
env-regex | 類似于并兼容env。用于匹配與日志記錄相關(guān)的環(huán)境變量的正則表達(dá)式加匈。 | --log-opt env-regex=^(os | customer). |
compress | 切割的日志是否進(jìn)行壓縮存璃。默認(rèn)是disabled。 | --log-opt compress=true |
**如果沒有設(shè)置max-size雕拼,則日志不受限纵东,但不能超過容器最大10G(默認(rèn)值)限制 **
journald
將日志消息寫入journald。該journald守護(hù)程序必須在主機(jī)上運(yùn)行啥寇,可以使用 journal API 或者使用 docker logs 來查日志偎球。
除了日志本身以外洒扎, journald 日志驅(qū)動還會在日志加上下面的數(shù)據(jù)與消息一起儲存。
CONTAINER_ID 容器ID,為 12個字符
CONTAINER_ID_FULL 完整的容器ID衰絮,為64個字符
CONTAINER_NAME 啟動時容器的名稱袍冷,如果容器后面更改了名稱,日志中的名稱不會更改猫牡。
CONTAINER_TAG, SYSLOG_IDENTIFIER 容器的tag.
CONTAINER_PARTIAL_MESSAGE 當(dāng)日志比較長的時候使用標(biāo)記來表示(顯示日志的大小)
支持日志驅(qū)動選項
選項 | 是否必須 | 描述 |
---|---|---|
tag | 可選的 | 指定要在日志中設(shè)置CONTAINER_TAG和SYSLOG_IDENTIFIER值的模板胡诗。 |
labels | 可選的 | 以逗號分隔的標(biāo)簽列表,如果為容器指定了這些標(biāo)簽淌友,則應(yīng)包含在消息中乃戈。 |
env | 可選的 | 如果為容器指定了這些變量,則以逗號分隔的環(huán)境變量鍵列表(應(yīng)包含在消息中)亩进。 |
env-regex | 可選的 | 與env類似并兼容症虑。用于匹配與日志記錄相關(guān)的環(huán)境變量的正則表達(dá)式 。 |
查看日志 journalctl
# 只查詢指定容器的相關(guān)消息
journalctl CONTAINER_NAME=webserver
# -b 指定從上次啟動以來的所有消息
journalctl -b CONTAINER_NAME=webserver
# -o 指定日志消息格式归薛,-o json 表示以json 格式返回日志消息
journalctl -o json CONTAINER_NAME=webserver
# -f 一直捕獲日志輸出
journalctl -f CONTAINER_NAME=webserver