Docker停止删除容器

Docker停止删除容器

引言

容器用多了会堆积一堆停止状态的旧实例,占磁盘、干扰排查。停止和删除是两步:先停再删,生产环境删容器前要确认数据已持久化,否则删除即丢失。

停止单个容器

docker stop 容器名或ID

发送SIGTERM优雅停止,等待默认10秒,超时再发SIGKILL强杀。

强制停止

docker kill 容器名或ID

直接SIGKILL,不给进程清理机会,只用于卡死不响应的容器。

删除已停止容器

docker rm 容器名或ID

只能删停止状态的容器,运行中需先stop或加-f。

强制删除运行中容器

docker rm -f 容器名或ID

一步停止并删除,慎用,等价于kill后rm。

批量清理

# 删除所有已停止容器
docker container prune

# 删除全部容器(含运行中,危险)
docker rm -f $(docker ps -aq)

prune只清停止的,相对安全;ps -aq配合rm -f会删光,生产禁止随手执行。

启动与重启

docker start 容器名
docker restart 容器名

停止的容器start可再次拉起,文件系统内改动仍在,只有删容器才清除。

注意事项

  • 删除容器前确认挂载卷和数据,容器内非挂载目录删除即丢;
  • 数据库容器先备份再删,别以为能找回来;
  • -f强制删除跳过优雅停止,可能丢未刷盘数据;
  • 批量命令先docker ps -aq列出确认,再删;
  • 加了--rm的容器退出自动删除,不留残骸;
  • 清理容器不影响镜像,镜像还在可随时重建。

总结

docker stop优雅停止,docker kill强杀,docker rm删已停容器,-f强制删运行中容器,container prune批量清停止实例。核心原则是先确认数据挂载和备份再删,生产慎用rm -f全量清理,执行批量命令前先列出ID核对,理解容器删除会清空非挂载层数据。


emer 发布于  2026-10-20 07:07 

Docker查看运行容器

Docker查看运行容器

引言

部署多个服务后,先要看清哪些容器在跑、状态如何、映射了哪些端口、跑了多久。docker ps系列命令是日常运维入口,配合格式化和过滤快速定位目标容器。

只看运行中容器

docker ps

输出容器ID、镜像、命令、创建时间、状态、端口映射、名称,默认只列正在运行的。

查看全部容器(含已停止)

docker ps -a

把Exited状态的容器也列出来,排查退出残留时用。

只看容器ID

docker ps -q

输出纯ID,配合批量停止删除。

自定义输出列

docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"

只保留关心的列,脚本采集更清晰。

按镜像过滤

docker ps --filter ancestor=nginx:latest

列出指定镜像启动的容器。

查看容器资源占用

docker stats

实时看每个容器CPU、内存、网络IO,Ctrl+C退出。

注意事项

  • ps默认不含已停止容器,找退出容器用-a;
  • STATUS显示Up时长或Exited码,退出码非0要查日志;
  • PORTS列看清宿主端口到容器端口的映射;
  • 容器名重复会冲突,--name要唯一;
  • 配合docker inspect看单个容器完整配置;
  • 批量操作前先用-q列出ID确认范围。

总结

docker ps看运行中容器,-a含已停止,-q取ID批量处理,--format自定义列,--filter按镜像过滤,docker stats看实时资源。运维先列清单确认状态和端口,再决定停止、重启或排查,避免凭印象操作容器。


emer 发布于  2026-10-19 07:36 

Docker查看本地镜像

Docker查看本地镜像

引言

用Docker跑服务前先确认本地有哪些镜像、大小多少、标签是什么,避免重复拉取或用错版本。docker images系列命令能列出镜像仓库名、标签、ID、大小和创建时间。

列出全部本地镜像

docker images
# 等价
docker image ls

输出REPOSITORY、TAG、IMAGE ID、CREATED、SIZE五列。

只看镜像ID

docker images -q

只输出短ID,配合批量删除使用。

按名称过滤

docker images nginx
docker images | grep php

列出指定仓库名或关键词的镜像。

查看镜像详细信息

docker inspect nginx:latest

JSON输出架构、环境变量、挂载点、默认启动命令等。

查看镜像历史层

docker history nginx:latest

看每层做了什么改动、每层大小,理解镜像分层结构。

过滤和格式化

docker images --format "{{.Repository}}:{{.Tag}} {{.Size}}"

自定义输出列,脚本里取数更方便。

注意事项

  • 同一个镜像不同TAG可能共用层,SIZE不重复累加;
  • 悬空镜像是旧版本残留,用prune清理;
  • 镜像大小是解压后占用,下载压缩包更小;
  • 看磁盘占用用docker system df;
  • 未被任何容器引用的镜像可安全删除;
  • 拉取前先docker images判断是否已存在。

总结

docker images列出本地镜像,-q取ID、按仓库名过滤、inspect看详情、history看分层、--format自定义输出。日常先列镜像确认版本和大小,再决定拉取或删除,配合system df掌握磁盘占用。


emer 发布于  2026-10-19 07:30 

Docker清理悬空镜像

Docker清理悬空镜像

引言

反复build镜像后,旧的无标签镜像()一层层堆积,/var/lib/docker占满磁盘。这些悬空镜像没被任何容器引用,可以安全清理,但要分清悬空、停止容器、无用网络和构建缓存,别一刀切删错。

先看占用

docker system df

查看镜像、容器、卷、构建缓存各占多少,先摸清再动手。

什么是悬空镜像

build出新标签后,旧层变成:,没有标签、不被容器使用,就是dangling悬空镜像。

只清悬空镜像(安全)

docker image prune

只删除无标签无引用的dangling镜像,已打标签和在用镜像不动,最稳妥。

清停止的容器

docker container prune

删掉所有已退出的容器,正在运行的不受影响。

清无用镜像和构建缓存(更彻底)

docker system prune

一次清悬空镜像、停止容器、无用网络和构建缓存,加-a连未被容器使用的镜像也删,加--volumes连未使用卷一起删:

docker system prune -a --volumes

手动删单个镜像

docker image rm 镜像ID

若提示被容器引用,先确认容器用途,别直接强制删。

注意事项

  • 生产慎用-a和--volumes,卷里可能存数据库数据,删了不可恢复;
  • 先docker system df看占用,再决定清哪一类;
  • 清理前确认没有需要保留的停止容器和备份卷;
  • 镜像仓库里还能重新拉取的镜像才适合-a全清;
  • 定期配合定时任务清理,避免磁盘缓慢耗尽。

总结

日常用docker image prune清悬空镜像最安全,docker system prune清停止容器和缓存,-a和--volumes只在确认无保留价值时用。先df看占用、分级清理,避免误删业务卷和在用镜像。


emer 发布于  2026-10-19 07:21 

Docker容器日志查看

Docker容器日志查看

引言

容器启动报错、服务运行异常时,不能进容器盲目找文件,第一时间用docker logs查看标准输出日志。应用把日志打到stdout/stderr,Docker统一收集,是容器排错最常用入口。

基础查看命令

#查看全部日志
docker logs 容器名或ID

#实时跟踪最新日志,类似tail -f
docker logs -f 容器名

#只看最近100行
docker logs --tail 100 容器名

#查看某时间之后日志
docker logs --since 30m 容器名
docker logs --since 2026-10-18T07:00:00 容器名

#带时间戳
docker logs -t 容器名

