docker 架構

docker 是C/S架構的軟體,無論是client端還是Server端都是由
docker
一個程式提供,這個程式有很多子程式。
docker daemon 就是其中一個子程式,當運作
docker daemon
時,主機就運作成一個守護程序伺服器,它可以監聽在某個套接字上。為了安全,預設隻提供 Unix sock 檔案的套接字。
docker支援三種類型套接字:
- ipv4 套接字
- ipv6 套接字
-
Unix sock 套接字
docker_hosts 是真正運作容器的主機,container:容器,images:鏡像。
- client -> docker_host 預設使用 https 協定;
- docker_host -> registry 預設使用 https 協定。
安裝 docker
docker官方提供了2個版本,一個是 docker 企業版docker-ee,另一個則是社群版 docker-ce,通常安裝docker 都是指 docker-ce。
Docker 引擎具有下面 3 個更新管道: stable, test 和 nightly:
- Stable 管道提供給你最新可用的穩定版本。
- Test 管道提供了在釋出之前的預覽,被用于 general availability (GA) 之前的測試。
- Nightly 管道在針對下一個主要發行版本的每天晚間自動建構包。
穩定版
年-月(Year-month) 的分支将會釋出到 master 分支中。這個分支将會使用下面的格式 . 來建立,例如 19.03。
年-月的命名由 GA 版本的最早确定的月曆資料來進行确定。所有随後的特性更新檔将會通過在版本号的序列來進行釋出。例如,一旦 v19.03.0 版本釋出後,所有的後續釋出的版本将會在基于
19.03
這個分支下來釋出。
測試版
在計劃進行新的 year-month 的釋出之前,一個分支将會從 master 分支進行建立,并被命名為 YY.mm。這個表明的是基于 Docker 裡程碑的開放已經完成了。
一個預釋出的測試版本的釋出版本進行釋出。釋出的更新檔和相關預釋出的釋出内容将會釋出到釋出的分支中。
晚間建構
晚間建構将會給個你一個基于下一個主要釋出版本的最新建構,這個最新的建構有最新的特性和版本的修複。
0.0.0-YYYYmmddHHMMSS-abcdefabcdef
版本送出的 UTC 時間戳将會添加到釋出版本的名稱中,同時還會添加一個送出版本的哈希代碼。如下:0.0.0-20180720214833-f61e0f7。
這個建構将會允許你使用最新的 master 分支來進行測試和建構。我們不能保證所有晚間建構能夠正常的工作并且符合所有的安全性要求。
本次安裝全部基于 centos 7 版本進行安裝。
安裝docker 有三種方式:
- yum 安裝
- rpm 軟體安裝
- 二進制安裝
系統環境:
#uname -a
Linux localhost.localdomain 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
#cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
yum 方式安裝
curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y
RPM 方式安裝
類似于 yum 的方式,将所有 rpm 包打包在一起,通過 rpm -ivh *.rpm 進行安裝。
tar xf docker-ce-18.06.tar.gz
cd docker-ce-18.06
rpm -ivh *.rpm 或者 yum localinstall *.rpm -y
#wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.8.tgz
#tar xf docker-20.10.8.tgz
#cp -a docker/* /usr/bin/
--- 建立 啟動服務 ---
#cat << 'EOF' > /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
--- 啟動服務 ---
# systemctl enable docker; systemctl start docker
鏡像加速
國内從 Docker Hub 拉取鏡像有時會遇到困難,此時可以配置鏡像加速器。
#cat << EOF > /etc/docker/daemon.json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
EOF
#systemctl restart docker
使用鏡像
[root@localhost(192.168.1.13) ~]#docker pull nginx:alpine
alpine: Pulling from library/nginx
97518928ae5f: Downloading
a4e156412037: Download complete
e0bae2ade5ec: Download complete
3f3577460f48: Download complete
e362c27513c3: Download complete
a2402c2da473: Download complete
alpine: Pulling from library/nginx
97518928ae5f: Pull complete
a4e156412037: Pull complete
e0bae2ade5ec: Pull complete
3f3577460f48: Pull complete
e362c27513c3: Pull complete
a2402c2da473: Pull complete
Digest: sha256:12aa12ec4a8ca049537dd486044b966b0ba6cd8890c4c900ccb5e7e630e03df0
Status: Downloaded newer image for nginx:alpine
docker.io/library/nginx:alpine
從下載下傳過程中可以看到我們之前提及的分層存儲的概念,鏡像是由多層存儲所構成。下載下傳也是一層層的去下載下傳,并非單一檔案。下載下傳過程中給出了每一層的 ID 的前 12 位。并且下載下傳結束後,給出該鏡像完整的
sha256
的摘要,以確定下載下傳一緻性。
docker指令的使用
docker 是基于C/S 架構的程式,這裡所說的 docker 是指用戶端程式。
docker 是 nat 橋接模式。 一個容器隻是為了運作一個程式,在容器中的程式不能跑在背景,否則一啟動容器就終止了,因為docker 容器僅在它的程序(pid 為 1)時運作,會保持運作狀态。如果 1 号程序退出了,docker 容器也就退出了。
安裝完 docker 以後執行
docker run -it --rm -p 4000:80 ccr.ccs.tencentyun.com/dockerpracticesig/docker_practice
通過浏覽器通路 http://ip:4000/ 離線學習 《docker - 從入門到實踐》
docker 配置
docker 安裝後,預設是沒有 daemon.json 這個配置檔案,需要進行手動建立。配置檔案的預設路徑:
/etc/docker/daemon.json
一般情況,配置檔案 daemon.json中配置的項目參數,在啟動參數中同樣适用,有些可能不一樣(具體可以檢視官方文檔),但需要注意的一點,配置檔案中如果已經有某個配置項,則無法在啟動參數中增加,會出現沖突的錯誤。
如果在daemon.json檔案中進行配置,需要docker版本高于1.12.6(在這個版本上不生效,1.13.1以上是生效的)
daemon.json 詳細配置參數如下:
{
"authorization-plugins": [],//通路授權插件
"data-root": "",//docker資料持久化存儲的根目錄
"dns": [],//DNS伺服器
"dns-opts": [],//DNS配置選項,如端口等
"dns-search": [],//DNS搜尋域名
"exec-opts": [],//執行選項
"exec-root": "",//執行狀态的檔案的根目錄
"experimental": false,//是否開啟試驗性特性
"storage-driver": "",//存儲驅動器
"storage-opts": [],//存儲選項
"labels": [],//鍵值對式标記docker中繼資料
"live-restore": true,//dockerd挂掉是否保活容器(避免了docker服務異常而造成容器退出)
"log-driver": "",//容器日志的驅動器
"log-opts": {},//容器日志的選項
"mtu": 0,//設定容器網絡MTU(最大傳輸單元)
"pidfile": "",//daemon PID檔案的位置
"cluster-store": "",//叢集存儲系統的URL
"cluster-store-opts": {},//配置叢集存儲
"cluster-advertise": "",//對外的位址名稱
"max-concurrent-downloads": 3,//設定每個pull程序的最大并發
"max-concurrent-uploads": 5,//設定每個push程序的最大并發
"default-shm-size": "64M",//設定預設共享記憶體的大小
"shutdown-timeout": 15,//設定關閉的逾時時限(who?)
"debug": true,//開啟調試模式
"hosts": [],//監聽位址(?)
"log-level": "",//日志級别
"tls": true,//開啟傳輸層安全協定TLS
"tlsverify": true,//開啟輸層安全協定并驗證遠端位址
"tlscacert": "",//CA簽名檔案路徑
"tlscert": "",//TLS證書檔案路徑
"tlskey": "",//TLS密鑰檔案路徑
"swarm-default-advertise-addr": "",//swarm對外位址
"api-cors-header": "",//設定CORS(跨域資源共享-Cross-origin resource sharing)頭
"selinux-enabled": false,//開啟selinux(使用者、程序、應用、檔案的強制通路控制)
"userns-remap": "",//給使用者命名空間設定 使用者/組
"group": "",//docker所在組
"cgroup-parent": "",//設定所有容器的cgroup的父類(?)
"default-ulimits": {},//設定所有容器的ulimit
"init": false,//容器執行初始化,來轉發信号或控制(reap)程序
"init-path": "/usr/libexec/docker-init",//docker-init檔案的路徑
"ipv6": false,//開啟IPV6網絡
"iptables": false,//開啟防火牆規則
"ip-forward": false,//開啟net.ipv4.ip_forward
"ip-masq": false,//開啟ip掩蔽(IP封包通過路由器或防火牆時重寫源IP位址或目的IP位址的技術)
"userland-proxy": false,//使用者空間代理
"userland-proxy-path": "/usr/libexec/docker-proxy",//使用者空間代理路徑
"ip": "0.0.0.0",//預設IP
"bridge": "",//将容器依附(attach)到橋接網絡上的橋辨別
"bip": "",//指定橋接ip
"fixed-cidr": "",//(ipv4)子網劃分,即限制ip位址配置設定範圍,用以控制容器所屬網段實作容器間(同一主機或不同主機間)的網絡通路
"fixed-cidr-v6": "",//(ipv6)子網劃分
"default-gateway": "",//預設網關
"default-gateway-v6": "",//預設ipv6網關
"icc": false,//容器間通信
"raw-logs": false,//原始日志(無顔色、全時間戳)
"allow-nondistributable-artifacts": [],//不對外分發的産品送出的registry倉庫
"registry-mirrors": [],//registry倉庫鏡像
"seccomp-profile": "",//seccomp配置檔案
"insecure-registries": [],//非https的registry位址
"no-new-privileges": false,//禁止新優先級(??)
"default-runtime": "runc",//OCI聯盟(The Open Container Initiative)預設運作時環境
"oom-score-adjust": -500,//記憶體溢出被殺死的優先級(-1000~1000)
"node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"],//對外公布的資源節點
"runtimes": {//運作時
"cc-runtime": {
"path": "/usr/bin/cc-runtime"
},
"custom": {
"path": "/usr/local/bin/my-runc-replacement",
"runtimeArgs": [
"--debug"
]
}
}
}
常用 daemon.json 檔案配置如下:
cat > /etc/docker/daemon.json << EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"exec-opts": ["native.cgroupdriver=systemd"],
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"registry-mirrors": ["https://7uuu3esz.mirror.aliyuncs.com"],
"data-root": "/data/docker"
}
EOF