docker-compose搭建php开发环境
DockerCompose作为一种容器编排工具,可以让我们轻松地配置和管理多个Docker容器,从而快速搭建PHP开发环境
Docker Compose简介
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。而DockerCompose作为一种容器编排工具,可以让我们轻松地配置和管理多个Docker容器,从而快速搭建PHP开发环境。
Compose 使用的三个步骤:
- 使用 Dockerfile 定义应用程序的环境。
- 使用
docker-compose.yml
定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。如果你还不了解 YML 文件配置,可以先阅读 YAML 入门教程。 - 最后,执行
docker-compose up
命令来启动并运行整个应用程序。
安装docker
Ubuntu
依次执行下面的命令
# 更新apt
sudo apt update
sudo apt upgrade
# 安装依赖
sudo apt-get install ca-certificates curl gnupg lsb-release
# 添加Docker官方GPG密钥
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 配置Docker镜像源
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 安装docker
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 配置用户组(可选)
sudo usermod -aG docker $USER
# 查看版本检查是否安装成功
docker --version
# 启动docker,一般安装完会自动启动,如果没有启动请手动执行
systemctl start docker
CentOS
依次执行下面的命令
# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置Docker镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件包索引
yum makecache fast
# 安装docker
yum install docker-ce
# 查看版本检查是否安装成功
docker --version
# 启动docker,一般安装完会自动启动,如果没有启动请手动执行
systemctl start docker
安装docker-compose
访问Releases · docker/compose (github.com)查看最新版本
然后依次执行下面的命令:
# 下载docker-compose文件,自行修改版本号
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 给他执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 查看是否安装成功
docker-compose --version
如果觉得下载慢,可以将github.com
替换为其他镜像域名加速下载,例如:
sudo curl -L "https://hub.nuaa.cf/docker/compose/releases/download/v2.24.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
docker-compose初始配置
创建初始 docker-compose.yml 文件(不含各服务的配置文件映射),在哪个目录不做要求,内容如下,自行修改项目路径和配置文件路径为自己的电脑文件夹路径,我这里新建在home/docker
目录下:
#yaml 配置实例
version: '3'
services:
php:
container_name: php7.4
image: php:7.4-fpm
restart: always
privileged: true
ports:
- "9000:9000"
volumes:
- "/home/www:/var/www" # php代码目录
nginx:
container_name: nginx
image: nginx:latest
privileged: true
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- "80:80"
- "443:443"
depends_on:
- "php"
volumes:
- "/home/www:/var/www" # php代码目录
- "/home/docker/nginx/logs:/var/log/nginx" # nginx日志文件
mysql:
image: mysql:5.7
container_name: mysql5.7
privileged: true
restart: always
ports:
- "3306:3306"
volumes:
- /home/docker/mysql/data:/var/lib/mysql # mysql数据目录
- /home/docker/mysql/log:/var/log/mysql # mysql日志文件
- /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro是read only只读的意思
environment:
- MYSQL_ROOT_PASSWORD=123456 # root账户密码
redis:
image: redis:latest
container_name: redis
privileged: true
restart: always
ports:
- "6379:6379"
command: redis-server /usr/local/redis/conf/redis.conf # 启动redis服务并指定配置文件
volumes:
- /home/docker/redis/data:/data # redis数据目录
- /home/docker/redis/conf/redis.conf:/usr/local/redis/conf/redis.conf #redis配置文件
常用参数说明
version:指定Docker Compose文件的语法版本,3是当前广泛使用的版本
services:要运行的服务,里面是各个服务名称和服务配置
container_name:容器名称
image:使用的镜像名称
restart:容器在退出后的行为,[always:总是重启容器,no:不重启,unless-stopped:重启容器,除非容器被手动停止,on-failure:退出状态码不为0(即失败)时自动重启该容器]
networks:将当前容器加入到这个网络中以方便数据传输,默认是使用
brige
连接方式名为docker_default
的网络,但重启容器后会改变ip地址,如果要固定容器ip,就要自定义网络volumes:宿主机和容器的目录映射
environment:添加环境变量,可添加一个或多个键值对,布尔含义的值要用引号包裹
ports:宿主机和容器的端口映射
build:使用当前目录下的dockerfile构建
expose:暴露容器端口,但不映射到宿主机,只通过ip等方式访问容器的时候访问
depends_on:以依赖性顺序启动服务,先启动depends_on中的服务再启动当前服务,注意事项:服务启动不会等依赖服务里面的程序启动完才启动,只依赖服务是否启动
privileged:给容器root权限
启动服务
在 docker-compose.yml 文件所在的目录下执行下面的命令一键启动所有服务
docker-compose up
现在打开浏览器访问locahost
应该能访问到nginx的首页了,如果你是在本地电脑或虚拟机的docker,需要在宿主机添加hosts文件ip映射,
# 将ip改为你的服务器ip
192.168.204.128 demo.net
下面是docker-compose的其他命令
# 一键启动所有服务
docker-compose up
# 或者启动所有服务并在后台运行
docker-compose up -d
# 指定项目名称
docker-compose -p my_project up
# 启动其中的一个或多个服务
docker-compose up nginx php -d
# 停止、重启其中的一个或多个服务
docker-compose stop nginx php
# 停止所有服务
docker-compose stop
# 重启所有服务
docker-compose restart
# 进入指定容器
docker-compose exec [service_name] bash
# 查看容器状态
docker-compose ps
复制配置文件
如果你不需要自定义配置各个服务,可以跳过这个也不用下一步调整docker-compose配置
复制容器的默认配置文件到宿主机,冒号前是容器名称,冒号后面是容器中配置文件的路径,最后是宿主机的配置文件存放目录,如果宿主机目录不存在请创建
# nginx
sudo docker cp nginx:/etc/nginx/nginx.conf /home/docker/nginx/nginx.conf
sudo docker cp nginx:/etc/nginx/conf.d /home/docker/nginx/conf.d
# php
sudo docker cp php7.4:/usr/local/etc/php/php.ini-production /home/docker/php/php.ini
# mysql
sudo docker cp mysql5.7:/etc/my.cnf /home/docker/mysql/my.cnf
# redis
自动生成空白配置
调整docker-compose配置
这个配置加入了各个服务自定义的配置文件映射,先执行docker-compose stop
停止服务,然后用下面的配置替换上面 docker-compose.yml 文件的初始配置,然后重新启动服务即可
#yaml 配置实例
version: '3'
services:
php:
container_name: php7.4
image: php:7.4-fpm
restart: always
privileged: true
ports:
- "9000:9000"
volumes:
- "/home/www:/var/www" # php代码目录
- "/home/docker/php/php.ini:/usr/local/etc/php/php.ini" # php配置文件目录
nginx:
container_name: nginx
image: nginx:latest
privileged: true
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- "80:80"
- "443:443"
depends_on:
- "php"
volumes:
- "/home/docker/nginx/nginx.conf:/etc/nginx/nginx.conf" # nginx配置文件目录
- "/home/docker/nginx/conf.d:/etc/nginx/conf.d" # nginx虚拟主机配置文件目录
- "/home/www:/var/www" # php代码目录
- "/home/docker/nginx/logs:/var/log/nginx" # nginx日志目录
mysql:
image: mysql:5.7
container_name: mysql5.7
privileged: true
restart: always
ports:
- "3306:3306"
volumes:
- /home/docker/mysql/data:/var/lib/mysql # mysql数据目录
- /home/docker/mysql/my.cnf:/etc/my.cnf # mysql配置文件
- /home/docker/mysql/log:/var/log/mysql # mysql日志文件
- /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro是read only只读的意思
environment:
- MYSQL_ROOT_PASSWORD=123456 # root账户密码
redis:
image: redis:latest
container_name: redis
privileged: true
restart: always
ports:
- "6379:6379"
command: redis-server /usr/local/redis/conf/redis.conf # 启动redis服务并指定配置文件
volumes:
- /home/docker/redis/data:/data # redis数据目录
- /home/docker/redis/conf/redis.conf:/usr/local/redis/conf/redis.conf #redis配置文件
新建站点
创建站点配置文件,例如网站域名是http://demo.net
,那么就在ngxin/conf.d
目录下新建一个demo.net.conf
cd /home/docker/nginx/conf.d
sudo vi demo.net.conf
文件内容如下
server {
listen 80;
server_name www.demo.net demo.net;
root /var/www/demo;
index index.php index.html;
location ~ \.php(.*)$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
注意修改你的root
为容器里的代码目录,server_name
为你的域名
在你的站点代码目录新建php文件,内容随便写
cd /var
sudo mkdir www
cd ./www && sudo mkdir demo
sudo vi test.php
<?php
echo 'hello world';
如果你是在本地电脑或虚拟机的docker,需要在宿主机添加hosts文件ip映射,
# 将ip改为你的服务器ip
192.168.204.128 demo.net
然后重启nginx
服务,注意一定要执行docker restart nginx
重启nginx,不然新建的站点不生效
现在打开浏览器访问http://demo.net/test.php
就能看到输入的hello world
了
常见问题
-
laravel、thinkphp等框架站点配置伪静态示例
server { listen 80; server_name hello.net; root /var/www/hello/public; # 站点根目录 include /var/www/hello/public/nginx.htaccess; # 配置伪静态 location ~ \.php(.*)$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } }
-
laravel框架报错
The stream or file "/var/www/hello/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: Permission denied The exception occurred while attempting to log
原因:日志目录没有权限
解决:sudo chmod -R 777 storage
-
laravel框架报错
could not find driver (SQL: select * from
admin_userswhere
username= admin limit 1)
原因:没有安装php-pdo驱动
解决:
1.进入php容器一次执行下面的命令安装驱动
docker-compose exec php bash docker-php-ext-install pdo pdo_mysql
2.在php.ini文件添加扩展
extension=pdo_mysql
3.重启容器
更多推荐
所有评论(0)