常用组合

#实时跟踪并显示时间戳、最近50行
docker logs -f -t --tail 50 myapp

排查重启循环、接口报错时,先tail看最后报错,再结合时间过滤。

日志原理

Docker默认把容器标准输出保存到本地json-file驱动,存在宿主机/var/lib/docker/containers目录。应用要把日志输出到控制台,而不是只写容器内文件,才能被docker logs抓到。

日志注意事项

  • 默认json-file不限制大小,长时间运行会占满磁盘,生产配置日志轮转:
    {"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}}
  • 需要长期分析的日志,接入ELK等集中日志系统;
  • 容器删除后默认日志随之丢失;
  • 应用内部业务日志建议挂载到宿主机目录持久化。

总结

docker logs是容器排错第一命令,-f跟踪、--tail取尾部、--since按时间过滤。生产配置大小轮转避免磁盘写满,业务重要日志持久化或集中采集。


emer 发布于  2026-10-18 07:26 

Docker多阶段镜像构建

Docker多阶段镜像构建

引言

直接打包项目代码、编译工具到镜像,镜像体积巨大,部署传输慢。Docker多阶段构建可以在第一阶段编译代码,第二阶段只复制编译后的成品,剔除编译器、源码,大幅度减小镜像大小。

原理

一个Dockerfile可以写多个FROM,每一个FROM代表一个阶段。阶段之间可以复制文件,最终镜像只保留最后一个阶段内容,前面阶段的编译环境不会打包进最终镜像。

示例Dockerfile(PHP项目)

#阶段1:构建
FROM php:8.2-cli AS builder
WORKDIR /app
COPY . .
RUN composer install --no-dev

#阶段2:运行环境
FROM php:8.2-cli-alpine
WORKDIR /app
COPY --from=builder /app .
CMD ["php","index.php"]

最终镜像只有php运行环境加业务代码,没有composer、源码缓存文件。

优势

  • 镜像体积大幅缩小,传输更快;
  • 减少攻击面,镜像内没有编译工具,安全性更高;
  • 只维护单个Dockerfile,构建流程简单。

注意事项

  • 多阶段命名便于阅读;
  • 不要复制不需要的文件,.dockerignore忽略日志、缓存;
  • 区分开发镜像与生产镜像,生产镜像精简。

总结

多阶段构建是容器化部署最佳实践,适合PHP、Go、前端打包等场景,生产环境镜像尽量使用多阶段构建,减小体积提升部署效率。


emer 发布于  2026-10-18 07:16 

Docker常用命令大全,新手必看

前言

Docker现在用得越来越多,但很多新手记不住命令。本文整理了最常用的Docker命令,收藏起来随用随查。

一、镜像相关命令

拉取镜像

docker pull nginx:latest

查看本地镜像

docker images

删除镜像

docker rmi 镜像ID

强制删除镜像

docker rmi -f 镜像ID

搜索镜像

docker search nginx

二、容器相关命令

查看运行中的容器

docker ps

查看所有容器(包括停止的)

docker ps -a

启动容器

docker start 容器名/容器ID

停止容器

docker stop 容器名/容器ID

重启容器

docker restart 容器名/容器ID

删除容器

docker rm 容器名/容器ID

强制删除运行中的容器

docker rm -f 容器名/容器ID

进入容器

docker exec -it 容器名/容器ID /bin/bash

查看容器日志

docker logs 容器名/容器ID

实时查看日志

docker logs -f 容器名/容器ID

查看容器详细信息

docker inspect 容器名/容器ID

查看容器IP

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名

查看容器资源占用

docker stats

三、运行容器

后台运行

docker run -d --name mynginx -p 80:80 nginx

参数解释:

  • -d:后台运行
  • --name:容器名
  • -p:端口映射(宿主端口:容器端口)

运行并进入容器

docker run -it ubuntu /bin/bash

挂载目录

docker run -d -v /host/path:/container/path nginx

环境变量

docker run -e MYSQL_ROOT_PASSWORD=123456 mysql

自动重启

docker run --restart=always -d nginx

四、清理命令

停止所有容器

docker stop $(docker ps -q)

删除所有停止的容器

docker container prune

删除所有未使用的镜像

docker image prune -a

一键清理

docker system prune -a

五、Docker Compose命令

启动

docker-compose up -d

停止

docker-compose down

查看状态

docker-compose ps

查看日志

docker-compose logs -f

重启

docker-compose restart

六、常用场景

运行MySQL

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v /data/mysql:/var/lib/mysql \
  mysql:5.7

运行Nginx

docker run -d \
  --name nginx \
  -p 80:80 \
  -v /www:/usr/share/nginx/html \
  nginx

运行Redis

docker run -d \
  --name redis \
  -p 6379:6379 \
  redis:alpine

七、常见坑

坑1:容器启动后马上退出

原因: 容器没有前台进程。

解决: 加-it或者tail -f /dev/null。

坑2:端口映射不对

问题: 容器里跑的是80端口,映射成了8080:80。

解决: 确认容器内端口和宿主机端口。

坑3:数据丢失

问题: 容器删了数据就没了。

解决: 一定要挂载数据卷-v。

坑4:镜像太大

解决: 用alpine版本,比如redis:alpine。

八、命令速查表

功能 命令
查看运行中容器 docker ps
查看所有容器 docker ps -a
查看镜像 docker images
拉取镜像 docker pull 镜像名
运行容器 docker run -d --name 名字 -p 端口:端口 镜像
进入容器 docker exec -it 名字 /bin/bash
查看日志 docker logs -f 名字
停止容器 docker stop 名字
删除容器 docker rm 名字
删除镜像 docker rmi 镜像ID
清理 docker system prune -a

总结

记住:

  1. docker ps看容器
  2. docker images看镜像
  3. docker run启动容器
  4. docker exec -it进入容器
  5. docker logs -f看日志
  6. docker system prune清理

最常用:

docker ps
docker images
docker exec -it 容器名 /bin/bash
docker logs -f 容器名

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-9 07:53 

Docker容器数据备份和迁移方法

前言

Docker容器删了数据就没了?想把容器从一台服务器迁到另一台?本文讲Docker容器数据备份和迁移的几种方法,包括容器快照、数据卷备份、镜像导出。

一、Docker数据存哪里

Docker数据有两种存法:

  1. 容器内部:数据存在容器的可写层,容器删了数据就没了
  2. 数据卷(Volume):数据存在宿主机上,容器删了数据还在

重要: 生产环境一定要用数据卷,不然容器一删数据全没。

二、方法1:容器快照(commit)

把容器当前状态打包成一个新镜像。

步骤

第一步:查看容器ID

docker ps

找到要备份的容器ID。

第二步:提交成新镜像

docker commit 容器ID 备份镜像名:标签

例子:

docker commit mynginx nginx-backup:v1

第三步:导出镜像成文件

docker save -o nginx-backup.tar nginx-backup:v1

第四步:传到新服务器

scp nginx-backup.tar root@新服务器IP:/root/

第五步:新服务器导入

docker load -i nginx-backup.tar

第六步:新服务器启动容器

docker run -d --name mynginx -p 80:80 nginx-backup:v1

优缺点

优点: 简单,整个容器都打包了
缺点: 镜像文件大,不适合大数据量

三、方法2:数据卷备份

如果用了数据卷,直接备份数据卷里的文件。

步骤

第一步:看数据卷挂载在哪

docker inspect 容器名 | grep Mounts

输出里找 Source,就是宿主机上的路径。

例子:

"Mounts": [
    {
        "Source": "/data/mysql",
        "Destination": "/var/lib/mysql"
    }
]

数据在宿主机的 /data/mysql 目录。

第二步:打包备份

tar -zcvf mysql-backup.tar.gz /data/mysql

第三步:传到新服务器

scp mysql-backup.tar.gz root@新服务器IP:/root/

第四步:新服务器解压

tar -zxvf mysql-backup.tar.gz -C /data/

第五步:新服务器启动容器,挂载数据卷

docker run -d --name mysql -v /data/mysql:/var/lib/mysql -p 3306:3306 mysql:5.7

优缺点

优点: 数据和容器分离,灵活
缺点: 要自己管理数据目录

四、方法3:docker cp拷贝文件

把容器里的文件拷出来。

拷出来

docker cp 容器名:/容器内路径 宿主机路径

例子:

docker cp mynginx:/usr/share/nginx/html /data/backup/html

拷进去

docker cp 宿主机路径 容器名:/容器内路径

例子:

docker cp /data/backup/html/index.html mynginx:/usr/share/nginx/html/

五、MySQL容器备份

备份MySQL数据

docker exec 容器名 mysqldump -uroot -p123456 数据库名 > backup.sql

例子:

docker exec mysql mysqldump -uroot -p123456 test > test.sql

恢复MySQL数据

docker exec -i 容器名 mysql -uroot -p123456 数据库名 < backup.sql

例子:

docker exec -i mysql mysql -uroot -p123456 test < test.sql

六、常见坑

坑1:容器删了数据没了

没用数据卷,容器删了数据全没。

解决: 一定要用 -v 挂载数据卷。

坑2:commit的镜像太大

把整个容器都打包了,包括临时文件。

解决: 尽量用数据卷备份,不要用commit。

坑3:数据权限不对

备份恢复后,容器里读不了数据。

原因: 文件所有者不对。

解决: 改权限:

chown -R 999:999 /data/mysql

(MySQL容器用的是999用户)

坑4:数据库没停就备份

MySQL还在写数据,备份出来不一致。

解决: 用mysqldump逻辑备份,不要直接拷文件。

总结

记住:

  1. 生产环境一定要用数据卷(-v)
  2. 小容器用commit快照备份
  3. 大数据量直接备份数据卷目录
  4. 数据库用mysqldump逻辑备份
  5. 备份完要测试能不能恢复

最常用:

# 备份数据卷
tar -zcvf backup.tar.gz /data/容器数据/

# 恢复数据卷
tar -zxvf backup.tar.gz -C /data/

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-9 07:43 

Docker 常用命令大全

Docker 常用命令大全

Docker 现在开发必备,常用命令一定要熟练。

1. 镜像命令

查看本地镜像:

docker images

搜索镜像:

docker search nginx

拉取镜像:

docker pull nginx:latest

删除镜像:

docker rmi nginx:latest

删除所有镜像:

docker rmi $(docker images -q)

构建镜像:

# 在Dockerfile目录下
docker build -t myapp:1.0 .

2. 容器命令

查看运行中的容器:

docker ps

查看所有容器(包括停止的):

docker ps -a

启动容器:

docker run -d --name mynginx -p 80:80 nginx

参数说明:

  • -d:后台运行
  • --name:容器名
  • -p:端口映射(主机:容器)
  • -v:目录挂载

停止容器:

docker stop mynginx

启动已停止的容器:

docker start mynginx

重启容器:

docker restart mynginx

删除容器:

docker rm mynginx

强制删除运行中的容器:

docker rm -f mynginx

删除所有停止的容器:

docker container prune

3. 进入容器

进入容器命令行:

docker exec -it mynginx /bin/bash

退出容器:

exit

4. 日志查看

查看容器日志:

docker logs mynginx

实时查看日志:

docker logs -f mynginx

查看最近100行日志:

docker logs --tail 100 mynginx

5. 文件操作

从主机复制到容器:

docker cp index.html mynginx:/usr/share/nginx/html/

从容器复制到主机:

docker cp mynginx:/etc/nginx/nginx.conf ./

6. 容器信息

查看容器详情:

docker inspect mynginx

查看容器端口映射:

docker port mynginx

查看容器资源使用:

docker stats

7. 数据卷

创建数据卷:

docker volume create mydata

查看数据卷:

docker volume ls

使用数据卷:

docker run -d -v mydata:/data nginx

8. 网络

查看网络:

docker network ls

创建网络:

docker network create mynet

容器加入网络:

docker network connect mynet mynginx

9. 其他常用

查看Docker版本:

docker version

查看Docker信息:

docker info

清理无用资源:

docker system prune

10. 常用组合

启动一个PHP环境:

docker run -d --name php \
  -p 8080:80 \
  -v /www:/var/www/html \
  php:apache

启动MySQL:

docker run -d --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v /data/mysql:/var/lib/mysql \
  mysql:5.7

启动Redis:

docker run -d --name redis \
  -p 6379:6379 \
  redis:latest

总结

Docker 常用命令要点:

  • docker images 看镜像
  • docker ps 看容器
  • docker run 启动容器
  • docker exec 进入容器
  • docker logs 看日志
  • docker cp 复制文件
  • docker stats 看资源
  • -d 后台运行
  • -p 端口映射
  • -v 目录挂载

Docker 命令熟练了,开发部署效率提升很多。


emer 发布于  2026-10-9 07:33 

Docker 查看容器日志

Docker 查看容器日志

容器出问题怎么排查?先看日志,这些命令要会。

1. 查看容器日志

基本命令

# 查看全部日志
docker logs 容器名

# 查看容器ID
docker logs 容器ID

2. 常用参数

看最后几行

# 最后10行
docker logs --tail 10 容器名

# 最后20行
docker logs --tail 20 容器名

实时跟踪日志(最常用)

docker logs -f 容器名

带时间戳

docker logs -t 容器名

组合使用

# 实时跟踪 + 时间戳 + 最后10行
docker logs -f -t --tail 10 容器名

3. 按时间查看

# 最近10分钟的日志
docker logs --since 10m 容器名

# 最近1小时的日志
docker logs --since 1h 容器名

# 指定时间开始
docker logs --since "2024-01-01T00:00:00" 容器名

4. 多容器日志

docker-compose 查看日志

# 查看所有服务日志
docker-compose logs

# 实时跟踪
docker-compose logs -f

# 查看指定服务
docker-compose logs nginx

# 看最后50行
docker-compose logs --tail 50 nginx

5. 日志持久化

json-file 日志驱动(默认)

  • 日志存在 /var/lib/docker/containers/
  • 单个容器日志文件

配置日志大小限制

# docker-compose.yml
services:
  app:
    image: nginx
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

6. 常见排查场景

1)容器启动失败

