跳至正文
来两杯美式
返回

Docker 核心概念与安装:镜像、容器、仓库、Dockerfile

By 来两杯美式
发布于

上一篇 《Docker 入门:为什么容器化是 AI 时代的必备技能》 我们讲了 Docker 解决了什么问题。这一篇我们把 Docker 世界的四个核心概念拆开看清楚,并完成你人生中的第一次镜像构建。


一、Docker 的四大核心概念

1.1 镜像(Image)

1.2 容器(Container)

1.3 仓库(Registry)

1.4 Dockerfile


二、环境准备与安装

2.1 安装 Docker

根据操作系统访问官方文档:

安装完成后打开终端验证:

docker --version
# 输出类似 Docker version 28.5.1, build 4debf41

2.2 配置镜像加速(大陆网络必需)

Docker Hub 在大陆访问较慢,需要配置镜像加速器。在 /etc/docker/daemon.json 中加入:

{
  "registry-mirrors": [
    "https://8vn26jg9.mirror.aliyuncs.com",
    "https://fy707np5.mirror.aliyuncs.com"
  ]
}

然后重启 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

2.3 在容器里装常用工具

刚装好的官方镜像通常很精简,连 vim 都没有。容器内安装命令:

# Debian/Ubuntu 系
apt-get update && apt-get install -y vim curl

# Alpine 系
apk add vim curl

如果出现 Unable to locate package xxx,先 apt-get update 再装。


三、常用命令实战

3.1 镜像相关

docker pull nginx                    # 拉取镜像
docker images                        # 列出本地所有镜像
docker rmi nginx                     # 删除镜像
docker save -o nginx.tgz nginx       # 导出镜像到本地文件
docker load < nginx.tgz              # 从本地文件导入镜像
docker history nginx                 # 查看镜像的层信息
docker search mysql                  # 在仓库搜索镜像

3.2 容器相关

# 创建并启动
docker run -d -p 8080:80 --name my-nginx nginx
#   -d       detach,后台运行
#   -p 8080:80  宿主机 8080 -> 容器 80
#   --name    容器名

docker ps                  # 正在运行的容器
docker ps -a               # 所有容器(含已停止)
docker ps -aq              # 只显示容器 ID

docker stop my-nginx       # 停止
docker start my-nginx      # 启动已停止的
docker rm my-nginx         # 删除已停止的
docker rm -f my-nginx      # 强制删除运行中的

docker logs -f my-nginx    # 查看日志(-f 持续跟踪)
docker exec -it my-nginx bash   # 进入容器内的 bash 终端

3.3 容器与镜像的转换

docker commit <container> my-image:1.0   # 把容器的当前状态提交成新镜像
docker build -t my-image:1.0 .          # 从 Dockerfile 构建镜像

3.4 组合命令

# 一键删除所有容器
docker rm -f $(docker ps -aq)

# 一键删除所有「已退出」的容器
docker rm $(docker ps -qf "status=exited")

四、动手构建第一个应用镜像

我们用 FastAPI 写一个最简单的 /ping 服务,然后把它打包成 Docker 镜像。

4.1 准备项目

poetry new docker-test
cd docker-test
poetry install
source .venv/bin/activate
poetry add fastapi
poetry add uvicorn

4.2 写主程序

# main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/ping")
def ping():
    return {"message": "pong"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

4.3 写 Dockerfile

docker-test 根目录创建 Dockerfile(无后缀):

# 1. 选一个轻量且带 Python 环境的基础镜像
FROM python:3.12-slim

# 2. 设置工作目录
WORKDIR /app

# 3. 安装 poetry
ENV POETRY_HOME=/opt/poetry
ENV PATH="$POETRY_HOME/bin:$PATH"
RUN apt-get update && apt-get install -y --no-install-recommends curl \
    && rm -rf /var/lib/apt/lists/* \
    && curl -sSL https://install.python-poetry.org | python3 -

# 4. 让 poetry 不要在项目目录内创建虚拟环境
RUN poetry config virtualenvs.create false

# 5. 先只复制依赖定义文件,利用 Docker 层缓存
COPY pyproject.toml poetry.lock ./

# 6. 安装项目依赖(不安装本地项目本身)
RUN poetry install --no-interaction --no-ansi --only main --no-root

# 7. 复制应用代码
COPY ./src/docker_test/main.py .

# 8. 声明端口
EXPOSE 8000

# 9. 启动命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

4.4 构建与运行

# 构建镜像
docker build -t docker-test .
# 第一次构建会下载基础镜像和所有依赖,可能需要几分钟
# 看到 "Successfully built xxx" + "Successfully tagged docker-test:latest" 就成功了

# 查看镜像
docker images
# 会看到名字为 docker-test 的镜像

# 启动容器
docker run -d -p 8000:8000 --name docker-test docker-test

# 看启动日志
docker logs docker-test

# 测试接口
curl localhost:8000/ping
# {"message":"pong"}

恭喜!你已经成功将一个 AI 应用容器化了。


五、镜像优化与安全

5.1 使用 .dockerignore

类似 .gitignore,可以避免把不需要的文件复制进镜像:

# .dockerignore
.git
.gitignore
__pycache__/
*.py[cod]
venv/
.venv/
.env
.DS_Store
*.log
.pytest_cache/
README.md

5.2 选更小的基础镜像

5.3 多阶段构建(Multi-stage Builds)

把构建过程和最终运行环境分开——一个阶段编译代码,另一个阶段只把产物复制到干净轻量的最终镜像中。对编译型语言效果显著,对 Python 也能用来分离构建依赖和运行依赖。

5.4 不要以 root 运行容器

RUN useradd -m myuser
USER myuser

5.5 扫描镜像漏洞

docker scan my-image:1.0      # 集成 Snyk
# 或使用 Trivy
trivy image my-image:1.0

六、小结

这一篇你掌握了:

下一篇 《Docker 数据持久化与网络:Volume 与容器间通信》 我们会讲容器「短暂的生命」和「隔离的边界」带来的两个新问题——数据怎么不丢容器之间怎么对话


分享这篇文章:
通过邮件分享这篇文章✓ 链接已复制
所属专题
Docker
第 2 / 5 篇
查看系列全部文章
  1. 01.Docker 入门:为什么容器化是 AI 时代的必备技能
  2. 02.Docker 核心概念与安装:镜像、容器、仓库、Dockerfile
  3. 03.Docker 数据持久化与网络:Volume 与容器间通信
  4. 04.Docker Compose 多容器编排:从命令到声明式
  5. 05.Docker 集群演进史:Swarm → Compose → Kubernetes

上一篇
Docker 数据持久化与网络:Volume 与容器间通信
下一篇
设计模式之观察者模式:一对多依赖,状态变更自动通知