03 docker搭建

1 概念

Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖打包到一个轻量级、可移植的容器中,然后可以在几乎任何环境中运行,而无需担心环境差异带来的问题。

1. ​容器(Container)​​

容器是 Docker 的核心。它是一个轻量级、独立、可执行的软件包,包含:

  • 应用程序代码
  • 运行时环境(如 Python、Java、Node.js 等)
  • 系统工具和库
  • 配置文件
  • 容器与虚拟机不同,它不包含完整的操作系统,而是共享宿主机的内核,因此更加轻便、启动更快、资源占用更少。

2. ​镜像(Image)​​

镜像是容器的只读模板,用来创建容器。

比如,你可以有一个 "Ubuntu + Python + Flask" 的镜像,每次基于这个镜像启动的容器都会有一致的运行环境。

镜像是分层存储的,可以继承和复用,提高构建效率。

3. ​Dockerfile​

用于定义如何构建 Docker 镜像的文本文件,包含一系列指令,比如:

FROM python:3.9

WORKDIR /app

COPY . /app

RUN pip install -r requirements.txt

CMD "python", "app.py"

通过 docker build命令可以根据 Dockerfile 构建出镜像。

4. ​Docker 引擎(Docker Engine)​​

Docker 的核心后台服务,负责管理镜像、容器、网络和存储等。

包括:Docker Daemon(服务端)、Docker Client(命令行工具)、REST API。

5. ​Docker Hub​

官方的镜像仓库,类似于 GitHub,但存放的是 Docker 镜像。

你可以从 Docker Hub 上拉取(pull)公共镜像,比如 nginx、mysql、ubuntu,也可以将自己的镜像推送(push)上去。

2 安装docker

1. 卸载旧版本(如果有)

sudo apt-get remove docker docker-engine docker.io containerd runc

这一步是为了避免旧版本冲突,如果之前没装过,可以跳过。

2. 安装必要的依赖包

这些包允许 apt 通过 HTTPS 使用仓库:

sudo apt-get update

sudo apt-get install \

ca-certificates \

curl \

gnupg \

lsb-release

3. 添加 Docker 的官方 GPG 密钥

sudo mkdir -p /etc/apt/keyrings

curl -fsSL download.docker.com/linux/ubunt... | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

4. 设置 Docker 的稳定版仓库

echo \

"deb arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg download.docker.com/linux/ubunt... \

$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

对于 jammy,$(lsb_release -cs)会自动返回 jammy。

5. 更新 apt 包索引

sudo apt-get update

6. 安装 Docker 引擎

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

这里安装了:

  • docker-ce:Docker 社区版引擎
  • docker-ce-cli:Docker 命令行客户端
  • docker-buildx-plugin:构建工具插件
  • docker-compose-plugin:Docker Compose(作为插件形式)

7. 验证 Docker 是否安装成功

运行一个测试容器:

sudo docker run hello-world

如果看到类似如下信息,说明 Docker 已经成功安装并运行:

Hello from Docker!

This message shows that your installation appears to be working correctly.

...

3 基本设置

3.1 开机启动

sudo systemctl enable docker

3.2 加入用户组

默认情况下,使用 Docker 命令需要 sudo。如果你不想每次都输入 sudo,可以把你的用户加入 docker用户组:

⚠️ 注意:docker组拥有类似 root 的权限,请谨慎操作。

sudo usermod -aG docker $USER

4 国内镜像加速

4.1 配置 daemon.json

编辑 Docker 配置文件(没有就新建):

sudo mkdir -p /etc/docker

sudo nano /etc/docker/daemon.json

写入以下内容(推荐几个国内可用镜像源):

{

"registry-mirrors": [

"mirror.ccs.tencentyun.com",

"docker.mirrors.huaweicloud.com",

"docker.mirrors.ustc.edu.cn"

]

}

4.2 重启 Docker 服务

sudo systemctl daemon-reexec

sudo systemctl restart docker

4.3 验证是否生效

docker info

正常情况应该能看到类似:

4.4 拉取镜像报错

docker pull nginx

原因:虽然 docker info 已经能看到 Registry Mirrors,但 docker pull nginx 还是直连 registry-1.docker.io,这说明 Docker 版本 20+ 之后 registry mirror 的机制发生了变化。

从 Docker 20.10 开始,官方的解释是:

  • registry-mirrors 只会对 docker.io 的流量做镜像加速
  • 但需要通过 mirror 实现代理功能(如 Docker Hub 代理),而不是直接换源
  • 部分国内镜像站已经不再提供 完整 Docker Hub 代理,所以即使配置了,也可能 fallback 回 registry-1.docker.io

4.5 优化方案

方法一:使用真正的「Docker Hub 代理」

比如:

Docker Proxy(官方推荐社区维护的代理)

尝试更新 /etc/docker/daemon.json:

{

"registry-mirrors": [

"docker.m.daocloud.io",

"mirror.ccs.tencentyun.com"

]

}

然后重启:

sudo systemctl daemon-reexec

sudo systemctl restart docker


方法二:直接拉取「代理仓库」中的镜像

比如腾讯云的 nginx:

docker pull mirror.ccs.tencentyun.com/library/nginx:latest

这相当于手动指定代理,而不是依赖 Docker daemon 自动切换。


方法三:自己搭建 Docker Hub Mirror(进阶)

如果你有一台国外服务器,可以用 registry mirror 搭建一个本地代理,再把它填到 daemon.json,这样 100% 可控。

4. 6 最终结果

终于做到了~

相关推荐
copyer_xyf9 分钟前
Agent 记忆管理
后端·python·agent
葫芦和十三7 小时前
图解 MongoDB 02|BSON:你以为存的是 JSON,其实是带类型的二进制
后端·mongodb·agent
葫芦和十三7 小时前
图解 MongoDB 01|文档数据库
后端·mongodb·agent
陈随易9 小时前
VSCode的Copilot扩展支持接入DeepSeek,Kimi了!
前端·后端·程序员
我不是外星人10 小时前
有了 Harness Engineering ,真的还需要研发工程师吗?
前端·后端·ai编程
candyTong10 小时前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
Rust研习社13 小时前
组合真的优于继承吗?为什么 Rust 和 Go 都拥抱组合舍弃继承?
后端·rust·编程语言
IT_陈寒13 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
CaffeinePro14 小时前
Pydantic深度使用:数据校验、枚举、ORM映射
后端·fastapi
Chenyiax14 小时前
从 Chat 到 Responses:OpenAI API 抽象为什么变了?
后端