docker logs 容器名

看最后几行报错信息。

2)接口报错

docker logs -f --tail 100 容器名

实时看请求日志。

3)查某个时间点的错误

docker logs --since "2024-01-01T10:00:00" 容器名 | grep "error"

7. 日志清理

清理单个容器日志

# 找到日志文件
sudo find /var/lib/docker/containers/ -name "*.log"

# 清空日志
sudo sh -c "echo > /var/lib/docker/containers/容器ID/容器ID-json.log"

重启容器自动清理

docker restart 容器名

总结

Docker 查看容器日志要点:

  • docker logs 查看日志
  • -f 实时跟踪最常用
  • --tail 看最后几行
  • -t 带时间戳
  • --since 按时间查
  • docker-compose logs 多容器
  • 配置日志大小防止占满磁盘
  • 排查问题先看日志

容器运维,看日志是第一步。


emer 发布于  2026-10-9 07:18 

Docker容器自动重启,restart=always参数

前言

服务器重启了,Docker容器没跟着起来?或者容器崩了,不自动重启?本文讲怎么配置自动重启。

一、restart参数

Docker用 --restart 参数控制容器的重启策略。

四种策略

策略 说明
no 不自动重启(默认)
on-failure 非正常退出时重启
always 总是自动重启
unless-stopped 除非手动停了,否则一直重启

