Docker 从入门到实践:镜像、容器、数据卷与 Docker Compose

大家好,Docker 是目前最流行的容器化技术,它让应用的构建、交付和运行变得更加标准化和高效。通过 Docker,我们可以将应用及其依赖环境打包成一个轻量级的容器,在任何支持 Docker 的系统中一致运行。本文将按照知识点分类,系统性地讲解 Docker 的核心概念和常用命令,帮助你快速上手。


一、Docker 基础概念

1.1 Docker 的三个核心概念

概念 说明
镜像(Image) 容器的只读模板,包含应用及其运行环境
容器(Container) 镜像的运行实例,可创建、启动、停止和删除
仓库(Repository) 存储和分发镜像的地方(如 Docker Hub)

1.2 版本查看

复制代码
# 查看 Docker 版本信息
docker version

二、镜像管理

2.1 查看镜像

复制代码
# 查看本地所有镜像
docker images

2.2 拉取镜像

复制代码
# 从 Docker Hub 拉取镜像
docker pull nginx:alpine
docker pull python:3.10-slim

2.3 搜索镜像

复制代码
# 搜索 Docker Hub 上的镜像
docker search nginx

# 搜索结果说明:
# OFFICIAL 表示官方镜像
# STARS 表示该镜像获得的星数

2.4 删除镜像

复制代码
# 删除镜像
docker rmi 镜像名:标签
docker rmi nginx:alpine

# 强制删除
docker rmi -f 镜像名

2.5 构建镜像

复制代码
# 使用 Dockerfile 构建镜像(-t 指定镜像名和标签,. 表示当前目录)
docker build -t myapp:1.0 .

三、容器管理

3.1 查看容器

复制代码
# 查看正在运行的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

3.2 创建并运行容器

复制代码
# 基本语法
docker run -d --name 容器名 -p 宿主机端口:容器端口 镜像名:标签

# 示例:运行 Nginx 容器
docker run -d --name my-first-nginx -p 8080:80 nginx:alpine

# 示例:运行 MySQL 容器(设置环境变量)
docker run -d --name mysql-container -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

# 示例:挂载数据卷(将本地目录映射到容器内)
docker run -d --name nginx-volume -p 8080:80 -v $(pwd)/html:/usr/share/nginx/html nginx:alpine

参数说明

参数 说明
-d 后台运行(detach)
--name 指定容器名称
-p 端口映射(宿主机端口:容器端口)
-v 挂载数据卷或目录
-e 设置环境变量

3.3 启动、停止与重启

复制代码
# 启动已存在的容器
docker start 容器名/容器ID

# 停止容器
docker stop 容器名/容器ID

# 重启容器
docker restart 容器名/容器ID

3.4 删除容器

复制代码
# 删除容器
docker rm 容器名/容器ID

# 强制删除正在运行的容器
docker rm -f 容器名/容器ID

3.5 查看容器日志

复制代码
# 查看容器日志
docker logs 容器名/容器ID

# 实时跟踪日志
docker logs -f 容器名/容器ID

3.6 进入容器内部

复制代码
# 进入容器内部(交互式)
docker exec -it 容器名 /bin/bash
docker exec -it 容器名 /bin/sh

# 示例
docker exec -it my-first-nginx /bin/sh

3.7 容器与本地文件拷贝

复制代码
# 从本地拷贝文件到容器
docker cp 本地文件路径 容器名:容器内路径

# 从容器拷贝文件到本地
docker cp 容器名:容器内路径 本地文件路径

# 示例
docker cp index.html my-first-nginx:/usr/share/nginx/html/
docker cp my-first-nginx:/usr/share/nginx/html/index.html ./

四、数据卷(Volume)

数据卷用于持久化容器数据,即使容器被删除,数据仍然保留。

4.1 数据卷的基本操作

复制代码
# 查看所有数据卷
docker volume ls

# 创建数据卷
docker volume create 数据卷名

# 删除数据卷
docker volume rm 数据卷名

4.2 使用数据卷运行容器

复制代码
# 使用数据卷挂载
docker run -d --name myapp -v 数据卷名:容器内路径 镜像名

# 示例
docker volume create mydata
docker run -d --name nginx-volume -v mydata:/usr/share/nginx/html nginx:alpine

4.3 挂载本地目录

复制代码
# 将本地目录挂载到容器内(bind mount)
docker run -d --name myapp -v $(pwd)/html:/app/html 镜像名

五、Dockerfile 镜像构建

Dockerfile 是用于构建镜像的文本文件,包含了一系列指令。

5.1 基础语法

指令 说明
FROM 指定基础镜像
ENV 设置环境变量
WORKDIR 设置工作目录
COPY 复制文件到镜像
RUN 在构建时执行命令
EXPOSE 声明容器监听的端口
CMD 容器启动时执行的命令

5.2 Dockerfile 示例

dockerfile

复制代码
# 基础镜像为 python:3.10-slim
FROM python:3.10-slim

# 设置环境变量
ENV HOME=/app \
    PORT=5000

