聲明:此文章為博主個(gè)人學(xué)習(xí)記錄,僅供學(xué)習(xí)和交流,如有侵權(quán)請(qǐng)聯(lián)系博主。
Docker
基于Linux 內(nèi)核的Cgroup,Namespace,以及Union FS等技術(shù),對(duì)進(jìn)程進(jìn)行封裝隔離,屬于操作系統(tǒng)層面的虛擬化技術(shù),由于隔離的進(jìn)程獨(dú)立于宿主和其它的隔離的進(jìn)程,因此也稱其為容器。
最初實(shí)現(xiàn)是基于LXC,從0.7 以后開始去除LXC,轉(zhuǎn)而使用自行開發(fā)的Libcontainer,從1.11開始,則進(jìn)一步演進(jìn)為使用runC和Containerd。
Docker 在容器的基礎(chǔ)上,進(jìn)行了進(jìn)一步的封裝,從文件系統(tǒng)、網(wǎng)絡(luò)互聯(lián)到進(jìn)程隔離等等,極大的簡(jiǎn)化了容器的創(chuàng)建和維護(hù),使得Docker 技術(shù)比虛擬機(jī)技術(shù)更為輕便、快捷。
安裝docker
基于ubuntu
基于Centos7
基于ubuntu
更新apt包索引并安裝允許apt使用HTTPS倉(cāng)庫(kù)的軟件包
$ sudo apt-get update
$ sudo apt-get install \\
ca-certificates \\
curl \\
gnupg \\
lsb-release
添加Docker的官方GPG密鑰
$ sudo mkdir -m 0755 -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
寫入阿里云鏡像源地址
$ sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
更新apt包索引
sudo apt-get update
安裝Docker Engine、containerd和Docker Compose
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
基于Centos7
安裝最新內(nèi)核版本
#查看系統(tǒng)版本
cat /etc/redhat-release
#查看當(dāng)前系統(tǒng)的內(nèi)核:
uname -sr
#在 CentOS 7.x 上啟用 ELRepo 倉(cāng)庫(kù):
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
#查看可用的系統(tǒng)內(nèi)核相關(guān)包:
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
#安裝最新主線內(nèi)核版本:
yum -y --enablerepo=elrepo-kernel install kernel-ml
#設(shè)置默認(rèn)內(nèi)核版本
vi /etc/default/grub
修改GRUB_DEFAULT=0
#重新創(chuàng)建內(nèi)核配置
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
docker環(huán)境和組件安裝
#卸載舊版本docker
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
#gcc
yum -y install gcc
yum -y install gcc-c++
#安裝yum工具包
yum -y install yum-utils
#設(shè)置阿里云的stable 鏡像倉(cāng)庫(kù)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新 yum 軟件包索引
yum makecache fast
#安裝指定版本的 Docker(v20.10.8):
yum -y install docker-ce-3:20.10.8-3.el7.x86_64 docker-ce-cli-1:20.10.8-3.el7.x86_64 containerd.io
systemctl start docker
systemctl enable docker
#查看docker狀態(tài):
systemctl status docker
docker version
#鏡像加速
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://du3ia00u.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://registry.docker-cn.com"
],
"live-restore": true,
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"},
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"storage-driver": "overlay2"
}
EOF
#使之生效
systemctl daemon-reload
#重啟docker
systemctl restart docker
容器操作
常見命令
docker pull image:tag
docker run 啟動(dòng)并創(chuàng)建容器
--name 容器名
--rm 退出自動(dòng)刪除
-it 交互
-d 后臺(tái)
-p 端口映射
-v 磁盤掛載
docker start container 啟動(dòng)容器
docker stop container 停止
docker ps -a 查看全部容器
docker exec -it image /bin/bash 進(jìn)入容器
docker inspect image 查看容器信息
docker cp local:docker 拷貝文件到容器
docker images 查看鏡像
Dockerfile
基本結(jié)構(gòu)
FROM:指定基礎(chǔ)鏡像。
RUN:在鏡像中運(yùn)行命令。
CMD:指定容器啟動(dòng)時(shí)要運(yùn)行的命令。
LABEL:為鏡像添加元數(shù)據(jù)。
EXPOSE:指定容器要暴露的端口。
ENV:設(shè)置環(huán)境變量。
ADD:將文件從構(gòu)建上下文或 URL 復(fù)制到鏡像中。
COPY:將文件從構(gòu)建上下文復(fù)制到鏡像中。
ENTRYPOINT:指定容器啟動(dòng)時(shí)要運(yùn)行的命令,可以與 CMD 配合使用。
VOLUME:創(chuàng)建掛載點(diǎn),用于掛載外部卷。
USER:指定運(yùn)行容器時(shí)要使用的用戶。
WORKDIR:設(shè)置工作目錄。
最佳實(shí)踐
不要安裝無效軟件包。
應(yīng)簡(jiǎn)化鏡像中同時(shí)運(yùn)行的進(jìn)程數(shù),理想狀況下,每個(gè)鏡像應(yīng)該只有一個(gè)進(jìn)程,當(dāng)無法避免同一鏡像運(yùn)行多進(jìn)程時(shí),應(yīng)選擇合理的初始化進(jìn)程(initprocess)。
最小化層級(jí)數(shù)。
最新的docker只有RUN,COPY,ADD創(chuàng)建新層,其他指令創(chuàng)建臨時(shí)層,不會(huì)增加鏡像大小,比如EXPOSE指令就不會(huì)生成新層。
多條RUN命令可通過連接符連接成一條指令集以減少層數(shù)。
通過多段構(gòu)建減少鏡像層數(shù)。
把多行參數(shù)按字母排序,可以減少可能出現(xiàn)的重復(fù)參數(shù),并且提高可讀性。
編寫dockerfile的時(shí)候,應(yīng)該把變更頻率低的編譯指令優(yōu)先構(gòu)建以便放在鏡像底層以有效利用buildcache。
復(fù)制文件時(shí),每個(gè)文件應(yīng)獨(dú)立復(fù)制,這確保某個(gè)文件變更時(shí),只影響改文件對(duì)應(yīng)的緩存。
Makefile文件
以go項(xiàng)目為示例
# 設(shè)置項(xiàng)目根目錄
ROOT := $(shell pwd)
# 設(shè)置編譯生成的可執(zhí)行文件名
BINARY := myapp
# 設(shè)置編譯選項(xiàng)
GOFLAGS := -ldflags="-s -w"
# 設(shè)置遠(yuǎn)程倉(cāng)庫(kù)地址
REPO := myrepo/myapp
# 設(shè)置版本號(hào)
VERSION := 1.0.0
# 默認(rèn)目標(biāo)
all: build
# 編譯目標(biāo)
build:
go build $(GOFLAGS) -o $(BINARY) main.go
# 發(fā)布目標(biāo)
release: build
tar czf $(BINARY)-$(VERSION).tar.gz $(BINARY)
# 推送目標(biāo)
push: release
scp $(BINARY)-$(VERSION).tar.gz $(REPO)
# 清理目標(biāo)
clean:
rm -f $(BINARY)
rm -f $(BINARY)-*.tar.gz
.PHONY: all build release push clean
擴(kuò)展
build構(gòu)建本地鏡像并上傳到dockerhub
需要注冊(cè)docker 賬號(hào)
構(gòu)建鏡像 -o 指定鏡像名
docker build -t imagename .
查看鏡像
docker images
登錄 輸入賬號(hào)密碼
docker login
打包
docker tag tagname your_dockerhub_name/imagename
push到dockerhub倉(cāng)庫(kù)
docker push your_dockerhub_name/imagename
通用鏡像
推薦使用這三個(gè)通用鏡像:ubuntu:latest、debian:slim 和 alpine:latest
Ubuntu/Debian
Ubuntu 和 Debian 是綜合能力非常強(qiáng)的 Linux 發(fā)行版,非常適合作為通用鏡像使用,它們主要的優(yōu)點(diǎn)如下。
- 支持的軟件包眾多。
- 鏡像體積較小。
- 用戶數(shù)量大,社區(qū)活躍,容易及時(shí)發(fā)現(xiàn)和修復(fù)安全問題。
- 相比較 Alpine 具有更通用的 C 語(yǔ)言標(biāo)準(zhǔn)庫(kù) glibc。
- 文檔和教程豐富。
Alpine
我們?cè)賮砜戳硪环N通用鏡像 Alpine。在很長(zhǎng)的時(shí)間里,Alpine 發(fā)行版并沒有受到太多的關(guān)注。直到 Docker 時(shí)代,大家為了追求更小的鏡像體積才開始大量使用 Alpine 鏡像。相比較 Debian,Alpine 有下面這些優(yōu)點(diǎn)。
- 快速的包安裝體驗(yàn)。
- 極小的鏡像體積。
- 只包含少量的系統(tǒng)級(jí)程序,安全性更高。
- 更輕量的初始化系統(tǒng) OpenRC。
專用鏡像
各種編程語(yǔ)言鏡像
初學(xué)使用發(fā)行版linux,盡量不要用Alpine,c庫(kù)不一樣
對(duì)Alpine,Dockerfile編譯過程中指定 CGO_ENABLED=0
相關(guān)理論簡(jiǎn)介 (可跳過)
容器標(biāo)準(zhǔn)
?Open Container Initiative(OCI)
? ?輕量級(jí)開放式管理組織(項(xiàng)目)
?OCI主要定義兩個(gè)規(guī)范
? ?Runtime Specification
? ?文件系統(tǒng)包如何解壓至硬盤,共運(yùn)行時(shí)運(yùn)行。
?Image Specification
?如何通過構(gòu)建系統(tǒng)打包,生成鏡像清單(Manifest)、文件系統(tǒng)序列化文件、鏡像配置。
Namespace
Linux Namespace是一種Linux Kernel提供的資源隔離方案:
? ?系統(tǒng)可以為進(jìn)程分配不同的Namespace;
? ?并保證不同的Namespace資源獨(dú)立分配、進(jìn)程彼此隔離,即不同的Namespace下的進(jìn)程互不干擾。
多種namespace互相隔離
? IPC,Network,PID,Mount,UTS,USER
相關(guān)命令
查看當(dāng)前系統(tǒng)的namespace:
lsns –t <type>
查看某進(jìn)程的namespace:
ls -la /proc/<pid>/ns/
進(jìn)入某namespace運(yùn)行命令:
nsenter -t <pid> -n ip addr
Cgroup
?Cgroups(Control Groups)是Linux下用于對(duì)一個(gè)或一組進(jìn)程進(jìn)行資源控制和監(jiān)控的機(jī)制。
?可以對(duì)諸如CPU使用時(shí)間、內(nèi)存、磁盤I/O等進(jìn)程所需的資源進(jìn)行限制。
?不同資源的具體管理工作由相應(yīng)的Cgroup子系統(tǒng)(Subsystem)來實(shí)現(xiàn)。
?針對(duì)不同類型的資源限制,只要將限制策略在不同的的子系統(tǒng)上進(jìn)行關(guān)聯(lián)即可。
?Cgroups在不同的系統(tǒng)資源管理子系統(tǒng)中以層級(jí)樹(Hierarchy)的方式來組織管理:每個(gè)Cgroup都可以包含其他的子Cgroup,因此子Cgroup能使用的資源除了受本Cgroup配置的資源參數(shù)限制,還受到父Cgroup設(shè)置的資源限制。
文件系統(tǒng) Union FS
?將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)的文件系統(tǒng)
?支持為每一個(gè)成員目錄(類似GitBranch)設(shè)定readonly、readwrite和whiteout-able 權(quán)限
?文件系統(tǒng)分層, 對(duì)readonly權(quán)限的branch 可以邏輯上進(jìn)行修改(增量地, 不影響readonly部分的)
?通常Union FS 有兩個(gè)用途, 一方面可以將多個(gè)disk掛到同一個(gè)目錄下, 另一個(gè)更常用的就是將一個(gè)readonly的branch 和一個(gè)writeable 的branch 聯(lián)合在一起
docker的文件系統(tǒng)
典型的Linux文件系統(tǒng)組成:
- Bootfs(boot file system)
- Bootloader 引導(dǎo)加載kernel
- Kernel 當(dāng)kernel被加載到內(nèi)存中后umountbootfs。
rootfs(root file system)
/dev,/proc,/bin,/etc等標(biāo)準(zhǔn)目錄和文件。
對(duì)于不同的linux發(fā)行版, bootfs基本是一致的,但rootfs會(huì)有差別。
docker啟動(dòng)過程
Linux
- 在啟動(dòng)后,首先將rootfs設(shè)置為readonly, 進(jìn)行一系列檢查, 然后將其切換為“readwrite”供用戶使用。
Docker啟動(dòng)
初始化時(shí)也是將rootfs以readonly方式加載并檢查,然而接下來利用union mount 的方式將一個(gè)readwrite文件系統(tǒng)掛載在readonly的rootfs之上,復(fù)用rootfs。
并且允許再次將下層的FS(file system)設(shè)定為readonly并且向上疊加。
這樣一組readonly和一個(gè)writeable的結(jié)構(gòu)構(gòu)成一個(gè)container的運(yùn)行時(shí)態(tài), 每一個(gè)FS被稱作一個(gè)FS層。
OCI容器標(biāo)準(zhǔn)
Open Container Initiative
OCI組織于2015年創(chuàng)建,是一個(gè)致力于定義容器鏡像標(biāo)準(zhǔn)和運(yùn)行時(shí)標(biāo)準(zhǔn)的開放式組織。
OCI定義了鏡像標(biāo)準(zhǔn)(Runtime Specification)、運(yùn)行時(shí)標(biāo)準(zhǔn)(Image Specification)和分發(fā)標(biāo)準(zhǔn)(DistributionSpecification)文章來源:http://www.zghlxwxcb.cn/news/detail-425413.html
- 鏡像標(biāo)準(zhǔn)定義應(yīng)用如何打包
- 運(yùn)行時(shí)標(biāo)準(zhǔn)定義如何解壓應(yīng)用包并運(yùn)行
- 分發(fā)標(biāo)準(zhǔn)定義如何分發(fā)容器鏡像
Docker 12-Factor
12-Factor 應(yīng)用是一種用于構(gòu)建軟件即服務(wù)(SaaS)應(yīng)用的方法論。它提供了 12 個(gè)因素,用來指導(dǎo)開發(fā)人員如何構(gòu)建可擴(kuò)展、可維護(hù)和可移植的應(yīng)用程序。這些因素包括:文章來源地址http://www.zghlxwxcb.cn/news/detail-425413.html
- 代碼庫(kù):應(yīng)用程序應(yīng)該有一個(gè)代碼庫(kù),并使用版本控制系統(tǒng)進(jìn)行管理。
- 依賴:應(yīng)用程序應(yīng)該顯式聲明并隔離其依賴關(guān)系。
- 配置:應(yīng)用程序的配置應(yīng)該存儲(chǔ)在環(huán)境變量中,而不是硬編碼到代碼中。
- 后端服務(wù):應(yīng)用程序應(yīng)該將后端服務(wù)(如數(shù)據(jù)庫(kù))視為附加資源,并通過 URL 來訪問。
- 構(gòu)建、發(fā)布、運(yùn)行:應(yīng)用程序的構(gòu)建、發(fā)布和運(yùn)行階段應(yīng)該嚴(yán)格分離。
- 進(jìn)程:應(yīng)用程序應(yīng)該以一個(gè)或多個(gè)無狀態(tài)進(jìn)程的形式執(zhí)行。
- 端口綁定:應(yīng)用程序應(yīng)該通過端口綁定來提供服務(wù)。
- 并發(fā):應(yīng)用程序應(yīng)該通過進(jìn)程模型來實(shí)現(xiàn)擴(kuò)展。
- 可處理性:應(yīng)用程序應(yīng)該能夠快速啟動(dòng)并優(yōu)雅地關(guān)閉。
- 開發(fā)/生產(chǎn)環(huán)境等價(jià)性:應(yīng)用程序的開發(fā)、預(yù)發(fā)布和生產(chǎn)環(huán)境應(yīng)該盡可能相似。
- 日志:應(yīng)用程序應(yīng)該將日志視為事件流,并通過標(biāo)準(zhǔn)輸出進(jìn)行輸出。
- 管理進(jìn)程:應(yīng)用程序的管理/運(yùn)維任務(wù)應(yīng)該作為一次性進(jìn)程運(yùn)行。
到了這里,關(guān)于云原生個(gè)人線路 Docker容器化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!