先获取下要需要的镜像
docker search nginx
直接拉取官方镜像
docker pull nginx
同理依次安装php:8.0-fpm、mysql:8
docker pull php:8.0-fpm docker pull mysql:8
查看安装的镜像:docker images ls
建立几个映射文件夹备用
mkdir -pv /docker/www/ #网站项目根目录 mkdir -pv /docker/nginx/conf.d/ #nginx配置文件 mkdir -pv /docker/mysql #数据库文件夹
1.创建php容器
docker run -p 9000:9000 --name phpfpm -v /data/docker/www:/data/www -d php:8.0-fpm
# 将本地/data/docker/www 映射到容器中的/data/www位置,映射地址(/data/www)需要一会在nginx 中配置。
--name 这里是别名,使用docker ps 会最后显示names
-p 9000:9000 第一个9000是本地的端口,第二个9000是docker容器端口,
-v 映射目录
新建/data/www/index.php、/data/www/index.html
<?php phpinfo();
进入容器phpfmp 发现在/data/www/目录下也存在了这个文件,执行php index.php 确认安装成功
exit 退出容器,继续安装nginx
2.创建nginx容器
docker run --name mynginx -p 80:80 -v /data/docker/www:/data/www -v /data/docker/nginx/conf.d/:/etc/nginx/conf.d -d nginx
# 将本地/data/docker/nginx/conf.d 配置目录 映射到容器中的/etc/nginx/conf.d/位置
将本地/data/docker/www 项目目录 映射到容器中的/data/www位置
在本地/data/docker/nginx/conf.d/新建一个nginx配置文件:php-nginx.conf
eg:
listen 80; server_name localhost; location / { root /data/www; #代码目录挂在到容器中的目录 index index.html index.htm index.php; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { root /data/www; fastcgi_pass localhost:9000; #php容器的IP地址 #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; } }
重启下nginx
docker restart mynginx
本地试着访问下
curl localhost; curl localhost/index.php
index.html 可以正常访问,而php 不行;
获取php 容器的ip地址:
docker inspect phpfpm --format='{{.NetworkSettings.IPAddress}}'
修改php-nginx.conf 文件中的php 地址:
再次请求发现可以。
尝试在浏览器中访问:(如果不行,请检查防火墙对应的端口是否开启)
3.创建mysql容器
配置mysql映射目录
mkdir -pv /data/docker/mysql/conf #数据库配置文件
mkdir -pv /data/docker/mysql/logs #数据库日志
mkdir -pv /data/docker/mysql/data #数据库数据
运行docker mysql镜像 ,设定映射文件并暂将密码设置成123456
docker run -p 3306:3306 --name mysql -v /data/docker/mysql/conf:/etc/mysql/conf.d -v /data/docker/mysql/logs:/var/log/mysql -v /data/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
进入容器
docker exec -it mysql bash
进入mysql
mysql -uroot -p123456 #也可能为空
熟悉的mysql 界面
新建一个临时的测试库test,以备后面测试。未保证能使用root帐号从外部访问数据库,修改下帐号权限(一般是重新建个帐号,给向相应的权限)
update user set host = "%" where user = "root";
退出mysql,退出容器。
查看最开始创建的/data/docker/ 目录
尝试在php中连接mysql
先获取mysql容器连接ip
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql #我的是172.17.0.4
创建文件/data/docker/www/mysql.php
<?php $dbms = 'mysql';//数据库类型 $host = '172.17.0.4'; //数据库主机名,此处写mysql 容器的名字 $dbport = '3306'; $dbName = 'test';//使用的数据库 $user = 'root';//数据库连接用户名 $pass = '123456';//对应的密码 $dsn = "$dbms:host=$host;port=$dbport;dbname=$dbName"; try { $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象 echo "successful!<br/>"; $dbh = null; } catch (PDOException $e) { die ("Error!: " . $e->getMessage() . "<br/>"); }
访问发现没有PDO扩展,那就去安装相应扩展吧。
进入php 容器 (docker exec -it php bash) 进行配置
退出容器,再次访问,可以。
同理在电脑客户端使用Navicat工具尝试连接(请确保服务器3306端口有打开):
查看在运行的容器:
最后把docker服务加入开机启动
systemctl enable docker.service
docker启动后自动启动相应的容器:docker update --restart=always 容器ID
至此结束
补充添加:
redis安装命令
docker pull redis
docker run -p 6379:6379 --name redis -v /data/docker/redis/redis.conf:/etc/redis/redis.conf -v /data/docker/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
-p 6379:6379:把容器内的6379端口映射到宿主机6379端口
# -v /root/docker/redis/redis.conf:/etc/redis/redis.conf:把宿主机配置好的redis.conf放到容器内的这个位置中
# -v /root/docker/redis/data:/data:把redis持久化的数据在宿主机内显示,做数据备份
# redis-server /etc/redis/redis.conf:这个是关键配置,让redis不是无配置启动,而是按照这个redis.conf的配置启动
# -appendonly yes:redis启动后数据持久化
docker exec -it redis redis-cli
php安装redis的扩展,需要到官网选择适合自己php版本的扩展包下载(https://pecl.php.net/package/redis)
比如,我的是php8:
wget http://pecl.php.net/get/redis-5.3.4.tgz
解压后将文件移至php容器中
tar zxvf redis-5.3.4.tgz rm -r redis-5.3.4.tgz
可以通过上面配置的映射目录移动
进入php容器,找到刚刚移动过来的安装包,安装redis扩展
docker exec -it phpfpm bash mv redis-5.3.4 /usr/src/php/ext/redis docker-php-ext-install redis
查看php扩展是否安装成功 php -m