# 设置工作目录
WORKDIR $HOME

# 将 requirements.txt 复制到工作目录
COPY requirements.txt $HOME/requirements.txt

# 安装依赖
RUN pip install -r requirements.txt

# 复制当前目录下的所有文件到工作目录
COPY . /app

# 暴露端口
EXPOSE $PORT

# 运行应用
CMD ["python", "web.py"]

5.3 构建镜像

复制代码
# 使用 Dockerfile 构建镜像
docker build -t myapp:1.0 .

# 指定 Dockerfile 路径
docker build -t myapp:1.0 -f Dockerfile.prod .

六、镜像标签与仓库

6.1 给镜像打标签

复制代码
# 语法
docker tag 原镜像名:标签 新镜像名:标签

# 示例:打标签准备推送到仓库
docker tag myapp:1.0 zzy0371/myapp:1.0

6.2 登录 Docker Hub

复制代码
# 登录 Docker Hub
docker login -u 用户名

# 输入密码后登录成功

6.3 推送镜像到仓库

复制代码
# 推送镜像到 Docker Hub
docker push 用户名/镜像名:标签

# 示例
docker push zzy0371/myapp:1.0

七、Docker Compose

Docker Compose 用于定义和运行多个容器的应用,通过一个 docker-compose.yml 文件配置所有服务。

7.1 常用命令

命令 说明
docker compose up -d 启动所有服务(后台运行)
docker compose down 停止并删除所有服务
docker compose logs 查看服务日志
docker compose ps 查看服务状态
复制代码
# 启动所有服务
docker compose up -d

# 停止并删除所有服务
docker compose down

# 查看日志
docker compose logs

# 查看服务状态
docker compose ps

7.2 docker-compose.yml 示例

yaml

复制代码
version: '3.8'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    environment:
      - PORT=5000
    volumes:
      - ./app:/app
  
  redis:
    image: redis:alpine
    ports:
      - "6379:6379"
  
  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

八、常用命令速查表

分类 命令 说明
基础 docker version 查看版本信息
镜像 docker images 查看本地镜像列表
docker pull 镜像名 拉取镜像
docker search 镜像名 搜索镜像
docker rmi 镜像名 删除镜像
docker build -t 名 . 构建镜像
容器 docker ps -a 查看所有容器
docker run -d --name 名 -p端口 镜像 创建并运行容器
docker start 容器名 启动容器
docker stop 容器名 停止容器
docker restart 容器名 重启容器
docker rm 容器名 删除容器
docker logs 容器名 查看日志
docker exec -it 容器名 bash 进入容器内部
docker cp 本地 容器:目录 拷贝文件到容器
数据卷 docker volume ls 查看所有数据卷
docker volume create 名 创建数据卷
docker volume rm 名 删除数据卷
仓库 docker tag 原 新 给镜像打标签
docker login -u 用户名 登录仓库
docker push 镜像名 推送镜像
Compose docker compose up -d 启动所有服务
docker compose down 停止所有服务

九、总结

分类 核心内容
镜像 pullimagesbuildrmi
容器 runpsstartstoprestartrmlogsexeccp
数据卷 volume createvolume lsvolume rm-v 挂载
Dockerfile FROMENVWORKDIRCOPYRUNEXPOSECMD
仓库 logintagpush
Compose docker-compose.ymlup -ddown

Docker 通过镜像、容器、数据卷三大核心概念,实现了应用的标准化交付和运行。掌握这些基础知识后,你可以开始构建自己的镜像,管理容器化应用,并使用 Docker Compose 编排多服务应用。建议在实际项目中多练习,逐步熟悉 Docker 的工作流程。

如果觉得这篇内容对你有帮助,欢迎收藏备用。

相关推荐
xrlfreedom1 小时前
大厂 MCP 面试实录:桌面客户端 stdio MCP Server 调试与安全加固方案设计
docker·结构化输出·mcp·提示注入防护
wdfk_prog1 小时前
Docker 开发环境到底要交付什么:镜像、源码与运行脚本
运维·docker·容器
Huangjin007_1 小时前
【Linux 系统篇(十七)】进程(五) :进程切换、O(1) 调度算法
linux·运维·服务器
weixin_464307631 小时前
linux虚拟机断网
linux·运维·服务器
志栋智能1 小时前
凌晨3点的告警,如何用AI在5分钟内完成定界?
运维·服务器·数据库·人工智能·自动化
一技安身1 小时前
【Docker】Docker 和 docker‑compose 的核心区别 + 为什么要单独装 compose
docker·容器·eureka
λqaq71 小时前
Docker 容器入门基础:Cloud Studio 在线 Linux 环境上手
linux·运维·docker
流浪0012 小时前
Linux系统篇27——通信(四):System V 消息队列 + 信号量:管道之后,Linux 还藏了哪两样 IPC
linux·运维
山岚的运维笔记2 小时前
mysql 专业笔记 -- 第 14 章:GROUP BY
运维·数据库·笔记·后端·学习·mysql·dba