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 最终结果

终于做到了~

相关推荐
2601_9615934213 小时前
Rust 开发环境配置繁琐?RustRover 开箱即用搞定编码调试
开发语言·后端·macos·rust
犀利豆15 小时前
AI in Harness(三)
人工智能·后端
IT_陈寒16 小时前
Java的Stream.parallel()把我CPU跑爆了,这种优化要谨慎
前端·人工智能·后端
子兮曰16 小时前
Bun 重写为 Rust:11天、64个Claude、16.5万美元,一次改变行业认知的激进实验
前端·后端·bun
子兮曰17 小时前
Node.js v26.5.0 深度解读:import Text、流式 ReadableStreamTee、以及隐藏的安全加固浪潮
前端·后端·node.js
子兮曰17 小时前
TypeScript 7.0 RC 深度解读:Go 重写完成,10 倍提速,编译器的「奇点时刻」
前端·后端·typescript
kosan17 小时前
.NET/C# 实战:我如何把登录验证码从“裸奔”改到“铜墙铁壁”
后端
王中阳Go17 小时前
AI编程实践:规则 + 技能 + 子代理 + 钩子,拆解Trae AI 开发规范的完整落地范式
后端·agent·ai编程
码事漫谈18 小时前
放下代码洁癖,享受挖坑人生
后端
_张有志_18 小时前
手撕 STL:一棵红黑树,凭什么同时撑起 set 和 map?
后端