学习docker渠道有很多,除官方文档外,网上也有很多大神的文章可以作为参考。作为一个PHPer,当然要用它搞搞事情了。本次使用的宿主机为Centos7,nginx、php、mysql将部署为独立的容器实例。为了快速部署,所以还是采用了官方镜像。安装docker步骤本文不再展示,可以自行搜索。
docker pull mysql
mysql后面可以指定版本,本文发布时最新的mysql版本是8.0.11,可以运行docker search imageName
查询。如果没有指定版本,则默认拉取最新的版本。可以运行docker images
查看已下载的镜像。
#创建www目录,主要存放我们的php应用
mkdir /home/www
#创建一个目录
mkdir -p /server/mysql
cd /server/mysql
#创建容器
docker run \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v "$PWD"/data:/var/lib/mysql \
-v "$PWD"/conf:/etc/mysql/conf.d \
-d mysql
说明
–name 参数为mysql容器名称,可以自己定义。
-p 指定外部映射到容器的端口
-e 环境变量 MYSQL_ROOT_PASSWORD为指定root账号密码
-v 映射目录或者文件
* /data 为mysql数据目录
* /conf 为配置目录
-d 以守护进程的方式运行
运行成功
查看容器
docker ps -a
一个小提示:
如果使用最新的mysql版本,例如使用mysql8.0.11,php在连接数据库的时候可能可能会连接不上,是因为mysql默认密码验证插件是caching_sha2_password
,解决办法是修改数据库默认验证方式,可以创建新的数据库账号,然后修改验证插件为mysql_native_password
。
另附sql:
# 修改
ALTER USER username IDENTIFIED WITH mysql_native_password BY '123456';
# 刷新权限,生效
FLUSH PRIVILEGES;
docker pull php:7.2-fpm
#创建一个目录
mkdir /server/php
cd /server/php
# 生成容器
docker run -d \
--name php \
-p 9000:9000 \
-v "$PWD"/etc/:/usr/local/etc/php \
-v /home/www/:/var/www/html:ro \
--link mysql \
php:7.2-fpm
说明
重复的就不作说明,上面已经介绍过了。
-v 目录映射
* /etc/ php 的配置目录,存放php.ini的地方
* /home/www/ 映射php www目录
–link mysql 因为php和mysql都是独立的容器运行,所以这里需要通过参数连接。
#进入php容器bash界面
docker exec -it php bash
#以安装pdo_mysql扩展为例
cd /usr/local/bin
./docker-php-ext-install pdo_mysql
可以查看大神[原文]。
官方php镜像似乎没有编译pdo_mysql和mysqli扩展,所以这个命令用得到。
注意:
安装好扩展之后,需要在配置文件中加入对应的扩展项。
#进入宿主机的配置目录
cd /server/php
#没有php.ini则需要创建,然后在里面加入
extension=pdo_mysql
docker pull nginx
#创建一个巴适的目录
mkdir /server/nginx
cd /server/nginx
#创建容器
docker run --name nginx \
-d -p 8080:8080 \
-v /home/www:/home/www \
-v /home/www:/usr/share/nginx/html \
-v "$PWD"/nginx.conf:/etc/nginx/nginx.conf \
-v "$PWD"/logs:/var/log/nginx \
-v "$PWD"/conf.d:/etc/nginx/conf.d \
--link php \
-d nginx
说明
-v 目录映射说明
* /home/www:/usr/share/nginx/html 网站主目录映射
*/nginx.conf nginx配置文件
* /logs 日志目录
* /conf.d 配置目录
–link php 连接php容器
大部分人会在这里踩坑,在网上也搜索了很多资料。可以参考这篇[文章]。
ningx.conf配置
user nginx;
worker_processes auto;
error_log /server/nginx/logs/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /server/nginx/conf.d/*.conf;
server {
#根据映射的端口确定
listen 8080;
listen [::]:8080;
server_name localhost;
root /home/www/;
index index.php index.html index.htm;
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
#此处 $fastcgi_script_name之前必须为/var/www/html
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
include fastcgi_params;
}
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
增加一个虚拟主机:
在conf.d目录下创建一个vhost.conf,写入如下内容。假设有一个test目录,为我们新的网站项目,解析的域名为test.com。重启nginx容器,访问http://test.com:8080。
server {
listen 8080;
listen [::]:8080;
server_name test.com;
root /home/www/test/;
index index.php index.html index.htm;
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
#注意这里的$fastcgi_script_name之前有变化
fastcgi_param SCRIPT_FILENAME /var/www/html/test/$fastcgi_script_name;
include fastcgi_params;
}
include /etc/nginx/default.d/*.conf;
}
更多的nginx配置,请自行搜索。
#查看下载的镜像
docker images
#删除镜像
docker rmi imageName|Id
#查看所有容器
docker ps -a
#容器停止|启动|重启
docker stop|start|restart containerName|containerId
#例子
docker restart nginx
#删除容器,删除之前需要先停止
docker rm nginx
#批量删除容器
docker rm $(docker ps -a -q)
#查看容器IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql