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 入门:从容器到 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 
'); })();