Docker查看容器IP,docker inspect命令

前言

容器之间要互相通信,得知道容器的IP。本文讲怎么用docker inspect查看容器IP和详细信息。

一、查看容器IP

最简单的方法

docker inspect 容器名

输出一大串JSON,找IPAddress字段。

只看IP

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

直接输出IP地址,比如:172.17.0.2

查看所有运行中容器的IP

docker ps -q | xargs docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'

输出:

/mynginx - 172.17.0.2
/mymysql - 172.17.0.3
/myphp - 172.17.0.4

二、docker inspect常用用法

查看容器挂载

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

查看容器启动命令

docker inspect -f '{{.Config.Cmd}}' 容器名

查看容器环境变量

docker inspect -f '{{.Config.Env}}' 容器名

查看容器端口映射

docker inspect -f '{{.NetworkSettings.Ports}}' 容器名

查看容器网络

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

查看容器状态

docker inspect -f '{{.State.Status}}' 容器名

查看容器启动时间

docker inspect -f '{{.State.StartedAt}}' 容器名

查看容器日志路径

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

三、查看镜像信息

查看镜像详细信息

docker inspect 镜像名

查看镜像作者

docker inspect -f '{{.Author}}' nginx

查看镜像默认启动命令

docker inspect -f '{{.Config.Cmd}}' nginx

四、容器之间怎么通信

用容器名通信(推荐)

Docker默认网络里,容器可以用容器名互相访问:

# 在nginx容器里ping mysql
docker exec mynginx ping mysql

不用记IP,直接用容器名就行。

用自定义网络

# 创建网络
docker network create mynet

# 容器加入网络
docker run --name mysql --network mynet -d mysql:5.7
docker run --name nginx --network mynet -d nginx

五、常见场景

场景1:Nginx反向代理连PHP

nginx配置里:

fastcgi_pass php:9000;

这里的php就是容器名,Docker会自动解析成容器IP。

场景2:PHP连MySQL

<?php
$pdo = new PDO('mysql:host=mysql;dbname=mydb', 'root', '123456');
?>

host填mysql,就是MySQL容器的名字。

六、容器IP会变吗?

会的。

容器重启后,IP可能会变。所以不要硬编码IP,用容器名通信最稳。

如果要固定IP: 用自定义网络,指定静态IP。

# docker-compose.yml
services:
  mysql:
    networks:
      mynet:
        ipv4_address: 172.20.0.10

常见坑

坑1:inspect输出太多,找不到IP

解决: 用 -f 参数过滤,只看你要的字段。

坑2:容器停了就看不到IP

容器停止状态下,IPAddress是空的。

解决: 先启动容器:docker start 容器名

坑3:不同网络的容器互相ping不通

原因: 容器在不同网络里。

解决: 把它们加到同一个网络:

docker network connect mynet 容器名

坑4:用容器名ping不通

原因: 不是默认网络,或者Docker版本太老。

解决: 用自定义网络,或者直接用IP。

坑5:host网络模式看不到IP

用 --network=host 启动的容器,IP和宿主机一样。

解决: 不用查了,就是宿主机的IP。

总结

常用命令:

命令 说明
docker inspect 容器名 看容器全部信息
docker inspect -f '{{.NetworkSettings.IPAddress}}' 容器名 只看IP
docker inspect -f '{{.Mounts}}' 容器名 看挂载
docker inspect -f '{{.Config.Env}}' 容器名 看环境变量

记住: 容器之间用容器名通信,别硬编码IP,重启就变了。

遇到问题加QQ23979811 协助处理


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

Docker容器内时间和宿主机不一致修复

前言

Docker容器里的时间和宿主机差了8个小时,日志时间不对,定时任务也跑偏。本文讲怎么修复容器时区问题。

一、问题现象

# 宿主机时间
date
# 输出:Thu Oct  8 08:14:01 CST 2026

# 容器里时间
docker exec 容器名 date
# 输出:Thu Oct  8 00:14:01 UTC 2026

差了8个小时,因为容器默认用UTC时区。

二、查看容器时区

docker exec 容器名 date

或者:

docker exec 容器名 cat /etc/timezone

三、修复方法

方法1:挂载时区文件(推荐)

启动容器时挂载宿主机的时区文件:

docker run -v /etc/localtime:/etc/localtime:ro 镜像名

这样容器就和宿主机用同一个时区了。

方法2:设置环境变量

docker run -e TZ=Asia/Shanghai 镜像名

方法3:进容器手动改

# 进容器
docker exec -it 容器名 bash

# 装时区数据
apt-get update && apt-get install -y tzdata

# 设置时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone

# 验证
date

方法4:Docker Compose设置

在docker-compose.yml里加:

services:
  app:
    image: xxx
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /etc/localtime:/etc/localtime:ro

四、PHP容器额外设置

PHP的时区和系统时区是两回事,还要改php.ini:

[Date]
date.timezone = Asia/Shanghai

或者在代码里设:

<?php
date_default_timezone_set('Asia/Shanghai');
?>

五、MySQL容器额外设置

MySQL的时区也要改:

-- 查看当前时区
SELECT @@global.time_zone;

-- 设置为东八区
SET GLOBAL time_zone = '+8:00';

永久生效改my.cnf:

[mysqld]
default-time-zone = '+8:00'

六、验证

# 宿主机时间
date

# 容器时间
docker exec 容器名 date

两个时间一致就对了。

常见坑

坑1:改了时区不生效

改了时区文件,重启容器又变回UTC了。

原因: 容器重启后文件系统重置了。

解决: 用挂载的方式,不要进容器改。

坑2:只改了系统时区,PHP时区不对

系统时间对了,但PHP date()还是错的。

原因: PHP有自己的时区设置。

解决: 改php.ini的date.timezone。

坑3:日志时间不对

日志里的时间还是UTC。

原因: 程序启动时读的时区,改了时区要重启程序。

解决: 重启容器或重启程序。

坑4:Windows/Mac Docker Desktop

Windows和Mac上Docker Desktop的时区处理不一样。

解决: 直接用TZ环境变量最稳。

坑5:时区列表找不到Asia/Shanghai

原因: 容器里没装tzdata。

解决: 先装tzdata:

apt-get install -y tzdata

总结

最稳的方法:

  1. 挂载 /etc/localtime:/etc/localtime:ro
  2. 加环境变量 TZ=Asia/Shanghai
  3. PHP改 date.timezone
  4. MySQL改 default-time-zone

记住: 时区不一致是Docker最常见的问题之一,部署完第一件事先验证时间。

遇到问题加QQ23979811 协助处理


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

Docker镜像占用空间过大,清理无用镜像容器

前言

用了一段时间Docker,磁盘满了。docker images一看,一堆旧镜像和停止的容器占着空间。本文讲怎么清理Docker空间。

一、查看Docker占用空间

docker system df

输出:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          50        10        15GB      10GB
Containers      30        10        500MB     400MB
Local Volumes   20        5         2GB       1.5GB

RECLAIMABLE 就是可以回收的空间。

二、查看镜像列表

docker images

看REPOSITORY、TAG、SIZE列。

三、清理停止的容器

删除单个容器

docker rm 容器ID/容器名

删除所有停止的容器

docker container prune

会提示确认,输入y。

加-f强制删除

docker container prune -f

不提示直接删。

四、清理无用镜像

删除单个镜像

docker rmi 镜像ID/镜像名

删除所有悬空镜像

悬空镜像就是 <none>:<none> 那些,构建中间产生的。

docker image prune

删除所有未被使用的镜像

docker image prune -a

注意:这会删掉所有没被容器用着的镜像,小心。

五、清理无用卷

查看卷

docker volume ls

删除无用卷

docker volume prune

六、清理无用网络

docker network prune

七、一键全部清理

docker system prune

清理:

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

连镜像一起删

docker system prune -a

把没被用的镜像也删掉。

加时间过滤

只删24小时前的:

docker system prune -a --filter "until=24h"

八、常见清理场景

场景1:磁盘快满了

# 先看占了多少
docker system df

# 清理停止的容器
docker container prune -f

# 清理悬空镜像
docker image prune -f

# 清理无用卷
docker volume prune -f

场景2:想彻底清理

docker system prune -a -f --volumes

九、手动清理某个镜像

找到镜像ID

docker images

删除

docker rmi 镜像ID

强制删除

如果镜像被停止的容器引用了,先删容器:

docker rm 容器ID
docker rmi 镜像ID

或者强制删:

docker rmi -f 镜像ID

常见坑

坑1:删镜像报错

Error response from daemon: conflict: unable to delete image (must be forced) - image is being used by stopped container

原因: 有停止的容器在用这个镜像。

解决: 先删容器,或者强制删。

坑2:删了镜像,数据还在

镜像删了,但卷还在,数据没丢。

原因: 数据存在卷里,和镜像分开的。

这是好事! 重新起容器挂载同一个卷,数据就回来了。

坑3:docker system prune删多了

把还要用的镜像也删了。

解决: 重要镜像别删,重新pull就行。

坑4:清理完磁盘还是满的

Docker清理了,但磁盘还是100%。

原因: Docker日志文件太大了。

解决: 清理容器日志:

truncate -s 0 /var/lib/docker/containers/*/*-json.log

或者配置日志大小限制。

坑5:构建缓存占空间

docker builder prune

清理构建缓存。

十、定期清理

可以加个定时任务,每周清理一次:

crontab -e

加:

0 3 * * 0 /usr/bin/docker system prune -a -f --filter "until=168h"

每周日凌晨3点清理一周前的。

总结

常用清理命令:

命令 说明
docker system df 看占用空间
docker container prune 清理停止的容器
docker image prune 清理悬空镜像
docker volume prune 清理无用卷
docker system prune -a 一键全清

记住: 定期清理,别等磁盘满了再弄。

遇到问题加QQ23979811 协助处理


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

Docker容器启动失败,查看容器日志排查错误

前言

Docker容器启动后马上就退出了,不知道为什么。本文讲怎么查看容器日志,排查启动失败的原因。

一、查看容器状态

列出所有容器

docker ps -a

看STATUS列:

  • Up 就是正常运行
  • Exited (1) 就是异常退出了

查看指定容器状态

docker ps -a | grep 容器名

二、查看容器日志

基本用法

docker logs 容器名/容器ID

实时查看日志

docker logs -f 容器名

查看最后100行

docker logs --tail 100 容器名

带时间戳

docker logs -t 容器名

查看最近10分钟的日志

docker logs --since 10m 容器名

三、常见启动失败原因

原因1:程序启动就退出

比如你跑的是个命令行程序,执行完就退出了,容器当然也跟着退。

解决: 前台运行程序,别后台跑。

# 错误:后台运行
CMD service nginx start

# 正确:前台运行
CMD nginx -g "daemon off;"

原因2:配置文件错误

比如nginx配置写错了,启动失败。

日志里会有:

nginx: [emerg] unknown directive "xxx"

解决: 根据日志提示改配置。

原因3:端口被占用

宿主机的端口已经被别的程序占了。

日志里会有:

Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use

解决: 换个端口,或者把占用端口的程序关掉。

# 查谁占用了80端口
netstat -tlnp | grep :80

原因4:挂载的文件不存在

-v挂载的宿主机路径不存在。

日志里会有:

no such file or directory

解决: 先创建宿主机目录。

mkdir -p /data/www

原因5:权限问题

挂载的目录权限不对,程序读不了。

日志里会有:

Permission denied

解决: 改目录权限:

chmod 755 /data/www

原因6:环境变量没设

程序需要的环境变量没传进去。

日志里会有:

Environment variable XXX is not set

解决: 启动时传环境变量:

docker run -e MYSQL_ROOT_PASSWORD=123456 mysql

四、排查步骤

第一步:看状态

docker ps -a

确认容器是Exited状态。

第二步:看日志

docker logs 容器名

日志最后几行就是报错原因。

第三步:进容器看

如果日志不够详细,进容器里手动跑:

docker run -it 镜像名 /bin/bash

进去后手动执行启动命令,看报什么错。

第四步:检查配置

挂载的配置文件对不对,环境变量有没有。

五、常用命令汇总

命令 说明
docker ps -a 看所有容器状态
docker logs 容器名 看日志
docker logs -f 容器名 实时看日志
docker logs --tail 100 容器名 看最后100行
docker inspect 容器名 看容器详细信息
docker exec -it 容器名 /bin/bash 进运行中的容器
docker run -it 镜像 /bin/bash 用镜像开个交互式容器

六、查看容器详细信息

docker inspect 容器名

能看到挂载、环境变量、网络等所有信息。

只看挂载信息

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

只看启动命令

docker inspect -f '{{.Config.Cmd}}' 容器名

常见坑

坑1:容器启动马上退出,日志是空的

docker logs 容器名

什么都没有。

原因: 程序本身就没输出,或者启动太早就挂了。

解决: 用 docker run -it 镜像 /bin/bash 进去手动跑。

坑2:改了配置不生效

改了挂载的配置文件,重启容器还是不生效。

原因: 容器没真正重启,或者配置文件路径不对。

解决: 强制重启:

docker restart 容器名

坑3:日志一直刷,停不下来

docker logs -f 容器名

日志一直在刷。

解决: 按 Ctrl+C 退出。

坑4:容器删除了日志就没了

容器删了,日志也跟着没了。

解决: 重要日志挂载到宿主机。

坑5:看日志找不到容器ID

容器太多,不知道哪个是哪个。

解决: 启动的时候给容器起个好记的名字:

docker run --name mynginx -d nginx

总结

排查三步:

  1. docker ps -a 看容器状态
  2. docker logs 容器名 看报错
  3. 按日志提示改问题

记住: 容器启动失败别慌,看日志就行,日志里都写了原因。

遇到问题加QQ23979811 协助处理


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

Docker 镜像加速配置

Docker 镜像加速配置

国内拉取 Docker 镜像很慢,配置镜像加速器很有必要。

1. 为什么要加速

Docker Hub 在国外,国内拉镜像经常超时,配置加速器能快很多。

2. 配置方法

Linux(CentOS/Ubuntu):

编辑配置文件:

mkdir -p /etc/docker
vi /etc/docker/daemon.json

写入内容:

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}

重启生效:

systemctl daemon-reload
systemctl restart docker

3. 常用加速器

# 中科大
https://docker.mirrors.ustc.edu.cn

# 网易
https://hub-mirror.c.163.com

# 阿里(需要自己的地址)
https://xxxx.mirror.aliyuncs.com

4. 验证是否生效

docker info

看到 Registry Mirrors 下面有地址就说明成功了。

5. 常见问题

1)拉取还是很慢:

  • 换个加速器试试
  • 网络问题

2)配置不生效:

  • 检查 json 格式对不对
  • 重启 docker

3)企业内网:

  • 可以自己搭建私有镜像仓库
  • 或者用阿里云私有镜像服务

6. 常用镜像源

# 官方
docker pull nginx
docker pull mysql
docker pull redis

# 指定版本
docker pull nginx:1.25
docker pull mysql:8.0

总结

Docker 镜像加速核心:

  • 配置 daemon.json
  • 用国内加速器地址
  • 重启 docker 生效
  • docker info 验证

做运维开发,Docker 镜像加速是第一步。


emer 发布于  2026-10-8 07:11 

Docker 常用命令汇总

Docker 常用命令汇总

Docker 现在是开发必备工具,整理一份常用命令清单,记不住随时翻。

1. 镜像管理

# 查看本地镜像
docker images

# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx:latest

# 删除镜像
docker rmi nginx:latest

# 导出镜像
docker save -o nginx.tar nginx:latest

# 导入镜像
docker load -i nginx.tar

2. 容器管理

# 查看运行中的容器
docker ps

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

# 启动容器
docker start nginx

# 停止容器
docker stop nginx

# 重启容器
docker restart nginx

# 删除容器
docker rm nginx

# 强制删除运行中的容器
docker rm -f nginx

3. 运行容器

# 后台运行 nginx
docker run -d --name mynginx -p 80:80 nginx

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

# 进入容器内部
docker exec -it mynginx bash

# 查看容器日志
docker logs mynginx

# 实时查看日志
docker logs -f mynginx

4. 查看容器信息

# 查看容器详细信息
docker inspect mynginx

# 查看容器占用资源
docker stats

# 查看容器端口映射
docker port mynginx

5. 数据卷

# 创建数据卷
docker volume create mydata

# 查看所有数据卷
docker volume ls

# 挂载数据卷运行容器
docker run -d -v mydata:/data nginx

# 删除数据卷
docker volume rm mydata

6. Docker Compose

# 启动服务
docker-compose up -d

# 停止服务
docker-compose down

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

docker-compose.yml 示例:

version: '3'
services:
  nginx:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html

7. 清理命令

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

# 删除所有无用镜像
docker image prune -a

# 删除所有无用数据卷
docker volume prune

# 一键清理所有无用资源
docker system prune -a

总结

Docker 常用命令就这几类:

  • 镜像: pull / images / rmi
  • 容器: run / ps / stop / rm / exec
  • 日志: logs / stats
  • Compose: up / down

日常开发把这些命令用熟就够了,不用背,多敲几次自然记住。


emer 发布于  2026-10-7 07:12 

Docker 常用命令大全

Docker 常用命令大全

Docker 命令不多,但记不住还是很麻烦。整理一份常用命令清单,收藏备用。

1. 镜像命令

# 拉取镜像
docker pull nginx:latest

# 查看本地镜像
docker images

# 删除镜像
docker rmi nginx:latest

# 搜索镜像
docker search nginx

# 导出镜像
docker save -o nginx.tar nginx:latest

# 导入镜像
docker load -i nginx.tar

2. 容器命令

# 启动容器(后台运行)
docker run -d --name mynginx -p 80:80 nginx

# 查看运行中的容器
docker ps

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

# 停止容器
docker stop mynginx

# 启动已停止的容器
docker start mynginx

# 重启容器
docker restart mynginx

# 删除容器
docker rm mynginx

# 强制删除运行中的容器
docker rm -f mynginx

3. 进入容器

# 进入容器(bash)
docker exec -it mynginx bash

# 进入容器(sh)
docker exec -it mynginx sh

# 查看容器日志
docker logs mynginx

# 实时查看日志
docker logs -f mynginx

# 查看容器详情
docker inspect mynginx

4. 文件操作

# 从容器复制文件到宿主机
docker cp mynginx:/etc/nginx/nginx.conf ./

# 从宿主机复制文件到容器
docker cp ./index.html mynginx:/usr/share/nginx/html/

5. 端口和网络

# 查看容器端口映射
docker port mynginx

# 查看容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mynginx

6. 清理命令

# 停止所有容器
docker stop $(docker ps -q)

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

# 删除所有未使用的镜像
docker image prune

# 删除所有未使用的资源(危险操作)
docker system prune -a

7. Docker Compose 常用命令

# 启动所有服务
docker-compose up -d

# 停止所有服务
docker-compose down

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

# 重启某个服务
docker-compose restart nginx

总结

Docker 常用命令核心:

  • 镜像:pull / images / rmi
  • 容器:run / ps / stop / start / rm
  • 进入:exec -it
  • 日志:logs -f
  • 清理:prune

记住这些,日常 Docker 操作基本够用了。


emer 发布于  2026-10-4 11:07 

Docker 网络模式详解

Docker 四种网络模式详解

Docker 网络是容器通信的基础,搞懂四种网络模式,容器网络就不会乱。

1. bridge 模式(默认)

这是 Docker 默认的网络模式。容器在一个虚拟的 bridge 网络里,每个容器有自己的虚拟 IP,通过 NAT 访问外部网络。

# 启动容器,默认就是 bridge
docker run -d nginx

# 查看容器 IP
docker inspect 容器ID | grep IPAddress

特点:

  • 容器之间可以通过 IP 互相访问
  • 外部访问需要端口映射
  • 适合大多数场景

2. host 模式

容器直接用宿主机的网络,没有独立的网络栈。

docker run -d --net=host nginx

特点:

  • 网络性能最好,没有 NAT 开销
  • 端口直接用宿主机的,不用映射
  • 多个容器不能用同一个端口

适合对性能要求高的场景。

3. none 模式

容器没有网络,完全隔离。

docker run -d --net=none nginx

特点:

  • 没有任何网络
  • 安全级别最高
  • 适合不需要网络的离线计算任务

4. container 模式

新创建的容器和一个已存在的容器共享网络。

docker run -d --net=container:nginx容器ID redis

特点:

  • 两个容器共享网络栈
  • 可以用 localhost 互相访问
  • 适合紧密配合的服务

5. 自定义网络

生产环境推荐用自定义网络,不用默认的 bridge:

# 创建自定义网络
docker network create mynet

# 容器加入自定义网络
docker run -d --net=mynet --name web nginx
docker run -d --net=mynet --name app php

同一个自定义网络里的容器,可以直接用容器名互相访问,不用记 IP。

总结

四种网络模式各有适用场景:

  • 日常开发用默认 bridge
  • 性能要求高用 host
  • 安全要求高用 none
  • 容器间通信密集用自定义网络

搞懂这四种模式,Docker 网络基本就够用了。


emer 发布于  2026-10-4 10:44 

Docker Compose 实战

Docker Compose 一键部署多容器

Docker Compose 可以用一个 YAML 文件定义和运行多个 Docker 容器,开发环境部署特别方便。

1. 基本结构

version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 123456

2. 常用命令

# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

# 停止并删除容器
docker-compose down

# 重启某个服务
docker-compose restart web

3. PHP 开发环境示例

version: '3'
services:
  php:
    build: .
    ports:
      - "8000:80"
    volumes:
      - ./:/var/www/html
    depends_on:
      - mysql
      - redis

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - mysql_data:/var/lib/mysql

  redis:
    image: redis:alpine

volumes:
  mysql_data:

4. 数据卷

数据卷用来持久化数据,容器删了数据还在:

volumes:
  - ./data:/var/lib/mysql

5. 网络

默认同一 Compose 里的服务在同一个网络,可以直接用服务名互相访问。比如 PHP 容器里连数据库用 mysql:3306,不用写 IP。

总结

Docker Compose 适合本地开发和测试环境。生产环境部署建议用 K8s 或者更专业的编排工具。


emer 发布于  2026-10-4 10:32 

Docker 入门:从容器到 Compose 的实战教程

前言

Docker 现在已经是后端开发的标配工具了。很多人听说过 Docker,但不知道它到底是什么、怎么用。本文用最通俗的方式,带你从零开始掌握 Docker 的核心用法。

一、Docker 是什么

简单来说,Docker 就是把你的应用和它依赖的所有东西(代码、运行时、系统库、配置文件)打包到一个"集装箱"里,然后这个集装箱可以在任何机器上运行。

和虚拟机的区别:虚拟机是模拟一整套操作系统,Docker 容器是共享宿主机的内核,所以更轻量、启动更快。

二、核心概念

  • 镜像(Image):相当于模板,只读的,用来创建容器
  • 容器(Container):镜像运行起来的实例,可以创建、启动、停止、删除
  • Dockerfile:用来构建镜像的脚本文件
  • 仓库(Registry):存放镜像的地方,比如 Docker Hub

三、常用命令

1. 镜像操作

# 拉取镜像
docker pull nginx:latest

# 查看本地镜像
docker images

# 删除镜像
docker rmi nginx:latest

2. 容器操作

# 运行容器
docker run -d -p 80:80 --name my-nginx nginx

# 查看运行中的容器
docker ps

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

# 停止容器
docker stop my-nginx

# 启动容器
docker start my-nginx

# 删除容器
docker rm my-nginx

# 查看容器日志
docker logs my-nginx

# 进入容器内部
docker exec -it my-nginx /bin/bash

关键参数说明:

  • -d:后台运行
  • -p 80:80:端口映射,宿主机端口:容器端口
  • --name:给容器起个名字

四、Dockerfile 实战

写一个简单的 PHP 应用镜像:

# 基于 PHP 官方镜像
FROM php:7.4-fpm

# 设置工作目录
WORKDIR /var/www/html

# 复制项目文件
COPY . .

# 安装依赖
RUN docker-php-ext-install pdo_mysql

# 暴露端口
EXPOSE 9000

# 启动命令
CMD ["php-fpm"]

构建镜像:

docker build -t my-php-app .

运行容器:

docker run -d -p 9000:9000 my-php-app

五、Docker Compose 实战

当你需要同时运行多个容器(比如 PHP + MySQL + Nginx),手动一个个启动太麻烦了。Docker Compose 就是用来编排多个容器的。

创建 docker-compose.yml 文件:

version: '3'

services:
  # PHP 应用
  app:
    build: .
    container_name: php-app
    volumes:
      - ./:/var/www/html
    networks:
      - app-network

  # MySQL 数据库
  db:
    image: mysql:5.7
    container_name: mysql-db
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: myapp
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - app-network

  # Nginx 反向代理
  nginx:
    image: nginx:alpine
    container_name: nginx-web
    ports:
      - "80:80"
    volumes:
      - ./:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app
    networks:
      - app-network

volumes:
  dbdata:

networks:
  app-network:
    driver: bridge

启动所有服务:

docker-compose up -d

停止所有服务:

docker-compose down

六、常见问题

1. 容器启动后立刻退出

通常是因为启动命令有问题。用 docker logs 查看日志:

docker logs container_name

2. 数据持久化

容器删除后数据就没了,需要用 volumes 来持久化:

docker run -v /host/path:/container/path mysql

3. 进入容器排查问题

docker exec -it container_name /bin/bash

总结

Docker 的核心思路:

  1. 镜像:打包应用和依赖
  2. 容器:镜像的运行实例
  3. Dockerfile:构建镜像的脚本
  4. Docker Compose:多容器编排

掌握这些,你就可以用 Docker 来部署你的 Web 应用了。Docker 最大的好处就是"一次构建,到处运行",再也不会出现"我电脑上是好的"这种问题了。


emer 发布于  2026-10-4 10:02 
'); })();