二、always策略

用法

docker run -d --name nginx --restart=always nginx

什么时候会重启

  1. 容器崩了(非正常退出)
  2. Docker服务重启
  3. 服务器重启(只要Docker开机自启)

特点

  • 不管什么原因停了,都会自动起来
  • 服务器重启后也会自动启动

三、unless-stopped策略

用法

docker run -d --name nginx --restart=unless-stopped nginx

和always的区别

  • always:就算你手动停了,重启Docker后还是会起来
  • unless-stopped:如果你手动停了,重启Docker后就不起来了

推荐用unless-stopped,更灵活。

四、on-failure策略

用法

docker run -d --name nginx --restart=on-failure:5 nginx

说明

  • 只有非正常退出时才重启
  • :5 表示最多重启5次,超过就不重启了

什么时候用

比如批处理任务,失败了重试几次,一直失败就算了。

五、no策略(默认)

docker run -d --name nginx --restart=no nginx

不自动重启,停了就停了。

六、修改已有容器的重启策略

运行中的容器

docker update --restart=always 容器名

不用删容器,直接改。

例子

docker update --restart=always nginx
docker update --restart=unless-stopped mysql

七、Docker Compose里的配置

services:
  nginx:
    image: nginx
    restart: always

或者:

restart: unless-stopped

八、服务器开机自启

1. Docker服务开机自启

systemctl enable docker

2. 容器开机自启

只要容器设了 --restart=always 或 unless-stopped,Docker启动后容器就会自动启动。

验证

重启服务器试试:

reboot

重启完看看容器起来没:

docker ps

九、查看重启策略

docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' 容器名

输出:

always

十、常见坑

坑1:设了always,服务器重启后没起来

原因: Docker服务没设开机自启。

解决:

systemctl enable docker

坑2:手动停了,又自动起来了

用了 always 策略,手动停了也会起来。

解决: 想彻底停掉:

docker update --restart=no 容器名
docker stop 容器名

坑3:一直重启,死循环

容器启动就崩,崩了又重启,死循环。

检查:

docker logs 容器名

看看为什么启动失败,先把问题修了。

坑4:on-failure重启次数

--restart=on-failure:5

最多重启5次,超过就不重启了。

注意: 这个5是次数,不是间隔。

十一、推荐配置

生产环境推荐

docker run -d \
  --name nginx \
  --restart=unless-stopped \
  -p 80:80 \
  nginx
  • 服务器重启自动起来
  • 手动停了就不自动起
  • 灵活

数据库推荐

docker run -d \
  --name mysql \
  --restart=unless-stopped \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v /data/mysql:/var/lib/mysql \
  mysql:5.7

总结

记住:

  1. --restart=always 总是自动重启
  2. --restart=unless-stopped 推荐,手动停了不自动起
  3. 改已有容器:docker update --restart=xxx 容器名
  4. 服务器开机自启要先 systemctl enable docker

最常用:

docker run -d --name nginx --restart=unless-stopped nginx

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:28 

Docker网络模式详解,bridge、host、none

前言

Docker容器怎么联网的?bridge、host、none这些网络模式啥区别?本文一次讲清楚。

一、Docker网络模式

Docker有5种网络模式:

  1. bridge:默认模式,桥接网络
  2. host:主机网络,和宿主机共用
  3. none:无网络
  4. container:和另一个容器共用网络
  5. 自定义网络:自己建的网络

二、bridge模式(默认)

是什么

Docker默认的网络模式。每个容器有自己的虚拟网络,通过docker0网桥和宿主机通信。

特点

  • 每个容器有自己的IP
  • 容器之间可以通过容器名互相访问
  • 外部要访问容器,要靠 -p 端口映射

用法

docker run -d --name nginx -p 80:80 nginx

没指定 --network,默认就是bridge。

容器之间通信

docker run -d --name mysql mysql:5.7
docker run -d --name web --link mysql nginx

或者用自定义网络,容器名直接解析:

docker network create mynet
docker run -d --name mysql --network mynet mysql:5.7
docker run -d --name web --network mynet nginx

web容器里直接用 mysql 这个主机名就能连数据库。

三、host模式

是什么

容器直接用宿主机的网络,没有自己的虚拟网卡。

特点

  • 没有独立IP,和宿主机共用
  • 不用 -p 映射,直接用宿主机的端口
  • 性能最好,因为少了一层网络转发
  • 安全性差点,容器直接暴露在宿主机网络上

用法

docker run -d --name nginx --network host nginx

注意

host模式下,-p 参数无效。容器用什么端口,直接就是宿主机的端口。

比如Nginx监听80,宿主机的80就被占了。

四、none模式

是什么

容器没有网络,完全断网。

特点

  • 没有网卡,没有IP
  • 只能通过localhost访问
  • 适合不需要联网的任务,比如批量处理文件

用法

docker run -d --name test --network none nginx

查看

docker exec test ip addr

只能看到lo回环网卡。

五、container模式

是什么

新创建的容器和一个已有的容器共用网络。

特点

  • 两个容器共用同一个网络命名空间
  • 用 127.0.0.1 就能互相访问
  • 适合一个应用拆成多个容器的场景

用法

# 先跑一个web容器
docker run -d --name web nginx

# 再跑一个sidecar容器,和web共用网络
docker run -d --name sidecar --network container:web busybox

sidecar容器里 127.0.0.1 就是web容器的localhost。

六、自定义网络

创建网络

docker network create mynet

使用网络

docker run -d --name mysql --network mynet mysql:5.7
docker run -d --name redis --network mynet redis

好处

  • 容器名自动解析,不用写IP
  • 网络隔离,不同网络的容器不能互相访问
  • 更灵活

查看网络

docker network ls

查看网络详情

docker network inspect mynet

七、常用命令

查看容器网络模式

docker inspect -f '{{.HostConfig.NetworkMode}}' 容器名

查看容器IP

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名

查看所有网络

docker network ls

删除网络

docker network rm mynet

八、常见场景选什么模式

场景1:跑Web服务,要外网访问

选bridge,用 -p 映射端口。

场景2:追求高性能,比如数据库

选host,少一层转发,性能好。

场景3:不需要联网的任务

选none,安全。

场景4:两个容器紧耦合

选container,共用网络。

场景5:多容器编排

选自定义网络,容器名自动解析。

九、常见坑

坑1:容器之间ping不通

bridge模式下,容器之间默认是通的,但如果用了none就不通。

检查: 网络模式是什么?

docker inspect 容器名 | grep NetworkMode

