自学内容网 自学内容网

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

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

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

1.1 构建 PHP Docker 镜像

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

# 使用官方 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 示例:

# 使用 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 文件示例,配置了端口映射以及不同服务的网络。

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 启动服务

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

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 策略。例如:

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 守护进程的开机自启:

# 启动 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 文件:

[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 配置并启用该服务:

sudo systemctl daemon-reload
sudo systemctl enable my-docker-app
sudo systemctl start my-docker-app

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


原文地址:https://blog.csdn.net/wolf23151269/article/details/143978244

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!