Docker入門與實踐(二)

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
image
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鏡像的安全性郭厌,以及更高的性能和空間利用率袋倔。

image
  • 啟動容器的時候,最上層容器層是可寫層折柠,之下的都是鏡像層宾娜,只讀層,保證鏡像的安全
  • 當(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)

  1. 第一步是下載Manifest, Manifest里包含了前面所說的配置文件和層列表


    image
  2. 第二部根據(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谍憔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子主籍,更是在濱河造成了極大的恐慌习贫,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千元,死亡現(xiàn)場離奇詭異苫昌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)幸海,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門祟身,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人物独,你說我怎么就攤上這事袜硫。” “怎么了挡篓?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵婉陷,是天一觀的道長。 經(jīng)常有香客問我官研,道長秽澳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任戏羽,我火速辦了婚禮担神,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛛壳。我一直安慰自己杏瞻,他們只是感情好所刀,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捞挥,像睡著了一般浮创。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砌函,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天斩披,我揣著相機(jī)與錄音,去河邊找鬼讹俊。 笑死垦沉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仍劈。 我是一名探鬼主播厕倍,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贩疙!你這毒婦竟也來了讹弯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤这溅,失蹤者是張志新(化名)和其女友劉穎组民,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悲靴,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡臭胜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了癞尚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耸三。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖否纬,靈堂內(nèi)的尸體忽然破棺而出吕晌,到底是詐尸還是另有隱情蛋褥,我是刑警寧澤临燃,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站烙心,受9級特大地震影響膜廊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淫茵,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一爪瓜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匙瘪,春花似錦铆铆、人聲如沸蝶缀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翁都。三九已至,卻和暖如春谅猾,著一層夾襖步出監(jiān)牢的瞬間柄慰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工税娜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留坐搔,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓敬矩,卻偏偏與公主長得像概行,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子弧岳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 第一章 Docker簡介 學(xué)習(xí)docker需要一些前置知識占锯,至少是linux和git。 1.1 是什么 1.1.1...
    wfaceboss閱讀 943評論 0 1
  • 01【熟悉】docker簡介 1缩筛,什么是docker Docker是一個開源項目消略,誕生于2013年初,最初是d...
    北辰_6666閱讀 335評論 0 0
  • Docker概念 Docker 是世界領(lǐng)先的軟件容器平臺瞎抛。開發(fā)人員利用 Docker 可以消除協(xié)作編碼時“在我的機(jī)...
    三也視界閱讀 977評論 0 2
  • Introduction This is a book notes on docker 從入門到實踐[https:...
    Amos_f718閱讀 716評論 0 0
  • part 1: 目標(biāo)與快速入門 歡迎!我們很高興你對學(xué)習(xí)Docker那么感興趣艺演。這篇快速入門教程包括如下內(nèi)容: 配...
    懶癌正患者閱讀 1,286評論 0 19