目录结构
your-project/
├── docker-compose.yml
├── nginx/
│ └── default.conf
├── php/
│ └── Dockerfile
└── www/
└── index.php
1. 编写 docker-compose.yml
在your-project/
目录下新建docker-compose.yml
:
version: '3.7'
services:
nginx:
image: nginx:alpine
container_name: nginx
ports:
- "8080:80"
- "443:443"
- "83:83"
- "99:99"
- "9090:9090"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./www:/var/www/html
depends_on:
- php
networks:
- app-network
php:
build: ./php
container_name: php
volumes:
- ./www:/var/www/html
networks:
- app-network
mysql:
image: mysql:5.7
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: sppe598 # 请设置安全密码
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- app-network
networks:
app-network:
volumes:
mysql_data:
2. 创建 PHP Dockerfile
在php/
目录下新建Dockerfile
:
FROM php:7.4-fpm
# 推荐安装mysqli等扩展
RUN apt-get update && \
apt-get install -y libicu-dev && \
docker-php-ext-install intl pdo_mysql mysqli
WORKDIR /var/www/html
3. Nginx 配置
在nginx/
目录下新建default.conf
:
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
}
}
4. 示例 PHP 文件
在www/
目录下新建index.php
:
<?php
phpinfo();
?>
5. 启动服务
在your-project/
目录下,运行:
docker-compose up -d
常见问题:
1、phpmyadmin放在/var/www/html目录下提示:mysqli::real_connect(): (HY000/2002): No such file or directory
phpmyadmin 的 config.inc.php 里(如果没有则复制一个:cp config.sample.inc.php config.inc.php),数据库主机 必须写成服务名,例如:
$cfg[‘Servers’][$i][‘host’] = ‘mysql’;
⬆️ 不是 localhost
,也不是 127.0.0.1,(如果找不到,直接新增这一行也可以——重要的是 host 必须是 mysql 服务名)
其它网站host也必须是 mysql 服务名
2、在 docker-compose.yml
里修改了 MYSQL_ROOT_PASSWORD
MYSQL_ROOT_PASSWORD
只在第一次初始化容器、创建新volume时才会生效;即使你换了新密码,再启动也是用原来的密码,不会自动覆盖。
2.1. 删除旧数据卷后重建
如果你只是在开发或测试环境,需要用新的 root 密码,可以先删除原数据卷,再启动:
docker-compose down -v
docker-compose up -d
2.2. 不想丢数据,只想改密码
如果你的数据不能丢,只是想修改 root 密码,需要进入 MySQL 容器内部手动改密码:
docker exec -it [你的mysql服务名] mysql -u root -p
输入旧的 root 密码后,执行:
ALTER USER 'root'@'%' IDENTIFIED BY '新密码';
FLUSH PRIVILEGES;
项目迁移
1、在旧服务器上操作
1.1、生成镜像
docker commit [php容器名或ID] myphp:withcode
docker commit [nginx容器名或ID] mynginx:withcode
1.2、导出镜像文件
docker save -o myphp_withcode.tar myphp:withcode
docker save -o mynginx_withcode.tar mynginx:withcode
1.3、打包数据卷
1.3.1、检查卷是否已创建
#看看有没有 nginx-php-mysql_mysql_data
docker volume ls
#查看挂载点
docker volume inspect nginx-php-mysql_mysql_data
1.3.2、打包数据卷
docker run --rm -v nginx-php-mysql_mysql_data:/volume -v $(pwd):/backup alpine tar czvf /backup/mysql_data.tar.gz -C /volume .
1.4、修改docker-compose.yml
修改nginx、php的image
version: '3.7'
services:
nginx:
image: mynginx:withcode
container_name: nginx
ports:
- "8080:80"
- "443:443"
- "83:83"
- "99:99"
- "9090:9090"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./www:/var/www/html
depends_on:
- php
networks:
- app-network
php:
image: myphp:withcode
container_name: php
volumes:
- ./www:/var/www/html
networks:
- app-network
mysql:
image: mysql:5.7
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: suze888 # 请设置安全密码
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- app-network
networks:
app-network:
volumes:
mysql_data:
1.5、打包docker-compose.yml所在文件夹,准备迁移
2、在新服务器上操作
2.1、加载镜像
docker load -i myphp_withcode.tar
docker load -i mynginx_withcode.tar
2.2、恢复数据到卷
# 查询卷的物理位置:(需要先docker-compose up -d才会有卷)
docker volume inspect nginx-php-mysql_mysql_data
# 你会看到类似:"Mountpoint": "/var/lib/docker/volumes/nginx-php-mysql_mysql_data/_data"
# 进入卷目录并还原数据
# 先进入卷目录并清空原有数据:
cd /var/lib/docker/volumes/nginx-php-mysql_mysql_data/_data
rm -rf ./*
# 然后将你的数据备份包解压进来:
tar xzvf /opt/nginx-php-mysql/mysql_data.tar.gz
2.3、启动服务
在 docker-compose.yml 所在目录执行:
docker-compose up -d