坑2:host模式下端口冲突

host模式直接用宿主机端口,端口被占了就起不来。

检查: 宿主机端口有没有被占。

坑3:容器名解析不了

默认bridge网络不支持容器名解析。

解决: 用自定义网络。

坑4:改了网络模式,要重新建容器

网络模式是容器创建时定的,不能改。

解决: 删掉容器重新跑。

总结

记住:

  1. bridge:默认,端口映射,常用
  2. host:共用宿主机网络,性能好
  3. none:断网,安全
  4. container:和别的容器共用网络
  5. 自定义网络:容器名自动解析,推荐

最常用:

docker network create mynet
docker run -d --name nginx --network mynet nginx

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:27 

Docker运行Nginx,挂载配置文件和网页

前言

用Docker跑Nginx,想改网站文件、改配置,每次进容器里改太麻烦。挂载出来就方便多了。本文讲怎么挂载网页和配置文件。

一、基本运行

最简单的跑法

docker run -d --name nginx -p 80:80 nginx

问题: 网站文件和配置都在容器里,改起来不方便。

二、挂载网页目录

完整命令

docker run -d \
  --name nginx \
  -p 80:80 \
  -v /data/www:/usr/share/nginx/html \
  nginx

解释

  • 宿主机 /data/www 目录
  • 容器里 /usr/share/nginx/html 目录

这样直接在宿主机改网页文件,刷新浏览器就生效了。

测试

在宿主机创建index.html:

echo "<h1>Hello Docker Nginx</h1>" > /data/www/index.html

浏览器访问:

http://服务器IP

就能看到了。

三、挂载配置文件

1. 先从容器里拷出默认配置

docker run -d --name nginx nginx
docker cp nginx:/etc/nginx/nginx.conf /data/nginx/nginx.conf
docker cp nginx:/etc/nginx/conf.d /data/nginx/conf.d
docker rm -f nginx

2. 挂载配置文件

docker run -d \
  --name nginx \
  -p 80:80 \
  -v /data/www:/usr/share/nginx/html \
  -v /data/nginx/nginx.conf:/etc/nginx/nginx.conf \
  -v /data/nginx/conf.d:/etc/nginx/conf.d \
  nginx

3. 改配置

直接在宿主机改 /data/nginx/conf.d/default.conf,改完重载:

docker exec nginx nginx -s reload

四、挂载日志

docker run -d \
  --name nginx \
  -p 80:80 \
  -v /data/www:/usr/share/nginx/html \
  -v /data/nginx/logs:/var/log/nginx \
  nginx

日志直接在宿主机看:

tail -f /data/nginx/logs/access.log

五、Docker Compose完整配置

version: '3'
services:
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /data/www:/usr/share/nginx/html
      - /data/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /data/nginx/conf.d:/etc/nginx/conf.d
      - /data/nginx/logs:/var/log/nginx

启动:

docker-compose up -d

六、常用操作

重载配置

改了配置文件后:

docker exec nginx nginx -s reload

查看日志

docker logs nginx
# 实时看
docker logs -f nginx

进容器

docker exec -it nginx sh

七、常见坑

坑1:挂载后网站403

原因: 宿主机目录权限不对。

解决:

chmod -R 755 /data/www
chown -R nginx:nginx /data/www

坑2:改了配置不生效

原因: 没重载配置。

解决:

docker exec nginx nginx -s reload

坑3:挂载文件不存在,变成目录

-v /data/nginx.conf:/etc/nginx/nginx.conf

如果 /data/nginx.conf 不存在,Docker会自动建一个叫nginx.conf的目录。

解决: 先创建文件:

touch /data/nginx.conf

坑4:端口被占用

80端口被宿主机的Nginx占了。

解决: 停掉宿主机的Nginx,或者换端口。

坑5:改了代码不生效

如果用了CDN或者浏览器缓存,强刷一下(Ctrl+F5)。

八、多站点配置

在 /data/nginx/conf.d/ 下建多个配置文件:

/data/nginx/conf.d/
├── site1.conf
├── site2.conf
└── default.conf

site1.conf:

server {
    listen 80;
    server_name site1.com;
    root /data/www/site1;
    index index.html;
}

改完重载:

docker exec nginx nginx -s reload

九、HTTPS配置

挂载证书:

docker run -d \
  --name nginx \
  -p 80:80 \
  -p 443:443 \
  -v /data/www:/usr/share/nginx/html \
  -v /data/nginx/conf.d:/etc/nginx/conf.d \
  -v /data/ssl:/etc/nginx/ssl \
  nginx

配置文件里引用证书:

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
    root /data/www;
}

总结

记住:

  1. 挂载网页目录:-v /data/www:/usr/share/nginx/html
  2. 挂载配置文件:-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf
  3. 挂载日志:-v /data/nginx/logs:/var/log/nginx
  4. 改完配置重载:docker exec nginx nginx -s reload

最常用:

docker run -d --name nginx -p 80:80 \
  -v /data/www:/usr/share/nginx/html \
  -v /data/nginx/conf.d:/etc/nginx/conf.d \
  nginx

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:25 

Docker运行MySQL,数据持久化配置

前言

用Docker跑MySQL,删了容器数据就没了?那是没挂数据卷。本文讲怎么用Docker跑MySQL并持久化数据。

一、基本运行

最简单的跑法

docker run -d \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:5.7

问题: 删了容器,数据库里的数据全没了。

二、加数据卷持久化

完整命令

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v /data/mysql:/var/lib/mysql \
  mysql:5.7

解释

  • -p 3306:3306 端口映射
  • -e MYSQL_ROOT_PASSWORD=123456 设置root密码
  • -v /data/mysql:/var/lib/mysql 数据卷挂载
    • 宿主机 /data/mysql 目录
    • 容器里 /var/lib/mysql 目录

这样容器删了,数据还在宿主机上。

三、其他常用配置

1. 设置字符集

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v /data/mysql:/var/lib/mysql \
  -v /data/mysql/my.cnf:/etc/mysql/conf.d/my.cnf \
  mysql:5.7 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci

2. 创建数据库和用户

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_DATABASE=mydb \
  -e MYSQL_USER=myuser \
  -e MYSQL_PASSWORD=123456 \
  -v /data/mysql:/var/lib/mysql \
  mysql:5.7

3. 挂载配置文件

先在宿主机创建my.cnf:

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
max_connections=1000

然后挂载:

docker run -d \
  --name mysql \
  -v /data/mysql/my.cnf:/etc/mysql/conf.d/my.cnf \
  -v /data/mysql:/var/lib/mysql \
  mysql:5.7

四、Docker Compose方式

version: '3'
services:
  mysql:
    image: mysql:5.7
    container_name: mysql
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: mydb
    volumes:
      - /data/mysql:/var/lib/mysql
      - /data/mysql/my.cnf:/etc/mysql/conf.d/my.cnf

启动:

docker-compose up -d

五、连接MySQL

进入容器连接

docker exec -it mysql mysql -uroot -p123456

从宿主机连接

mysql -h127.0.0.1 -P3306 -uroot -p123456

用Navicat等工具

  • 主机:服务器IP
  • 端口:3306
  • 用户名:root
  • 密码:123456

六、备份和恢复

备份数据库

docker exec mysql mysqldump -uroot -p123456 mydb > /data/backup/mydb.sql

恢复数据库

