文章目录
- [docker 基础手册](#docker 基础手册)
docker 基础手册
docker 容器技术
- 开源的容器项目,使用 Go 语言开发
- 原意"码头工人",开发人员将应用程序及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何运行容器引擎的环境中,以容器形式运行该应用程序
Container
容器- 为应用程序的开发、发布和运行提供了一个基于容器的标准化平台(Docker平台)
镜像与容器
- 容器通过运行镜像来启动,镜像是一个可执行的软件包
- 容器是镜像可运行的实列
- 镜像是用于创建 Docker 容器的只读模板
- 关系对照:对象与类的关系
容器与虚拟机
- 容器更具轻量化
docker 引擎
- 架构:c/s 架构
- 主要包含组件
- 服务器端:Docker 守护进程(创建和管理 Docker 对象:镜像、容器、网络等)
- REST API:程序与 Docker 守护进程交互的接口,便于编程方式操作平台和容器
- 客户端:命令行接口,使用 docker 命令进行操作,通过使用命令的方式控制 Docker 守护进程
- 是当前使用最为广泛的容器引擎
- 可用于 Linux 和 Windows 服务器操作系统,基于
Containerd
项目实现(行业标准创建的核心容器运行时服务)
docker 架构
Docker客户端
- 交互的主要途径
- 我们一般在服务器上安装 Docker 引擎的时候,也会一起安装客户端(Docker-client)
- Docker 命令使用 Docker API
Docker守护进程
- 守护进程监听来自 Docker API 的请求:管理镜像、容器、网络、卷这样的 Docker 对象
- 守护进程之间也可以通信
- 一台主机运行一个 Docker 守护进程,也叫 Docker 主机
Docker注册中心
- 用来存储 Docker 镜像
- DockerHub 最大的镜像存储地址,也可以自己搭建,常见的企业镜像仓库有 harbor 镜像仓库
Docker对象
Docker 的主要工作就是创建和使用各类对象
- 镜像、容器、网络、卷、插件
docker 底层技术
早期的 docker
基于成熟的 Linux Container (LXC)技术
从0.9版本开始
采用新的容器技术 libcontainer
当前版本
底层依赖的核心技术包括了 Linux 操作系统内核的名称空间、控制组、联合文件系统
名称空间 namespace
- 提供隔离的工作空间,是对全局系统资源的一种封装隔离技术,不同的名称空间拥有彼此独立的全局系统资源
- 名称空间类型
- Cgroup:控制组,隔离控制组根目录,Linux 4.6 版本版本提供
- IPC:进程间通信,隔离进程间通信所需的资源
- NETWORK:网络,为进程提供网络资源的隔离,拥有独立的网络环境(网络设备接口、协议栈、路由表、防火墙规则等)
- Mount:挂载,为进程提供磁盘挂载点和文件系统的隔离能力
- PID:进程ID,同一个进程在不同的名称空间中进程ID不同
- USER:用户,隔离用户
- UST:主机名或域名的隔离
- docker 利用这一个特性实现了资源的隔离,其实容器本质上也是进程,不同容器内的进程属于不同名称空间,彼此透明,互不干扰
控制组 Cgroup
Control Group 底层技术
- Linux 内核提供限制、审计、隔离进程组或单个进程所使用的物理计算资源的一种机制
- 控制组可以对共享资源进行
- 资源限制:CPU、内存、存储空间
- 优先级:优先得到更多的 CPU 或磁盘 IO
- 资源审计:一个控制组的资源使用情况被监测和计量(
docker stats
) - 隔离:为控制组隔离名称空间,让一个控制组不能访问另一个控制组的进程、网络、文件系统
- 控制:可以对进程组执行暂停、恢复、重启操作
- 上面说了,每个容器都是相关隔离的一个或者一组进程,我们可以将这一个或者一组进程作为一个控制组进行管理
联合文件系统 UnionFS
将其他文件系统合并在一个联合挂载点的一种特殊文件系统
- 通过创建层来操作,非常轻巧和快速
- 有多种变体:AUFS、OverlayFS、Btffs、BFS等
- 是 docker 镜像实现的技术基础
docker 二进制安装
二进制
- 安装前的一些通用条件
shell
禁用防火墙和selinux
设置主机名和/etc/hosts文件解析
设置正确的时间同步
- 下载二进制包并安装
shell
tar xzvf docker-xxx.tgz
cp docker/* /usr/bin/
useradd -s /usr/sbin/nologin -M docker
- 生成 systemd 服务管理文件
shell
cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
Requires=docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
OOMScoreAdjust=-500
[Install]
WantedBy=multi-user.target
EOF
- 生成 docker.socket 文件
shell
cat > /usr/lib/systemd/system/docker.socket << EOF
[Unit]
Description=Docker Socket for the API
[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=docker
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
- 启动和配置服务
shell
systemctl enable docker --now
### 查看启动状态
systemctl start docker
- 配置 docker 存储目录
shell
cat > /etc/docker/daemon.json <<EOF
{
"data-root": "/data/docker"
}
EOF
### 重启生效
systemctl daemon-reload
systemctl restart docker
docker info | grep Dir
ubuntu在线安装
官方参考地址:Install Docker Engine on Ubuntu | Docker Docs
shell
### 卸载旧版本
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
rm -rf /var/lib/docker
shell
## 使用apt存储库安装
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
安装特定版本
shell
### 查看版本
apt-cache madison docker-ce | awk '{ print $3 }'
### 安装
VERSION_STRING=5:23.0.6-1~ubuntu.20.04~focal
sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
查看状态并验证
shell
systemctl enable docker --now
systemctl status docker
docker run hello-world
docker 镜像加速
Docker Hub 部署在境外服务器,国内私有网络访问可能有点慢,我们可以配置数据中心的镜像加速来提高拉取镜像的速度
- /etc/docker/daemon.json 文件中新增配置项
shell
"registry-mirrors": ["<镜像加速地址>"]
- 重启生效即可
shell
systemctl daemon-reload
systemctl restart docker
docker 相关链接
[Docker 所支持的平台](Install Docker Engine | Docker Docs)
[Docker 引擎官方手册](Docker Engine overview | Docker Docs)
[Docker 命令官方手册](Use the Docker command line | Docker Docs)
[Docker Compose 命令手册](Overview of docker compose CLI | Docker Docs)
[Dockerd 命令手册](dockerd | Docker Docs)
docker 生态
- 核心技术:容器运行时(Runtime)为容器运行提供底层的运行环境,容器引擎(Docker)支持容器管理类,镜像仓库(DockerHub)支持镜像的存储和发布
- 支持技术:网络、存储、安全等
- 平台技术:Docker Swarm、K8s 等容器管理平台技术提供容器集群管理功能