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 停止所有服务

九、总结

分类 核心内容
镜像 pull、images、build、rmi
容器 run、ps、start、stop、restart、rm、logs、exec、cp
数据卷 volume create、volume ls、volume rm、-v 挂载
Dockerfile FROM、ENV、WORKDIR、COPY、RUN、EXPOSE、CMD
仓库 login、tag、push
Compose docker-compose.yml、up -d、down

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

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

相关推荐
虎头金猫4 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS4 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
AI职业加油站4 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏4 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
玉&心4 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
xing-xing4 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
-梅4 天前
linux(8) 软硬链接
linux·运维·服务器
赵文宇(温玉)4 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang4 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren4 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github