docker exec -i mysql mysql -uroot -p123456 mydb < /data/backup/mydb.sql

七、常见坑

坑1:密码不对

报错:

Access denied for user 'root'@'localhost'

检查: 环境变量 MYSQL_ROOT_PASSWORD 设了没?

坑2:权限问题

宿主机 /data/mysql 目录权限不对:

chmod -R 777 /data/mysql

坑3:端口被占用

3306端口被宿主机的MySQL占了:

Bind for 0.0.0.0:3306 failed: port is already allocated

解决: 换个端口:

-p 3307:3306

坑4:数据没持久化

没加 -v 挂载,删了容器数据就没了。

检查: 有没有 -v /data/mysql:/var/lib/mysql?

坑5:第一次启动慢

MySQL第一次启动要初始化数据,要等个十几秒。

等不及就先别连,过一会再试。

坑6:字符集不对,中文乱码

加参数:

--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

八、推荐配置

docker run -d \
  --name mysql \
  --restart=always \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=你的密码 \
  -v /data/mysql:/var/lib/mysql \
  -v /data/mysql/my.cnf:/etc/mysql/conf.d/my.cnf \
  mysql:5.7
  • --restart=always 开机自动启动
  • 数据挂载到 /data/mysql
  • 配置文件挂载

总结

记住:

  1. 一定要挂数据卷,不然删容器数据就没了
  2. 用 -e MYSQL_ROOT_PASSWORD 设密码
  3. 用 -p 3306:3306 映射端口
  4. 配置文件也可以挂载进去

最常用:

docker run -d --name mysql -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v /data/mysql:/var/lib/mysql \
  mysql:5.7

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:24 

Dockerfile编写教程,构建自己的镜像

前言

想用Docker跑自己的项目,不能每次都手动装环境吧?写个Dockerfile,一键构建镜像。本文讲怎么写Dockerfile。

一、什么是Dockerfile

Dockerfile就是一个文本文件,里面写了怎么构建镜像的步骤。

就像写脚本一样,告诉Docker:

  1. 基于哪个基础镜像
  2. 装什么软件
  3. 复制什么文件
  4. 启动什么命令

二、基本结构

# 基于哪个镜像
FROM nginx:alpine

# 维护者信息
MAINTAINER yourname <email@xx.com>

# 工作目录
WORKDIR /usr/share/nginx/html

# 复制文件
COPY index.html .

# 暴露端口
EXPOSE 80

# 启动命令
CMD ["nginx", "-g", "daemon off;"]

三、常用指令

FROM:基础镜像

FROM nginx:alpine
FROM php:7.4-fpm
FROM mysql:5.7

WORKDIR:工作目录

WORKDIR /app

后面的命令都在这个目录里执行。

COPY:复制文件

COPY index.html /usr/share/nginx/html/
COPY ./src /app

RUN:构建时执行命令

RUN apt-get update && apt-get install -y vim

构建镜像的时候执行。

CMD:容器启动时执行

CMD ["nginx", "-g", "daemon off;"]

容器启动后跑的命令。

EXPOSE:暴露端口

EXPOSE 80
EXPOSE 443

只是声明,实际用的时候还要用-p映射。

ENV:设置环境变量

ENV MYSQL_ROOT_PASSWORD=123456
ENV APP_ENV=production

VOLUME:数据卷

VOLUME ["/var/lib/mysql"]

四、实战例子

例子1:部署静态网站

FROM nginx:alpine

WORKDIR /usr/share/nginx/html

COPY index.html .
COPY about.html .

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

例子2:部署PHP项目

FROM php:7.4-fpm

WORKDIR /var/www/html

COPY . .

RUN docker-php-ext-install mysqli pdo pdo_mysql

EXPOSE 9000

CMD ["php-fpm"]

例子3:Python应用

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python", "app.py"]

五、构建镜像

构建命令

docker build -t mynginx:v1 .
  • -t 给镜像起名字和标签
  • . 当前目录找Dockerfile

查看构建过程

docker build --progress=plain -t mynginx:v1 .

指定Dockerfile路径

docker build -f docker/Dockerfile -t mynginx:v1 .

六、常用优化技巧

1. 用小镜像

用alpine版本,小很多:

FROM nginx:alpine

2. 合并RUN命令

