前言

记录一下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容器内容目录结构如下:

nginx容器内容目录

#将容器内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


Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