头图

以下是关于如何在Ubuntu环境下安装Docker和Docker Compose,并使用它们搭建一个包含Nginx、PHP、MySQL和Redis的多容器服务的详细步骤与解析。

一、Docker与Docker Compose的安装

Docker是一种应用容器引擎,能够将应用程序及其依赖打包到容器中,从而提高开发环境与生产环境的一致性。Docker Compose是一个工具,可以通过YAML文件来定义多容器应用,使得应用的启动和管理更加简便。

1.1 安装Docker

在安装Docker之前,先确保系统包是最新的,更新系统包:

sudo apt-get update

接下来,安装Docker相关的软件包:

sudo apt-get install docker-ce docker-ce-cli containerd.io

解释:

  • apt-get update:更新包索引以确保获取最新的软件包信息。
  • docker-ce:安装Docker的社区版(Community Edition)。
  • docker-ce-cli:Docker的命令行工具。
  • containerd.io:Docker容器运行时。

1.2 安装Docker Compose

Docker Compose是Docker生态中的一个重要工具,通过YAML文件编排和启动多容器应用。使用以下命令来安装:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

解释:

  • curl -L:通过curl命令下载Docker Compose的可执行文件。
  • chmod +x:为Docker Compose添加可执行权限,以便可以直接运行。

通过运行docker-compose --version命令,可以确认Docker Compose是否安装成功。

安装过程的工作流程图

以下是安装Docker与Docker Compose的工作流程图:

graph TD;
    A[系统更新] --> B[安装Docker相关软件包]
    B --> C[下载Docker Compose]
    C --> D[修改执行权限]
    D --> E[验证安装]

二、创建docker-compose.yml文件

在安装Docker和Docker Compose之后,我们可以开始定义多容器服务。我们通过创建docker-compose.yml文件来实现这一点。

2.1 编写docker-compose.yml文件

在项目根目录下,创建一个名为docker-compose.yml的文件,内容如下:

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ./www:/www
  php:
    image: php:7.4-fpm
    volumes:
      - ./www:/www
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
    volumes:
      - ./mysql:/var/lib/mysql
  redis:
    image: redis:latest
    ports:
      - "6379:6379"

解释:

  • Nginx服务

    • image: nginx:latest:使用最新的Nginx镜像。
    • ports: "80:80":将容器的80端口映射到主机的80端口。
    • volumes:挂载配置文件和网页目录到容器内。
  • PHP服务

    • image: php:7.4-fpm:使用PHP 7.4的FPM镜像(专为处理PHP请求设计)。
    • volumes:共享代码文件夹www
  • MySQL服务

    • image: mysql:5.7:使用MySQL 5.7镜像。
    • environment:设置MySQL的环境变量,例如根用户密码和数据库信息。
    • volumes:持久化MySQL数据到宿主机。
  • Redis服务

    • image: redis:latest:使用Redis的最新镜像。
    • ports:将Redis容器的6379端口映射到主机。

三、创建Nginx配置文件

在docker-compose文件中定义了nginx服务,因此我们还需要Nginx的配置文件。可以在./nginx目录下创建default.conf

server {
    listen 80;
    server_name localhost;
    root /www;
    index index.php index.html;
    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

解释:

  • listen 80;:监听80端口,接受来自外界的HTTP请求。
  • server_name localhost;:指定服务器名称为localhost。
  • root /www;:网站根目录为/www,这是挂载到Nginx容器内的宿主机目录。
  • location ~ \.php$:处理以.php结尾的请求,通过fastcgi_pass代理给PHP-FPM服务。

配置文件的说明表

指令描述
listen指定服务监听的端口号。
server_name指定服务器名称或域名。
root网站根目录所在的位置。
location配置特定路径下的请求处理规则,例如将.php请求交由PHP处理。
fastcgi_pass指定PHP-FPM的地址,用于处理PHP请求。

四、编写PHP测试页面

在项目根目录下创建一个www目录,用于存放PHP测试页面。然后在www目录中创建index.php文件:

<?php
phpinfo();
?>

解释:

  • 这个文件调用了phpinfo()函数,输出当前PHP环境的配置信息,方便我们测试PHP环境是否配置成功。

五、启动服务

现在我们已经编写好docker-compose.yml和相关配置文件,可以使用以下命令启动所有的容器服务:

docker-compose up -d

解释:

  • docker-compose up:启动docker-compose.yml文件中定义的所有服务。
  • -d:表示服务将在后台运行。

启动服务的流程图

graph TD;
    A[编写docker-compose.yml文件] --> B[创建Nginx配置文件]
    B --> C[编写PHP测试页面]
    C --> D[启动容器服务]
    D --> E[访问localhost测试]

六、测试部署结果

服务启动后,打开浏览器访问http://localhost,如果看到PHP的信息页面(包含PHP版本、已安装的扩展等),说明我们的环境部署成功了。以下是PHP信息页面的预期内容:

PHP Version 7.4.x
Configuration File (php.ini) Path
Loaded Configuration File
...

七、总结与优化建议

  • 多容器集成开发环境:本次部署的环境包括Nginx、PHP、MySQL和Redis,适合大部分PHP项目的开发需求。
  • 持久化数据:通过Docker卷将MySQL的数据保存到宿主机,确保数据库重启后数据不会丢失。
  • 扩展性强:可以根据需要添加更多的服务,例如RabbitMQ、Elasticsearch等,以满足不同的开发需求。

八、可能的改进

  • 添加PHP扩展:在实际开发中,可能需要安装额外的PHP扩展,可以通过编写自定义Dockerfile来扩展PHP镜像。
  • 调整MySQL配置:根据需求调整MySQL的内存、连接数等参数,以提高数据库的性能。
  • 部署SSL证书:为了确保数据传输安全,可以配置Nginx支持HTTPS。

💡小提示

  • 使用Docker Compose管理多容器服务,不仅方便,而且可以提高开发与生产环境的一致性
  • 使用卷(volumes)来持久化重要数据,防止容器重启后数据丢失。

通过本文的介绍,相信您已经学会了如何使用Docker和Docker Compose来搭建一个基本的PHP开发环境,并理解了各个部分的配置与作用。希望这篇文章能够对您在后续的开发工作中提供帮助! 🎉


蓝易云
28 声望3 粉丝