Docker
约 2149 字大约 7 分钟
2025-03-18
前置知识
- Linux命令
使用别人写好的软件/工具最大的障碍是什么——必然是配环境。配环境带来的折磨会极大地消解你对软件、编程本身的兴趣。虚拟机可以解决配环境的一部分问题,但它庞大笨重,且为了某个应用的环境配置好像也不值得模拟一个全新的操作系统。
Docker 的出现让环境配置变得(或许)不再折磨。简单来说 Docker 使用轻量级的“容器”(container)而不是整个操作系统去支持一个应用的配置。应用自身连同它的环境配置被打包为一个个 image 可以自由运行在不同平台的一个个 container 中,这极大地节省了所有人的时间成本。
如何学习docker
Docker 官方文档当然是最好的初学教材,但最好的导师一定是你自己——尝试去使用 Docker 才能享受它带来的便利。Docker 在工业界发展迅猛并已经非常成熟,你可以下载它的桌面端并使用图形界面。
当然,如果你像我一样,是一个疯狂的造轮子爱好者,那不妨自己亲手写一个迷你 Docker 来加深理解。
KodeKloud Docker for the Absolute Beginner 全面的介绍了 Docker 的基础功能,并且有大量的配套练习,同时提供免费的云环境来完成练习。其余的云相关的课程如 Kubernetes 需要付费,但个人强烈推荐:讲解非常仔细,适合从 0 开始的新手;有配套的 Kubernetes 的实验环境,不用被搭建环境劝退。
安装Docker CE
docker拉取失败解决方案
配置daemon.json文件:参考 magic 配置docker代理
自动安装
Docker 提供了一个自动配置与安装的脚本,支持 Debian、RHEL、SUSE 系列及衍生系统的安装。请注意,Docker 官方不建议在生产环境使用此脚本安装 Docker CE。
以下内容假定
您为 root 用户,或有 sudo 权限,或知道 root 密码; 您系统上有 curl 或 wget
export DOWNLOAD_URL="https://mirrors.cernet.edu.cn/docker-ce"
# 如您使用 curl
curl -fsSL https://raw.githubusercontent.com/docker/docker-install/master/install.sh | sudo -E sh
# 如您使用 wget
wget -O- https://raw.githubusercontent.com/docker/docker-install/master/install.sh | sudo -E sh
Debian/Ubuntu/Raspbian
Debian Ubuntu Raspberry Pi OS
以下内容根据 官方文档 修改而来。
如果你过去安装过 docker,先删掉:
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
信任 Docker 的 GPG 公钥并添加仓库:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/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://mirrors.cernet.edu.cn/docker-ce/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
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://mirrors.cernet.edu.cn/docker-ce/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/raspbian/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://mirrors.cernet.edu.cn/docker-ce/linux/raspbian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Fedora
Fedora
以下内容根据 官方文档 修改而来。
如果你之前安装过 docker,请先删掉
sudo dnf remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
安装依赖,下载 repo 文件,并把软件仓库地址替换为镜像站:
sudo dnf -y install dnf-plugins-core
sudo dnf-3 config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
sudo sed -i 's+https://download.docker.com+https://mirrors.cernet.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
最后安装:
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
CentOS/RHEL
以下内容根据 官方文档 修改而来。
CentOS RockyLinux AlmaLinux
如果你之前安装过 docker,请先删掉
sudo dnf remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
安装依赖,下载 repo 文件,并把软件仓库地址替换为CERNET联合镜像站:
sudo yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo sed -i 's+https://download.docker.com+https://mirrors.cernet.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
sudo yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo sed -i 's+https://download.docker.com+https://mirrors.cernet.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
最后安装:
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
OpenMediaVault
OpenMediaVault
Open Media Vault 是一款基于 Debian 的 NAS 操作系统。
omv-env set OMV_DOCKER_APT_REPOSITORY_URL "https://mirrors.cernet.edu.cn/docker-ce/linux/debian"
迁移Docker数据
备份原数据
首先,停止 Docker 服务,以确保在修改配置时不会发生数据损坏。
sudo systemctl stop docker
假设迁移到
/opt/docker-images
中,则需要先备份,创建文件夹并给予权限
sudo mkdir -p /opt/docker-images
sudo chmod -R 755 /opt/docker-images
使用rsync协议同步复制原docker数据卷
sudo rsync -aP /var/lib/docker/ /opt/docker-images/
删除旧数据(可选)
sudo rm -rf /var/lib/docker
配置daemon.json
在 Linux 系统上,Docker 的配置文件通常位于 /etc/docker/daemon.json
。如果该文件不存在,可以手动创建。
sudo nano /etc/docker/daemon.json
{
"data-root": "/opt/docker-images",
"registry-mirrors": [
"https://docker.1panel.live",
"https://image.cloudlayer.icu",
"https://dockerpull.cn"
]
}
Ctrl + X 保存
重启docker
sudo systemctl start docker
验证配置
docker info | grep "Docker Root Dir"
输出结果应该为 Docker Root Dir: /opt/docker-images
容器网络
Docker 的网络功能非常强大,支持多种网络模式。以下是 Docker 支持的几种网络模式:
- bridge:默认网络模式,Docker 会为每个容器分配一个虚拟网卡,并将其连接到一个虚拟交换机上。容器之间可以通过 IP 地址进行通信。
- host:容器与宿主机共享网络栈,容器中的应用可以直接使用宿主机的网络接口。
- overlay:用于跨主机的容器网络,适用于 Docker Swarm 集群。
- macvlan:允许容器拥有自己的 MAC 地址,可以直接与物理网络进行通信。
- none:容器没有网络连接。
- container:容器与另一个容器共享网络栈。
- ipvlan:类似于 macvlan,但使用不同的网络模型。
容器使用
作为一名爱好者,docker对于我们来讲更多的作用是使用他人制作的容器。
在docker上部署tapnet
介绍
TapNet(Temporal Attention Propagation Network)是一种深度学习模型,旨在解决时序数据和动态图建模中的问题。它结合了图神经网络(GNN)和注意力机制,用于在动态图和时序数据中捕捉复杂的依赖关系。TapNet特别适用于那些涉及时间依赖性和图结构的信息传播问题,广泛应用于如交通预测、金融市场分析、社交网络分析等领域。
部署
官方 GitHub : google-deepmind/tapnet:跟踪任意点 (TAP)
克隆储存库: git clone https://github.com/deepmind/tapnet.git
配置 python 库 cd tapnet pip install . pip install tensorflow -i https://mirrors.aliyun.com/pypi/simple/ pip install tensorflow_datasets -i https://mirrors.aliyun.com/pypi/simple/
检查点下载
测试
python3 tapnet\live_demo.py
拉取cuda的docker镜像
这里我选择的cuda版本为cuda12.1(注:下面写错了,应该是121)
docker pull nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04
检查容器
nvcc --version
结果:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0
配置环境
# 更新
apt update
# 下载
apt install python3.11
# 检查是否安装成功ython3.11 --version
# 安装wget
apt install wget
# 下载pip安装包
wget https://bootstrap.pypa.io/get-pip.py
# 安装
python3.11 get-pip.py
# 检查是否安装成功
python3.11 -m pip --version
cd /home/tapnet
# 安装第三方库
python3.11 -m pip install .
# 安装 cuda 版本 jax
python3.11 -m pip install -U "jax[cuda118]"
# 安装其他库
python3.11 -m pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple
python3.11 -m pip install tensorflow-datasets -i https://pypi.tuna.tsinghua.edu.cn/simple
python3.11 -m pip install websockets -i https://pypi.tuna.tsinghua.edu.cn/simple
发布docker
docker commit -m "cuda118的镜像" 78bd1a17252aeeaa733fe9ce43802b5472b954d7cd418ccee7521e874ab4ed78 tapnet:cuda118
创建一个容器进行检查
docker run -it -v /f/work/bingRun/docker-tapnet:/home/tapnet --gpus all tapnet:cuda118 /bin/bash
编写python程序测试容器是否可以使用gpu
import jax
import jax.numpy as jnp
def matrix_multiply_on_gpu():
# 创建两个随机矩阵
key = jax.random.PRNGKey(0)
a = jax.random.normal(key, (2, 2))
b = jax.random.normal(key, (2, 2))
# 指定在 CUDA 设备上计算
device = jax.devices("gpu")[0]
# 将数据传输到 GPU 上
a_gpu = jax.device_put(a, device=device)
b_gpu = jax.device_put(b, device=device)
# 在 GPU 上执行矩阵乘法
c_gpu = jnp.dot(a_gpu, b_gpu)
# 打印计算结果
print("Matrix a:\n", a)
print("Matrix b:\n", b)
print("Result of matrix multiplication on GPU:\n", c_gpu)
if __name__ == "__main__":
matrix_multiply_on_gpu()
更新日志
cacf2
-docs: add CardGrid wrapper for RepoCard in Templates.md于3d0b9
-docker更改于7cae1
-feat: cancel contributors display于5fa5e
-docs(friends-persons): update social links and descriptions于