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
通过上述命令启动后,您可以通过宿主机的 8080
和 8081
端口分别访问 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 设置中启用该功能:
- 打开 Docker Desktop。
- 点击 Settings(设置)。
- 在 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
这将确保容器在操作系统启动时自动启动。