本地 PHP 和 Java 开发环境 Docker 化与配置开机自启

Docker 的最大优势之一是其容器化的特性,可以将开发环境的配置与应用程序的运行隔离开来。通过容器化的方式,PHP 和 Java 项目能够在本地开发时保持一致的环境配置,同时确保便捷的端口映射,方便开发和测试。本文将在前文基础上,补充说明如何在 Docker 中配置端口映射,并结合开机自启功能进行部署。

1. 本地 PHP 和 Java 开发环境 Docker 化

1.1 构建 PHP Docker 镜像

首先,为 PHP 项目编写 Dockerfile,我们可以使用 Apache 作为 Web 服务器并配置必要的 PHP 扩展。

Dockerfile 复制代码
# 使用官方 PHP 镜像作为基础镜像
FROM php:7.4-apache

# 安装 PHP 扩展(可根据项目需求进行调整)
RUN docker-php-ext-install mysqli pdo pdo_mysql

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

# 将本地的 PHP 项目文件拷贝到容器中
COPY ./php /var/www/html

# 暴露端口 80
EXPOSE 80
1.2 构建 Java Docker 镜像

对于 Java 项目,我们使用 openjdk 镜像。假设 Java 项目使用 Maven 作为构建工具,以下是 Java 项目的 Dockerfile 示例:

Dockerfile 复制代码
# 使用 OpenJDK 镜像作为基础镜像
FROM openjdk:11-jdk

# 设置工作目录
WORKDIR /app

# 将本地的 Java 项目文件拷贝到容器中
COPY ./java /app

# 编译并运行 Java 项目
RUN ./mvnw clean install

# 启动 Java 应用
CMD ["java", "-jar", "target/myapp.jar"]

# 暴露端口 8080
EXPOSE 8080
1.3 创建 docker-compose.yml 文件(包含端口映射)

为了管理多个服务并配置端口映射,我们使用 Docker Compose 来启动 PHP、Java 服务和 MySQL 数据库。以下是 docker-compose.yml 文件示例,配置了端口映射以及不同服务的网络。

yaml 复制代码
version: '3.7'

services:
  # PHP 服务
  php:
    build:
      context: .
      dockerfile: Dockerfile.php
    volumes:
      - ./php:/var/www/html
    ports:
      - "8080:80"  # 将容器的 80 端口映射到宿主机的 8080 端口
    networks:
      - dev-network
    restart: always  # 配置容器在退出后自动重启

  # Java 服务
  java:
    build:
      context: .
      dockerfile: Dockerfile.java
    volumes:
      - ./java:/app
    ports:
      - "8081:8080"  # 将容器的 8080 端口映射到宿主机的 8081 端口
    networks:
      - dev-network
    restart: unless-stopped  # 配置容器在退出时自动重启,除非手动停止

  # MySQL 服务(可选)
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: app_db
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - dev-network
    ports:
      - "3306:3306"  # 将容器的 3306 端口映射到宿主机的 3306 端口

networks:
  dev-network:
    driver: bridge

volumes:
  db_data:

在该配置中,端口映射的规则如下:

  • PHP 服务将容器的 80 端口映射到宿主机的 8080 端口。
  • Java 服务将容器的 8080 端口映射到宿主机的 8081 端口。
  • MySQL 服务将容器的 3306 端口映射到宿主机的 3306 端口。
1.4 启动服务

执行以下命令来构建并启动服务:

bash 复制代码
docker-compose up --build

通过上述命令启动后,您可以通过宿主机的 80808081 端口分别访问 PHP 和 Java 服务。

2. 配置 Docker 容器开机自启

2.1 使用 Docker 的 --restart 策略

Docker 提供了 --restart 选项,可以配置容器在 Docker 守护进程启动时自动启动。以下是常见的重启策略:

  • no:不自动重启容器(默认)。
  • always:无论容器退出的状态如何,Docker 守护进程都会尝试重新启动容器。
  • unless-stopped:容器退出时会重新启动,只有在手动停止容器后才不会再重启。
  • on-failure:仅在容器退出代码非 0 时重启容器。可以指定重启的最大次数。
2.1.1 修改 docker-compose.yml 配置

docker-compose.yml 文件中,我们可以为每个服务配置 restart 策略。例如:

yaml 复制代码
version: '3.7'

services:
  php:
    build:
      context: .
      dockerfile: Dockerfile.php
    volumes:
      - ./php:/var/www/html
    ports:
      - "8080:80"  # 配置端口映射
    restart: always  # 配置容器在退出后自动重启
    networks:
      - dev-network

  java:
    build:
      context: .
      dockerfile: Dockerfile.java
    volumes:
      - ./java:/app
    ports:
      - "8081:8080"  # 配置端口映射
    restart: unless-stopped  # 配置容器在退出时自动重启,除非手动停止
    networks:
      - dev-network
2.2 配置 Docker 守护进程自启

确保 Docker 守护进程在操作系统重启后自动启动。通常,Docker 在安装时默认会设置为开机自启,但可以手动配置。

2.2.1 在 Linux 上启用 Docker 自启

在 Linux 系统中,你可以使用 systemctl 来启用 Docker 守护进程的开机自启:

bash 复制代码
# 启动 Docker 服务
sudo systemctl start docker

# 设置 Docker 服务开机自启
sudo systemctl enable docker
2.2.2 在 Windows 和 macOS 上启用 Docker 自启

在 Windows 和 macOS 上,Docker Desktop 默认支持开机自启,可以在 Docker Desktop 设置中启用该功能:

  1. 打开 Docker Desktop。
  2. 点击 Settings(设置)。
  3. General (常规)选项卡中,启用 Start Docker Desktop when you log in(登录时启动 Docker Desktop)。
2.3 使用 systemd 配置容器开机自启

对于需要更高自定义管理的场景,可以使用 systemd 配置容器在系统启动时自启。创建一个 systemd 服务单元文件,管理 Docker 容器的启动。

例如,创建 /etc/systemd/system/my-docker-app.service 文件:

ini 复制代码
[Unit]
Description=My Dockerized PHP Application
After=docker.service
Requires=docker.service

[Service]
Restart=always
ExecStartPre=/usr/bin/docker pull php:7.4-apache
ExecStart=/usr/bin/docker run --rm --name php-app -p 8080:80 php:7.4-apache
ExecStop=/usr/bin/docker stop php-app

[Install]
WantedBy=multi-user.target

然后重新加载 systemd 配置并启用该服务:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl enable my-docker-app
sudo systemctl start my-docker-app

这将确保容器在操作系统启动时自动启动。

相关推荐
四谎真好看1 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程1 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t1 小时前
ZIP工具类
java·zip
lang201509282 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
IT_Octopus2 小时前
triton backend 模式docker 部署 pytorch gpu模型 镜像选择
pytorch·docker·triton·模型推理
pengzhuofan3 小时前
第10章 Maven
java·maven
百锦再3 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说3 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多3 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring
wudl55663 小时前
Docker 常用命令
docker·容器·eureka