RUN apt-get update && \
    apt-get install -y vim wget && \
    rm -rf /var/lib/apt/lists/*

不要写多个RUN,合并成一个,减少层数。

3. .dockerignore文件

不想复制的文件写在.dockerignore里:

.git
node_modules
*.log

4. 多层缓存

把不变的放前面,变的放后面。

# 先复制requirements.txt,装依赖(这个不常变)
COPY requirements.txt .
RUN pip install -r requirements.txt

# 再复制代码(这个常变)
COPY . .

七、常见坑

坑1:Dockerfile文件名不对

必须叫 Dockerfile,首字母大写,没有后缀。

坑2:构建时找不到文件

docker build -t mynginx:v1 .

最后那个点不能少,是构建上下文。

坑3:COPY路径不对

COPY index.html .

这个路径是相对于构建上下文的,不是Dockerfile所在目录。

坑4:CMD和RUN搞混

  • RUN 是构建镜像的时候跑
  • CMD 是容器启动的时候跑

坑5:镜像太大

用alpine版本,或者多阶段构建。

八、多阶段构建

# 构建阶段
FROM node:16 AS build
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
RUN npm run build

# 生产阶段
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80

这样最终镜像很小,只有编译后的文件。

总结

记住:

  1. FROM 基础镜像
  2. WORKDIR 工作目录
  3. COPY 复制文件
  4. RUN 构建时执行
  5. CMD 启动时执行
  6. docker build -t 名字 . 构建镜像

最常用:

FROM nginx:alpine
COPY index.html /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:23 

Docker查看容器资源占用,stats命令

前言

容器跑多了,哪个占CPU、哪个占内存,一眼看出来。本文讲Docker stats命令。

一、基本用法

查看所有运行中的容器

docker stats

输出:

CONTAINER ID   NAME       CPU %   MEM USAGE / LIMIT   MEM %   NET I/O   BLOCK I/O   PIDS
a1b2c3d4e5f6   mysql      2.50%   500MiB / 2GiB       25.0%   1MB/2MB   10MB/5MB    30
f7e8d9c0b1a2   nginx      0.10%   20MiB / 2GiB        1.0%    5MB/3MB   1MB/0B      5

列解释

  • CPU %:CPU使用率
  • MEM USAGE / LIMIT:内存使用 / 内存限制
  • MEM %:内存使用率
  • NET I/O:网络收发流量
  • BLOCK I/O:磁盘读写
  • PIDS:进程数

二、查看单个容器

docker stats 容器名

只看某一个容器。

三、只看一次,不刷新

默认是实时刷新的,按Ctrl+C退出。

只看一次:

docker stats --no-stream

四、自定义格式

只看CPU和内存

docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

JSON格式输出

docker stats --format json --no-stream

五、其他常用命令

查看容器占用磁盘

docker system df

查看单个容器磁盘占用

docker ps -s

看SIZE列,就是容器写的磁盘大小。

查看容器网络IO

docker stats --no-stream

看NET I/O列。

六、常见场景

场景1:哪个容器占CPU高?

docker stats

看CPU %列,高的那个就是。

场景2:哪个容器占内存高?

看MEM USAGE列。

场景3:某个容器网络流量大

看NET I/O列。

七、限制容器资源

跑的时候可以限制CPU和内存:

限制内存512M

docker run -d --memory 512m nginx

限制CPU 0.5核

docker run -d --cpus 0.5 nginx

同时限制

docker run -d \
  --memory 512m \
  --cpus 0.5 \
  nginx

八、常见坑

坑1:stats一直刷新,退不出来

按Ctrl+C退出。

坑2:看不准CPU使用率

Docker stats显示的是CPU使用率百分比,多核的话可能超过100%(比如4核跑满就是400%)。

坑3:内存看的是驻留内存

MEM USAGE是容器实际用的内存,包括缓存。

坑4:容器挂了,stats看不到了

docker stats

只看运行中的容器,停止的看不到。

总结

记住:

  1. docker stats 看所有运行中的容器资源占用
  2. 看CPU、内存、网络、磁盘IO
  3. --no-stream 只看一次
  4. 跑容器时可以限制资源

最常用:

docker stats

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:22 

Docker删除所有停止的容器,一键清理

前言

用Docker久了,一堆停止的容器占磁盘,一个个删太麻烦。本文讲怎么一键清理。

一、查看所有停止的容器

先看看有多少个停止的容器:

docker ps -a

看STATUS列,显示Exited的就是停止的。

只看停止的:

docker ps -a -f status=exited

二、删除所有停止的容器

一键清理

docker container prune

输出:

Total reclaimed space: 1.2GB

直接删掉所有停止的容器。

确认提示

默认会问你:

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N]

输入y确认。

跳过确认

docker container prune -f

加个 -f 直接删,不问。

三、其他清理命令

删除所有没用的镜像

docker image prune

只删悬空镜像(dangling images),就是没有标签的。

删所有没用的镜像(包括没在用的)

docker image prune -a

清理所有没用的东西

docker system prune

包括:

  • 停止的容器
  • 没用的网络
  • 悬空镜像
  • 构建缓存

清理所有没用的东西(包括镜像)

docker system prune -a

连没在用的镜像也删了。

清理数据卷

docker volume prune

注意: 这个会删没用的数据卷,里面的数据也没了!

四、手动删除单个容器

如果只想删某一个:

docker rm 容器ID或名字

强制删除运行中的容器:

docker rm -f 容器ID或名字

五、批量删除停止的容器

方法1:用docker rm

docker rm $(docker ps -a -q -f status=exited)

解释:

  • docker ps -a -q 列出所有容器ID
  • -f status=exited 只筛停止的
  • docker rm 删掉

方法2:用docker container prune

docker container prune -f

推荐用这个,简单。

六、查看磁盘占用

清理之前看看占了多少:

docker system df

输出:

TYPE            TOTAL   ACTIVE  SIZE    RECLAIMABLE
Images          20      5       10GB    7GB (70%)
Containers      15      5       500MB   400MB (80%)
Local Volumes   8       3       2GB     1GB (50%)
Build Cache     -       -       1GB     800MB

看RECLAIMABLE列,就是可以回收的。

七、常见场景

场景1:测试完一堆容器,想全清了

docker container prune -f

场景2:磁盘满了,全面清理

docker system prune -a -f --volumes
  • -a 删所有没用的镜像
  • -f 不问
  • --volumes 连数据卷也删

注意: 这个很猛,数据卷也删了,重要数据先备份!

场景3:只清理镜像,不动容器

docker image prune -a -f

八、常见坑

坑1:删了数据卷,数据没了

docker system prune --volumes

加了 --volumes 会删没用的数据卷。

注意: 数据库的数据卷别删!

坑2:删了镜像,重新拉要很久

docker image prune -a

把所有没在用的镜像都删了,下次用还要重新拉。

建议: 常用镜像留着,别全删。

坑3:误删了运行中的容器?

docker container prune 只删停止的,运行中的删不了。

放心,安全。

坑4:删了容器,数据卷还在

docker rm 容器名

只删容器,数据卷还在。

想连数据卷一起删:

docker rm -v 容器名

九、定期清理脚本

写个脚本,定期清理:

#!/bin/bash
# 清理停止的容器
docker container prune -f
# 清理悬空镜像
docker image prune -f
# 清理没用的网络
docker network prune -f

加到crontab,每周跑一次:

0 3 * * 0 /home/clean-docker.sh

总结

记住:

  1. docker container prune 删所有停止的容器
  2. docker image prune -a 删所有没用的镜像
  3. docker system prune 全面清理
  4. 删数据卷要小心,别把数据库删了

最常用:

docker container prune -f

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:21 

Docker数据卷挂载,容器数据持久化

前言

删了Docker容器,数据全没了?那是因为你没挂数据卷。本文讲怎么用数据卷让容器数据持久化。

一、为什么需要数据卷

容器里的数据,容器删了就没了。

docker run -d --name mysql mysql:5.7
# 删了容器,数据就没了
docker rm -f mysql

解决: 把数据存到宿主机,容器删了数据还在。

二、三种数据持久化方式

1. 绑定挂载(bind mount)

把宿主机的目录直接挂到容器里。

docker run -v /宿主机路径:/容器路径 镜像名

例子:

docker run -d \
  -v /data/mysql:/var/lib/mysql \
  mysql:5.7

特点: 简单直接,数据在你自己的目录里。

2. 命名卷(named volume)

Docker管理的数据卷。

docker volume create mydata
docker run -v mydata:/var/lib/mysql mysql:5.7

特点: Docker帮你管理位置,不用你关心存在哪。

3. 临时挂载(tmpfs)

存在内存里,重启就没。

docker run --tmpfs /tmp 镜像名

特点: 临时用,存敏感数据。

三、常用场景

场景1:MySQL数据持久化

docker run -d \
  --name mysql \
  -v /data/mysql:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:5.7

场景2:Nginx挂载网站文件

docker run -d \
  --name nginx \
  -v /data/www:/usr/share/nginx/html \
  -p 80:80 \
  nginx

场景3:挂载配置文件

docker run -d \
  -v /data/nginx/nginx.conf:/etc/nginx/nginx.conf \
  nginx

场景4:挂载日志

docker run -d \
  -v /data/logs/nginx:/var/log/nginx \
  nginx

四、Docker Compose里的挂载

services:
  mysql:
    image: mysql:5.7
    volumes:
      - /data/mysql:/var/lib/mysql
      # 或者用命名卷
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

五、常用命令

查看所有数据卷

docker volume ls

查看数据卷详情

docker volume inspect 数据卷名

删除没用的数据卷

docker volume prune

查看容器挂载

docker inspect -f '{{.Mounts}}' 容器名

六、只读挂载

只想让容器读,不让写:

docker run -v /data/www:/usr/share/nginx/html:ro nginx

后面加个 :ro 就是只读。

七、常见坑

坑1:改了配置文件不生效

挂了配置文件,改了宿主机的文件,重启容器还是旧的。

原因: 容器没真正重启。

解决:

docker restart 容器名

坑2:权限问题

挂载的目录,容器里的用户读不了。

原因: 宿主机目录权限不对。

解决:

chmod -R 777 /data/mysql

坑3:Windows/Mac路径问题

Windows路径写法不一样:

docker run -v D:\data:/var/lib/mysql mysql

Mac/Linux用:

docker run -v /Users/xxx/data:/var/lib/mysql mysql

坑4:挂载文件不存在

宿主机的文件不存在,Docker会自动建一个目录。

比如:

docker run -v /data/nginx.conf:/etc/nginx/nginx.conf nginx

如果 /data/nginx.conf 不存在,Docker会建一个叫 nginx.conf 的目录,容器里就挂错了。

解决: 先创建文件:

touch /data/nginx.conf

坑5:数据卷删了数据就没了

docker volume rm mydata

数据卷删了,里面的数据也没了。

解决: 重要数据定期备份。

八、最佳实践

  1. 数据库一定要挂载数据卷,不然容器删了数据就没了
  2. 配置文件挂载到宿主机,改起来方便
  3. 日志挂载到宿主机,方便查看和切割
  4. 网站文件挂载到宿主机,更新代码不用重新打镜像

总结

记住:

  1. -v 宿主机路径:容器路径 就是挂载
  2. 数据库一定要挂数据卷
  3. 删容器不删数据,因为数据在宿主机
  4. 挂载文件不存在会变成目录,要注意

最常用:

docker run -v /data/mysql:/var/lib/mysql mysql

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:19 

Docker端口映射,-p参数用法详解

前言

容器跑起来了,但外部访问不了,就是端口没映射好。本文讲Docker端口映射的各种用法。

一、什么是端口映射

Docker容器有自己的内部网络,外部要访问容器里的服务,得把宿主机的端口映射到容器的端口。

二、基本用法

格式

-p 宿主机端口:容器端口

例子

docker run -d -p 8080:80 nginx

意思:访问宿主机的8080端口,转发到容器的80端口。

浏览器访问

http://服务器IP:8080

三、各种写法

1. 指定宿主机端口和容器端口

-p 8080:80

2. 只指定容器端口,宿主机随机分配

docker run -d -P nginx

大写P,宿主机随机找个空闲端口。

3. 绑定指定IP

-p 127.0.0.1:8080:80

只允许本机访问,外网访问不了。

4. UDP端口

-p 53:53/udp

5. 映射多个端口

docker run -d \
  -p 80:80 \
  -p 443:443 \
  -p 2222:22 \
  nginx

四、查看端口映射

查看容器端口

docker port 容器名

输出:

80/tcp -> 0.0.0.0:8080

查看详细信息

docker ps

看PORTS列。

五、Docker Compose里的端口映射

services:
  nginx:
    image: nginx
    ports:
      - "80:80"
      - "443:443"
      - "127.0.0.1:8080:80"

六、常见场景

场景1:跑Nginx

docker run -d -p 80:80 --name mynginx nginx

场景2:跑MySQL

docker run -d -p 3306:3306 --name mysql \
  -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

场景3:跑Redis

docker run -d -p 6379:6379 --name redis redis

场景4:多个容器跑同一个端口

比如跑两个Nginx,分别用不同端口:

docker run -d -p 8081:80 --name nginx1 nginx
docker run -d -p 8082:80 --name nginx2 nginx

七、端口被占用怎么办

报错

Bind for 0.0.0.0:80 failed: port is already allocated

查谁占用了80端口

netstat -tlnp | grep :80
# 或者
lsof -i:80

解决

  1. 换个端口:-p 8080:80
  2. 或者把占用端口的程序关掉

八、端口映射的坑

坑1:只映射了容器端口,没映射宿主机端口

docker run -d -p 80 nginx

这样宿主机随机分配端口,不好记。

坑2:防火墙没开

端口映射了,但防火墙挡了,外网还是访问不了。

解决: 开放端口:

firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload

坑3:改不了端口映射

容器启动后,想改端口映射,改不了。

解决: 删掉容器重新跑。容器数据用卷挂载了就不怕丢。

坑4:绑定127.0.0.1后外网访问不了

-p 127.0.0.1:8080:80

这个只能本机访问,外网访问不了。

原因: 故意绑的本机。

解决: 改成 0.0.0.0:8080:80 或者直接 8080:80。

总结

记住:

  1. 基本格式:-p 宿主机端口:容器端口
  2. 多个端口就写多个 -p
  3. 端口被占用就换一个
  4. 防火墙也要开

常用:

docker run -d -p 80:80 --name nginx nginx

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:18 

Docker进入容器内部,exec和attach区别

前言

要进容器里改配置、看日志,用什么命令?docker exec和docker attach有什么区别?本文讲清楚。

一、docker exec(推荐)

作用

在运行中的容器里开一个新进程。

进入容器

docker exec -it 容器名 /bin/bash

或者:

docker exec -it 容器名 sh

参数说明

参数 说明
-i 保持交互
-t 分配终端
-it 合起来用

退出

输入 exit 或者按 Ctrl+D。

关键: 退出后容器还在运行,不受影响。

执行单个命令

不进交互模式,直接执行命令:

docker exec 容器名 ls /var/www/html
docker exec 容器名 cat /etc/nginx/nginx.conf
docker exec 容器名 php -v

二、docker attach

作用

连接到容器正在运行的主进程。

用法

docker attach 容器名

危险!

退出会导致容器停止!

按 Ctrl+C 退出后,容器就停了。

怎么安全退出

按 Ctrl+P 然后 Ctrl+Q,这样退出不会停容器。

三、exec和attach区别

对比 exec attach
原理 开新进程 连接主进程
退出后容器 继续运行 会停止
常用场景 进容器操作 看主进程输出
推荐度 推荐 不推荐

记住: 日常用exec,别用attach。

四、常见场景

场景1:进容器改配置

docker exec -it mynginx /bin/bash

场景2:在容器里执行PHP命令

docker exec myphp php artisan migrate

场景3:看容器里的日志文件

docker exec mynginx tail -f /var/log/nginx/access.log

场景4:容器里没bash

有些精简镜像没有bash,用sh:

docker exec -it 容器名 sh

场景5:以root用户进入

docker exec -u root -it 容器名 /bin/bash

五、如果容器没bash怎么办

用nsenter

# 先拿容器PID
PID=$(docker inspect --format "{{.State.Pid}}" 容器名)

# 进入
nsenter --target $PID --mount --uts --ipc --net --pid

或者用docker run

用同一个镜像开个交互式容器:

docker run -it --rm 镜像名 /bin/bash

六、常用命令汇总

命令 说明
docker exec -it 容器名 /bin/bash 进容器
docker exec 容器名 命令 执行命令
docker exec -u root -it 容器名 /bin/bash 以root进
docker attach 容器名 连接主进程(慎用)

常见坑

坑1:attach退出后容器停了

用attach进去,按Ctrl+C退出,容器就停了。

解决: 用exec,或者Ctrl+P Ctrl+Q退出。

坑2:进容器报/ bin/bash not found

镜像里没有bash。

解决: 用sh:

docker exec -it 容器名 sh

坑3:进容器报permission denied

不是root用户,权限不够。

解决: 加 -u root:

docker exec -u root -it 容器名 /bin/bash

坑4:exec进不去,说容器没运行

容器停了,exec进不去。

解决: 先启动容器:

docker start 容器名
docker exec -it 容器名 /bin/bash

坑5:多个终端连同一个容器

exec可以开多个终端,互不影响。

这是exec比attach好的地方,attach只能连一个。

总结

记住两点:

  1. 日常用 docker exec -it 容器名 /bin/bash
  2. 别用attach,退出会把容器搞停

补充: 精简镜像没有bash,用sh代替。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:17 
'); })();