{
"registry-mirrors" : ["https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://dockerproxy.com",
"https://gst6rzl9.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"http://mirrors.ustc.edu.cn/",
"https://mirrors.tuna.tsinghua.edu.cn/",
"http://mirrors.sohu.com/"
],
"insecure-registries" : [
"registry.docker-cn.com",
"docker.mirrors.ustc.edu.cn"
],
"debug": true,
"experimental": false
}
1.多阶段构建实现基于Alpine的Nginx的编译安装
以上面的版本进行实验
心得体会:
ARG NGINX_VERSION=1.24.0 下面如果要引用的话为$NGINX_VERSION
ENV NGINX_VERSION=1.24.0 下面如果要引用的话为${NGINX_VERSION}
WORKDIR 类似于cd命令 进入到某个文件夹里执行相应的命令
错误分析
正确代码执行如下 得出来28.9M的镜像
# 第一阶段:构建阶段(Builder Stage)
FROM alpine:3.22.0 AS builder
# 1. 配置 Alpine 软件源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
# 2. 安装编译依赖
RUN apk update && apk add --no-cache \
build-base \
pcre-dev \
zlib-dev \
openssl-dev \
wget \
tar
# 3. 定义环境变量(精简冗余)
ENV NGINX_VERSION=1.29.0
ENV NGINX_DIR=/apps/nginx
# 4. 下载并解压 Nginx 源码(先放到临时目录,避免与安装目录冲突)
RUN wget https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
tar -zxvf nginx-${NGINX_VERSION}.tar.gz && \
rm -f nginx-${NGINX_VERSION}.tar.gz
# 5. 配置工作目录为源码目录
WORKDIR /nginx-${NGINX_VERSION}
# 6. 配置、编译、安装 Nginx(--prefix 指定安装到 /apps/nginx)
RUN ./configure \
--prefix=${NGINX_DIR} \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module && \
make && make install
# 7. 清理源码(减小构建阶段体积)
RUN rm -rf /nginx-${NGINX_VERSION}
# 第二阶段:运行阶段(Runtime Stage)
FROM alpine:3.22.0
# 1. 配置 Alpine 软件源(同构建阶段,可选)
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
# 2. 安装 Nginx 运行时依赖(仅保留必要库,如 pcre 等,无需编译工具)
RUN apk update && apk add --no-cache \
pcre \
zlib \
openssl \
tzdata \
curl
# 3. 设置时区为上海(可选,根据实际需求调整)
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# 4. 【关键修复】先创建 Nginx 专用用户和组(确保后续 chown 能识别)
RUN addgroup -S nginx && \
adduser -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx
# 5. 从构建阶段(builder)复制编译好的 Nginx 目录到当前镜像
COPY --from=builder /apps/nginx /apps/nginx
# 6. 配置 Nginx 可执行文件软链接(方便直接用 nginx 命令启动)
RUN ln -sf /apps/nginx/sbin/nginx /usr/sbin/nginx
# 7. 准备日志目录并设置权限(此时 nginx 用户组已创建,chown 可正常执行)
RUN mkdir -p /var/log/nginx && \
chown -R nginx:nginx /apps/nginx /var/log/nginx
# 8. 配置日志重定向到标准输出(方便 Docker 日志收集)
RUN ln -sf /dev/stdout /apps/nginx/logs/access.log && \
ln -sf /dev/stderr /apps/nginx/logs/error.log
# 9. 暴露 Nginx 常用端口(HTTP、HTTPS,根据实际启用的模块调整)
EXPOSE 80 443
# 10. 定义容器启动命令,以非 root 用户(nginx)启动 Nginx 并前台运行
USER nginx
CMD ["nginx", "-g", "daemon off;"]
2.Docker 单机部署:用数据卷(Volumes)持久化
1.启动数据库容器(持久化数据库数据)
docker run -d -p 3306:3306 \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_USER=wordpress \
-e MYSQL_PASSWORD=123456 \
-v /data/mysql:/var/lib/mysql \
--restart=always \
--name mysql \
mysql:8.0
2.启动 WordPress 容器(持久化网站文件)
注意:-e的参数可以不写,在网页里一点点儿写也是可以的,这样就不用在网页里写了
docker run -d -p 80:80 \
-e WORDPRESS_DB_HOST=mysql\ #之前写的是宿主机的ip地址,如果不行可以改回宿主机的ip
-e WORDPRESS_DB_USER=wordpress \
-e WORDPRESS_DB_PASSWORD=123456 \
-e WORDPRESS_DB_NAME=wordpress \
-v /data/wordpress:/var/www/html \
--restart=always \
--name wordpress \
wordpress:php8.1-apache
3 wordpress 自定义网络
可以看持久化的案例。只需要将wordpress容器和数据库容器里面添加如下内容。其余都不变
--network wordpress-net # 连接到同一网络
测试与检测
docker network inspect wordpress-net #查看此网络详情用
# 方法1:进入 WordPress 容器并在容器内 ping MySQL 容器名
docker exec -it wordpress bash
ping mysql
# 方法2:测试 MySQL 连接(需安装 mysql 客户端)
apt-get update && apt-get install -y mysql-client
mysql -h mysql -u wordpress -p
4.用docker-compose实现 wordpress
官方文档 : https://docs.docker.com/compose/compose-file/
①docker compose 文件是一个 yaml 格式的文件,所以注意行首的缩进很严格
②docker compose 也支持 json 文件格式 , 比如 : docker compose -f docker-compose.json up
③默认 docker-compose 命令会调用当前目录下的 docker-compose.yml 的文件,因此一般执行 docker-compose命令前先进入 docker-compose.yml 文件所在目录
version: '3.3'
services:
mysql:
image: mysql:8.0
volumes:
- /data/wordpress/mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=123456
restart: always
networks:
- wordpress-net
wordpress:
image: wordpress:php8.1-apache
volumes:
- /data/wordpress/wordpress:/var/www/html
environment:
- WORDPRESS_DB_HOST=mysql
- WORDPRESS_DB_NAME=wordpress
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=123456
restart: always
networks:
- wordpress-net
nginx:
image: nginx:1.29.0
ports:
- '80:80'
volumes:
- ./nginx/wordpress.conf:/etc/nginx/conf.d/wordpress.conf
- /data/wordpress/nginx:/var/log/nginx/
- /data/wordpress/wordpress:/var/www/html
restart: always
networks:
- wordpress-net
networks:
wordpress-net:
driver: bridge
ipam:
config:
- subnet: 172.30.0.0/16