前言
记录一下docker部署web服务器流程。nginx,mysql,php不同的版本配置内容可能会不同。
docker常用命令
一、创建挂载目录
- 目录结构
└── data
├── docker
│ ├── mysql
| ├── conf
| ├── data
| └── logs
│ ├── php
| ├── conf.d
| └── php.ini(文件)
│ ├── nginx
| ├── conf.d
| └── cert
| ├── log
| └── nginx.conf(文件)
├── www
│ ├── project
| ├── index.php(文件)
│ ├── project02
- 创建目录
#挂载 nginx 目录
mkdir -p /data/docker/nginx/conf.d #nginx子配置文件目录
mkdir -p /data/docker/nginx/log #nginx日志文件目录
mkdir -p /data/docker/nginx/cert #nginxSSL文件目录
mkdir -p /data/www/ #工作目录
#挂载 php 目录
mkdir -p /data/docker/php/conf.d #php-fpm配置文件目录
#挂载 mysql 目录
mkdir -p /data/docker/mysql/conf #mysql配置文件目录
mkdir -p /data/docker/mysql/logs #mysql日志文件目录
mkdir -p /data/docker/mysql/data #mysql数据文档存储目录
二、拉取镜像
#获取 ngin x镜像(未指定版本则安装latest)
docker pull nginx
#获取 mysql 镜像
docker pull mysql:5.7
#获取 php-fpm 镜像
docker pull php:7.3-fpm
#查看镜像
docker images
三.运行容器
- 运行PHP容器
#首先我们先简单的将容器启动,将容器内的php.ini和扩展文件复制到宿主机中
#容器启动会返回容器id,我们先假设容器id为:575be6407893 后面理解方便 ,后续使用中可以直接取容器前几位字符使用
docker run -d --name php -p 9000:9000 php:7.3-fpm
# 查看正在运行的容器
docker ps 575b
#查看全部容器
docker ps -a
#进入容器内
docker exec -it 575b bash
#进入php.ini配置目录
cd /usr/local/etc/php
php容器内容目录结构如下:
PHP5.4升级后,php.ini-dist不见了,出现了php.ini-developmen和php.ini-production。
php.ini-development 对应于 php.ini-dist,适合开发测试,如本地测试环境。
php.ini-production 对应于 php.ini-recommended 拥有较高的安全性设定,适合服务器上线运营当产品。
选择用哪个,就把他备份一份,改名为php.ini。
#将容器内conf.d和php.ini-production复制到宿主机内
docker cp 575b:/usr/local/etc/php/conf.d /data/docker/php/
docker cp 575b:/usr/local/etc/php/php.ini-production /data/docker/php/php.ini
#配置文件已有,接下来我们将该容器删除重新启动新容器
docker rm -f 575b (删除正在运行的容器)
#容器启动
docker run --name php7.3 -p 9000:9000 \
-v /data/www:/var/www \
-v /data/docker/php/php.ini:/usr/local/etc/php/php.ini \
-v /data/docker/php/conf.d:/usr/local/etc/php/conf.d -d php:7.3-fpm
# 参数说明
# --name php7.3:容器名称。
# -p 9000:9000: 端口进行映射,将本地 9000端口映射到容器内部的 9000端口。
# -v 目录映射: 主机和容器的目录映射关系,":"前为主机目录,之后为容器目录 :ro 表示只读
# -d php:7.3-fpm: 设置容器在在后台一直运行,这个php:7.3-fpm是指定镜像
- 运行Nginx容器
#复制nginx配置项 返回容器id:095a12add634
docker run -d -p 80:80 -p 443:443 --name nginx nginx
#进入容器内
docker exec -it 095a12add634bash
#进入nginx.conf配置目录
cd /etc/nginx/
nginx容器内容目录结构如下:文章来源:https://www.toymoban.com/news/detail-856789.html
文章来源地址https://www.toymoban.com/news/detail-856789.html
#将容器内conf.d和nginx.conf复制到宿主机内
docker cp 095a12add634:/etc/nginx/nginx.conf /data/docker/nginx/
docker cp 095a12add634:/etc/nginx/conf.d /data/docker/nginx/
#配置文件已有,接下来我们将该容器删除重新启动新容器
docker rm -f 095a12add634(删除正在运行的容器)
#容器启动
docker run -d -p 80:80 -p 443:443 \
-v /data/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /data/docker/nginx/conf.d:/etc/nginx/conf.d \
-v /data/docker/nginx/log:/var/log/nginx \
-v /data/docker/nginx/cert:/etc/nginx/cert \
-v /data/www:/var/www \
--link=php:php --name nginx nginx
# 参数说明
# --link=php:php 设置 nginx容器和php容器网络互通,也可以使用网络通讯创建网桥方式
# 映射文件目录时尽量要使nginx和php映射目录保持一致,我这里都映射了/var/www,不一致可能会报错
- 运行Mysql容器
#运行命令生成my.cnf文件
tee /data/docker/mysql/conf/my.cnf <<-'EOF'
[mysql]
#设置mysql客户端默认字符集
default-character-set=UTF8MB4
[mysqld]
#设置3306端口
port=3306
#允许最大连接数
max_connections=200
#允许连接失败的次数
max_connect_errors=10
#默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
#服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=UTF8MB4
#开启查询缓存
explicit_defaults_for_timestamp=true
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#等待超时时间秒
wait_timeout=60
#交互式连接超时时间秒
interactive-timeout=600
secure_file_priv=/var/lib/mysql
[client]
default-character-set=UTF8MB4
EOF
#运行容器
docker run --privileged -d -p 3306:3306 \
-v /data/docker/mysql/conf:/etc/mysql \
-v /data/docker/mysql/logs:/var/log/mysql \
-v /data/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root --name mysql3306 mysql:5.7
#参数说明
#--privileged 让容器中的进程获取到主机的完整权限,包括root权限
#-e MYSQL_ROOT_PASSWORD=root 配置mysqlroot密码
四.运行项目
#nginx.conf 文件配置内容
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
#切换目录 cd /data/docker/nginx/conf.d 新建项目配置
server {
listen 80;
#listen [::]:80;
#For https
#listen 443 ssl;
#listen [::]:443 ssl ipv6only=on;
#ssl_certificate /etc/nginx/ssl/www.crt;
#ssl_certificate_key /etc/nginx/ssl/www.key;
server_name abc.com; #访问域名
index index.php index.html index.htm default.html default.htm default.php;
root /var/www/project; #访问项目目录
location ~ \.php$ {
fastcgi_pass php:9000; # 这里的php指链接到php的容器名称,即 --link=php:php
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#错误日志
access_log /var/log/nginx/project.access.log;
error_log /var/log/nginx/project.error.log;
}
#切换到项目目录随便输出点内容(内容自己创建)
cd /data/docker/www/project
#重启nginx容器
docker restart 容器id
到了这里,关于docker 部署 nginx+php+mysql 环境的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!