Docker 使用说明
基本概念
- Image(镜像):Docker 镜像是一个只读的模板,包含了运行应用所需的所有内容(代码、库、依赖、环境等)。可以理解为操作系统的快照。
- Container(容器):容器是镜像的运行实例。它是一个隔离的进程环境,可以启动、停止、删除。容器基于镜像创建,但可以有自己的数据和状态。
| 对比项 | 镜像(Image) | 容器(Container) |
|---|---|---|
| 作用 | 模板/快照 | 运行时实例 |
| 状态 | 静态 | 动态 |
| 可变性 | 不可变 | 可变 |
| 生命周期 | 长久 | 临时/可持久 |
镜像构建
1
2
# 构建镜像(-f 指定 Dockerfile,-t 指定标签)
sudo docker build -f Dockerfile -t my-app:dev .
容器启动
1
2
3
4
5
6
7
8
# 以默认方式启动容器
docker run my-app:dev
# 以交互模式启动并进入 bash
docker run -it --name mywork my-app:dev /bin/bash
# 启动后自动删除容器
docker run --rm -it my-app:dev /bin/bash
容器操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看所有容器(包括已停止)
docker ps -a
# 停止容器
sudo docker stop <container_id>
# 删除容器
sudo docker rm <container_id>
# 保存容器为新镜像
sudo docker commit <container_id> my-app:saved
# 重启容器
sudo docker start <container_id>
# 进入已运行的容器
sudo docker exec -it <container_id> /bin/bash
镜像管理
1
2
3
4
5
# 查看本地镜像
docker images
# 删除镜像
docker rmi <image_id>
文件拷贝
1
2
3
4
5
# 从主机拷贝文件到容器
sudo docker cp /path/on/host/file.txt <container_id>:/path/in/container/
# 从容器拷贝文件到主机
sudo docker cp <container_id>:/path/in/container/file.txt /path/on/host/
清理与空间管理
1
2
3
4
5
6
7
8
9
10
11
# 清理所有已停止的容器
docker container prune
# 清理未被使用的镜像
docker image prune
# 清理所有未被使用的镜像、容器、网络、缓存等(慎用)
docker system prune -a
# 查看磁盘空间占用
docker system df
网络与 DNS 问题
1
2
3
4
# 修改 DNS 以解决网络问题
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
echo "nameserver 1.1.1.1" | sudo tee -a /etc/resolv.conf
sudo apt-get update
常见问题
1
2
3
Extracting Bazel installation...
Starting local Bazel server (8.1.1) and connecting to it...
ERROR: Error computing the main repository mapping: Error accessing registry https://bcr.bazel.build: Failed to fetch registry file https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel: Unknown host: bcr.bazel.build
建议检查 DNS 设置,或使用上文的 DNS 配置命令。
docker 中模拟opengl渲染,使用libosmesa
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
# 使用官方 Ubuntu 基础镜像
FROM ubuntu:22.04
# 避免安装过程中交互式提示
ENV DEBIAN_FRONTEND=noninteractive
# 安装必要的依赖库
RUN apt-get update && apt-get install -y \
libosmesa6 \
libgl1 \
libgles2 \
libstdc++6 \
libglapi-mesa \
libllvm15 \
zlib1g \
zstd \
libdrm2 \
libgcc-s1 \
libglx0 \
libgl1-mesa-dri \
libffi8 \
libedit2 \
libtinfo6 \
libxml2 \
libx11-6 \
libbsd0 \
libicu70 \
liblzma5 \
libxcb1 \
libmd0 \
libxau6 \
libxdmcp6 \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y \
mesa-utils \
mesa-common-dev \
libosmesa6-dev \
&& rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /app
# 将你的可执行文件和任何必要的文件复制到容器中
COPY mesaTest /app/mesaTest
# 设置可执行权限
RUN chmod +x /app/mesaTest
# 设置容器启动时运行的命令
# CMD ["/app/mesaTest"]