关于docker的一些实践

发布于:2025-06-29 ⋅ 阅读:(15) ⋅ 点赞:(0)
{
  "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.多阶段构建实现基于AlpineNginx的编译安装

以上面的版本进行实验
心得体会:
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


网站公告

今日签到

点亮在社区的每一天
去签到