dockerfile
https://www.runoob.com/docker/docker-image-usage.html
https://hub.docker.com/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
| # 查看docker版本
docker --version
docker -v
docker info | grep "Storage Driver" # 当前使用的存储驱动
# 安装
sudo snap install docker # 不推荐,可能有问题
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
# 设置用户组
sudo groupadd docker # 新增dockr组,安装后会有
newgrp docker # **切换用户的主组**,否则可能因为没有sudo权限运行不了docker命令
getent group | grep docker # 查看组
sudo usermod -aG docker $USER # 组中添加成员
# 查看本机镜像
docker images
docker images <image_name>
docker images --format '{{.Size}}\t{{.Repository}}:{{.Tag}}' | sort -h # 按大小排序
docker images --no-trunc # 非节点查看
docker images -a
# 查找镜像
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
runoob@runoob:~$ docker search httpd
# 获取镜像
docker pull <image_name>:<tag>
docker pull ubuntu #默认标签docker pull ubuntu
docker pull ubuntu:20.04
docker pull colmap/colmap
docker pull colmap/colmap:v3.7
docker pull hub-mirror.c.163.com/library/busybox:latest # 指定镜像源
# 保存离线镜像并运行
docker save -o <image-name>.tar <image-name>:<tag> # 保存为 tar 文件
docker save -o ubuntu.tar ubuntu:latest
docker load -i ubuntu.tar # 可以使用docker images查看
docker run -it ubuntu:latest /bin/bash
# 启动容器
以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
$ docker run -it ubuntu /bin/bash
docker run -it tensorflow/tensorflow:1.15.5-gpu
id # 查看uid gid
sudo docker run -it --user 1009:999 tensorflow/tensorflow:1.15.5-gpu /bin/bash
docker run -it -v ~/YFJ:/share tensorflow/tensorflow:1.15.5-gpu
docker run -it -v ~/Documents/python/unet_rgb:/share tensorflow/tensorflow
参数说明:
-i: 交互式操作。
-t: 终端。
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit:
# 停止容器
键盘快捷键 Ctrl + D 或者输入 exit 命令来退出容器
docker stop <container_id_or_name>
docker stop $(docker ps -q)
docker container prune # 删除所有退出的容器
docker rm <container_id> # 删除指定容器
# 查看容器状态
runoob@runoob:~$ docker ps
CONTAINER ID IMAGE COMMAND ...
5917eac21c36 ubuntu:15.10 "/bin/sh -c 'while t…" ...
# 与宿主机共享目录
docker run -it -v ~/shared_data:/data tensorflow/tensorflow
docker run -it -v ~/YFJ:/share tensorflow/tensorflow:1.15.5-gpu # 容器中不需要手动创建share目录
docker run -it -v ~/YFJ/python/sediment/deeplearning/demo/unet_rgb:/share tensorflow/tensorflow:latest-gpu
docker run --gpus all -it -v ~/Documents/python/unet_rgb:/share tensorflow/tensorflow:2.2.1-gpu
# 删除镜像
docker rmi -f yfjie/tensorflow:latest # 强制删除
docker rmi -f <IMAGE ID>
# 查看运行中的容器
docker ps
docker ps -a
# 镜像详细信息
docker inspect <镜像名称或 ID>
# 创建/更新镜像
docker commit ea78c33e150f yfjie/tensorflow # 经测试先更新后再exit,某些版本可以先exit
**docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2**
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] # 可以提交相同名称覆盖已有镜像
# 重启
sudo snap restart docker
# cuda运行时
which nvidia-container-runtime
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| nvidia-smi # 输出 GPU 信息表示驱动正常
# 添加 NVIDIA Container Toolkit 的 GPG 密钥
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
# 添加仓库源(适用于 Ubuntu 22.04 "jammy")
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update # 在有代理的情况下可能无法更新
# 安装 nvidia-container-runtime 及相关工具
sudo apt-get install -y nvidia-container-runtime # update失败可能导致无法安装
# 也可以离线安装(**Recommend**)
https://github.com/NVIDIA/nvidia-container-toolkit/releases
#/home/cy/pkg/coding/docker/release-v1.17.3-stable/packages/ubuntu18.04/amd64
tar -zxvf nvidia-docker-1.14.1.tar.gz
sudo chmod +x *.deb
sudo dpkg -i ./docker-24.0.6/*.deb # 同时安装多个deb,速度飞快
# 查看版本
nvidia-container-runtime --version
sudo nano /etc/docker/daemon.json
# 内容如下,安装后如自动生成也可以不用改
{
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
or,**recommended** this
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"args": [],
"path": "nvidia-container-runtime"
}
}
}
# 使更改生效
sudo systemctl daemon-reload # 可能不需要
sudo systemctl restart docker
# 查看nvidia-container-runtime安装位置
which nvidia-container-runtime
sudo nvidia-ctk runtime configure --runtime=docker
# test,应显示与宿主机相同的 GPU 信息(CUDA运行时需要跟镜像的匹配)
docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
docker run -it --gpus '"device=0,2"' --shm-size 32g image_name:tag_name # 指定gpu
|
在 Ubuntu 22.04 上安装 nvidia-container-runtime
的步骤如下:
1
2
3
4
5
6
| # 添加 NVIDIA Container Toolkit 的 GPG 密钥
curl -s -L <https://nvidia.github.io/nvidia-docker/gpgkey> | sudo apt-key add -
# 添加仓库源(适用于 Ubuntu 22.04 "jammy")
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L <https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list> | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
|
1
2
| # 安装 nvidia-container-runtime 及相关工具
sudo apt-get install -y nvidia-container-runtime
|
1
| sudo nano /etc/docker/daemon.json
|
若文件为空或已有配置,确保合并 "runtimes"
字段:
1
2
3
4
5
6
7
8
9
| {
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia" # 可选:设为默认运行时
}
|
按 Ctrl+O
保存,Ctrl+X
退出。
1
| sudo systemctl restart docker
|
1
| docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
|
应显示与宿主机相同的 GPU 信息,类似以下内容:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.86.05 Driver Version: 535.86.05 CUDA Version: 12.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... On | 00000000:01:00.0 Off | N/A |
| N/A 45C P8 N/A / N/A | 0MiB / 8192MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
- 原因:NVIDIA 驱动版本与容器内 CUDA 版本不兼容。
- 解决:升级宿主机 NVIDIA 驱动或使用匹配的 CUDA 镜像标签。
- 原因:
/etc/docker/daemon.json
配置语法错误。 - 解决:使用
docker info
检查错误日志,修正 JSON 格式。
1
2
3
4
5
| # 仅允许使用 GPU 0
docker run --rm --gpus '"device=0"' nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
# 指定计算能力(如 CUDA 12.0+)
docker run --rm --gpus all --env NVIDIA_DRIVER_CAPABILITIES=compute,utility nvidia/cuda:12.0.0-base-ubuntu22.04 nvidia-smi
|
1
2
| sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
|
通过以上步骤,Ubuntu 22.04 系统已成功配置 nvidia-container-runtime
,允许 Docker 容器直接调用宿主机的 NVIDIA GPU 资源。关键点包括:
- 正确配置 NVIDIA 仓库源。
- 安装
nvidia-container-runtime
包。 - 修改 Docker 运行时配置。
- 验证容器内 GPU 访问权限。
docker gpu报错Error response from daemon: could not select device driver ““ with capabilities: [[gpu]]-CSDN博客
sudo nvidia-ctk runtime configure –runtime=docker # 检查
https://www.cnblogs.com/eddyz/p/17168828.html
阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
1
2
3
4
5
6
7
8
9
10
11
12
13
| curl -v https://registry-1.docker.io/v2/
# 可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://fevvz971.mirror.aliyuncs.com"]
# "registry-mirrors": ["https://registry.docker-cn.com", "https://mirror.ccs.tencentyun.com", "https://docker.mirrors.ustc.edu.cn"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
|
https://www.cnblogs.com/lyjun/p/18393855
一个不行时可以配置多个!配置多个!配置多个!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| {
"registry-mirrors": [
"https://docker.hpcloud.cloud",
"https://docker.m.daocloud.io",
"https://docker.unsee.tech",
"https://docker.1panel.live",
"http://mirrors.ustc.edu.cn",
"https://docker.chenby.cn",
"http://mirror.azure.cn",
"https://dockerpull.org",
"https://dockerhub.icu",
"https://hub.rat.dev"
]
}
{
"registry-mirrors": [
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
|
在 Docker 中,你可以通过使用 -v
或 --volume
选项来挂载多个目录到容器中。下面是一些示例:
1
2
3
4
5
6
| docker run -d \
-v /host/path1:/container/path1 \
-v /host/path2:/container/path2 \
-v /host/path3:/container/path3 \
--name my_container \
my_image
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| cp /etc/apt/sources.list /etc/apt/sources.list.bak
echo "" > /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse" > /etc/apt/sources.list
apt update
Ubuntu 版本代号:
版本 代号
Ubuntu 24.04 noble
Ubuntu 22.04 jammy
Ubuntu 20.04 focal
Ubuntu 18.04 bionic
Ubuntu 16.04 xenial
如果你的 Ubuntu 版本不同,修改 sources.list 里的 jammy 为对应的代号。
# Ubuntu 20.04 focal
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
|
在 Docker 容器内查看容器的 ID,你可以在容器的终端中执行以下命令:
bash
cat /proc/self/cgroup | grep ‘docker’ | sed ’s/.*///’ | tail -n1
这个命令将输出当前容器的 ID。请注意,这个方法假设你的容器运行在 Docker 中,并且容器内有 /proc/self/cgroup 文件。
如果你是在交互式终端中运行容器,并且知道你正在查看的容器是什么,你也可以使用以下命令来查看当前容器的 ID:
bash
hostname
这会输出容器的主机名,通常是容器的短 ID。请注意,这不是容器的完整 ID,但在交互式终端中,通常足够识别容器。
1
2
3
4
| # 镜像迁移
docker save 镜像名:标签 > 镜像.tar
scp 镜像.tar newserver:/tmp/
docker load < /tmp/镜像.tar
|
最好把容器数据(volume)也一起迁移。
- 保存 volume 目录
- docker-compose 配置文件备份
- 也可以用
docker export
和 docker import
,但那样会丢失 volume 挂载信息。
在使用 Docker 时,由于网络限制,有时需要设置代理才能正常拉取镜像、推送镜像等操作。下面将分别介绍在 Linux、Windows 和 macOS 系统中为 Docker 设置代理的方法。
如果你希望 Docker 服务在系统层面使用代理,可以通过以下步骤进行配置:
- 创建或编辑 Docker 服务配置目录
在 /etc/systemd/system/docker.service.d
目录下创建或编辑 http-proxy.conf
文件,如果该目录不存在,可以手动创建。
1
2
| sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
|
- 添加代理配置
在 http-proxy.conf
文件中添加以下内容,将 your-proxy-server
和 your-proxy-port
替换为实际的代理服务器地址和端口。
# 注释掉即为删除
[Service]
Environment="HTTP_PROXY=http://your-proxy-server:your-proxy-port/"
Environment="HTTPS_PROXY=http://your-proxy-server:your-proxy-port/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
其中,NO_PROXY
用于指定不需要使用代理的地址,可以根据实际情况进行修改。
- 重新加载 systemd 管理器配置并重启 Docker 服务
1
2
| sudo systemctl daemon-reload
sudo systemctl restart docker
|
如果你只想为特定的容器设置代理,可以在运行容器时通过环境变量指定代理。例如:
1
2
3
4
| docker run -e HTTP_PROXY=http://your-proxy-server:your-proxy-port \\
-e HTTPS_PROXY=http://your-proxy-server:your-proxy-port \\
-e NO_PROXY=localhost,127.0.0.1,.example.com \\
your-image
|
如果你使用的是 Docker Desktop for Windows,可以按照以下步骤设置代理:
- 打开 Docker Desktop 设置
右键单击系统托盘中的 Docker 图标,选择“Settings”。 - 配置代理
在左侧菜单中选择“Proxies”,勾选“Manual proxy configuration”,然后分别填写 HTTP 和 HTTPS 代理服务器的地址和端口。如果有不需要使用代理的地址,可以在“Exceptions”字段中填写。 - 应用配置
点击“Apply & Restart”按钮,使配置生效。
与 Windows 系统类似,如果你使用的是 Docker Desktop for Mac,可以按照以下步骤设置代理:
- 打开 Docker Desktop 设置
点击菜单栏中的 Docker 图标,选择“Preferences”。 - 配置代理
在左侧菜单中选择“Proxies”,勾选“Manual proxy configuration”,然后分别填写 HTTP 和 HTTPS 代理服务器的地址和端口。如果有不需要使用代理的地址,可以在“Exceptions”字段中填写。 - 应用配置
点击“Apply & Restart”按钮,使配置生效。
通过以上方法,你可以在不同的操作系统中为 Docker 设置代理,确保 Docker 能够正常访问网络资源。
在 Linux 中,如果你拥有 Docker 的 root 权限(即你能执行 docker
命令而不加 sudo
),你就可以 通过容器挂载并修改任意宿主机目录的权限和内容。这是一种强大的功能,但也非常敏感,容易误操作破坏系统安全。
将宿主机任意目录(比如 /etc/ssh
)挂载到 Docker 容器,并在容器内自由修改权限/内容。
1
2
3
4
| docker run -it --rm \
-v /etc/ssh:/mnt/ssh \
--privileged \
ubuntu bash
|
解释:
v /etc/ssh:/mnt/ssh
:把宿主机 /etc/ssh
挂载进容器-privileged
:让容器内可以使用全部 Linux 功能(如 chown
, chmod
, mount
等)ubuntu bash
:使用 Ubuntu 镜像启动 Bash 交互
然后你可以在容器中执行:
1
2
3
| cd /mnt/ssh
chmod 777 sshd_config
echo "# hacked!" >> sshd_config
|
这些更改会直接反映在宿主机 /etc/ssh/sshd_config
上。
1
2
3
4
5
| docker run -it --rm \
-v /opt/data:/mnt/data \
--entrypoint bash \
--user root \
ubuntu
|
在容器内执行:
1
2
| chmod -R 777 /mnt/data
chown -R someuser:somegroup /mnt/data
|
项目 | 风险说明 |
---|
权限过大 | 可以破坏系统配置,例如误删 /etc/passwd |
容器提权 | --privileged 给予 root 权限,相当于“裸奔” |
安全建议 | 生产环境禁止使用 --privileged 和挂载系统目录 |
如果只是想挂载并读写某个数据目录(如 /data/projects
):
1
2
3
| docker run -it --rm \
-v /data/projects:/mnt/projects \
ubuntu bash
|
配合宿主机提前设定好权限即可,不需要 --privileged
。
有 Docker root 权限,就能用容器挂载任意目录并用 root 权限在其中自由改权限、删文件、加数据 —— 非常强大也要格外小心!
下面是一个简单实用的 Docker 自动挂载目录并修权限的脚本模板,适用于你想用容器 自动修复宿主机某个目录的权限 的情况。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| #!/bin/bash
# 要挂载并修改权限的宿主机目录
HOST_DIR="/data/myproject"
# 容器中映射路径
CONTAINER_DIR="/mnt/target"
# 目标权限
PERM_MODE="755"
# 目标用户和用户组(可选)
OWNER="root:root"
# 使用 Ubuntu 镜像,容器自动退出
docker run --rm \
-v "${HOST_DIR}:${CONTAINER_DIR}" \
--user root \
--entrypoint bash \
ubuntu \
-c "chown -R ${OWNER} ${CONTAINER_DIR} && chmod -R ${PERM_MODE} ${CONTAINER_DIR}"
|
复制上述脚本保存为 fix-perms.sh
赋予执行权限:
执行脚本:
- 支持命令行参数:
./fix-perms.sh /some/dir 777 user:group
- 设定默认镜像或切换为 Alpine 以缩小体积
- 使用
-privileged
若你修改的目录权限受限制(如 /etc
)
- 脚本对宿主目录有真实影响,务必小心操作。
- 如果要反复用,可添加日志输出。