Apa琦的博客

docker compose部署nginx,php,mysql

发布时间:3个月前热度: 144 ℃评论数:

docker compose部署nginx,php,mysql

同步滚动:

部署思路,编写docker-compose创建nginx,php,mysql三个容器,并把相应的路径映射到本地目录。

我的php框架为thinkphp6rc,前端为vue。我将tp6的入口文件改为home.php。访问 域名/home.php/xxxx/xxx是访问tp6,访问 域名/xxx/xxx则访问的是vue

ps:文章在Windows10下部署的,暂时未在linux上运行

Docker Compose是一个用来定义和运行复杂应用的Docker工具。使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成一切准备工作。

1.创建文件/文件夹

在电脑某个空目录下创建nginx,php,mysql,src文件夹和docker-compose.yml文件

说明:

  • nginx文件夹:存放nginx相关配置文件,
  • php文件夹:存放php的Dockerfile文件以及php.ini和php-fpm.conf
  • mysql文件夹:存放mysql的数据文件和配置文件
  • src文件夹:代码的部署目录
  • docker-compose.yml文件:docker-compose的配置文件

详细目录

├── nginx
|   └──nginx.conf #nginx配置文件
|   └──conf.d:
|      └──xxx.xxx.com.conf #自己的域名配置文件
├── php:
|   └──Dockerfile  #php的cockerFile 指定了镜像以及初始化的命令
|   └── php.ini #php配置文件
|   └── php-fpm.conf #php-fpm的文件
├── mysql:
|   └──data #mysql的数据文件
|   └──init
|       └──init.sql #初始化文件
|   └──my.conf#mysql的配置文件
├── src #代码文件
├── docker-compose.yml
  -

2.编写docker-compose.yml

具体如下

version: '2' #docker-compose语法的版本
services:
  nginx: #创建 nginx容器
    image: hub.c.163.com/library/nginx:latest #这里我直接用的网易的镜像库
    ports:  #映射 80和443端口到本机
      - 80:80
      - 4433:443
    volumes: 
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf  #把容器的nginx.conf映射到 ./nginx/nginx.conf,
      - ./nginx/conf.d:/etc/nginx/conf.d #把容器的conf.d映射到 ./nginx/conf.d
      - ./src:/var/www #把容器的/var/www 映射到./src
  php: #创建 php的容器
    build: ./php #直接到 ./php文件下找Dockerfile
    volumes:
      - ./src:/var/www #把容器的/var/www 映射到./src
      - ./php/php.ini:/usr/local/etc/php/php.ini #把容器的 php.ini映射到 ./php/php.ini
      - ./php/php-fpm.conf:/usr/local/etc/php-fpm.d/www.conf  #把容器的 php-fpm文件映射到 ./php/php-fpm.conf
  mysql:#mysql的容器
    image: hub.c.163.com/library/mysql:5.6 #直接用网易的镜像
    volumes:
      - ./mysql/data:/var/lib/mysql #把容器的数据文件夹映射到 ./mysql/data
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf #把容器的my.conf文件映射到 ./mysql/my.conf
      - ./mysql/init:/docker-entrypoint-initdb.d/ #把初始化的文件夹映射到 ./mysql/init
    ports: 
      - 3306:3306 #把容器的3306端口映射到本机的3306
    environment:
      - MYSQL_ROOT_PASSWORD=2LCqvSOJ6m0Ut6ui #root的喵喵
      - MYSQL_USER=test#另一个帐号
      - MYSQL_PASS=123#另一个帐号的密码

3.编写nginx相应文件

nginx.conf
这个基本固定

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
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;
    client_max_body_size 66M;
    gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

nginx\conf.d下的文件

server {
    listen       80;
    server_name  localhost;
    index index.php  index.html index.htm;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location / {
            root /var/www/public;
           index  index.html index.htm index.php;
           try_files $uri $uri/ /index.html;
           
           autoindex  off;
    }
    
    location ~ \.php($|/){
        fastcgi_pass   php:9000;
        fastcgi_param  SCRIPT_FILENAME   /var/www/public$fastcgi_script_name;
        fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
        fastcgi_param  PATH_INFO  $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  /var/www/public$fastcgi_path_info;
        proxy_cookie_path  /speedacc /;  
        include        fastcgi_params;
    }
    
  
}

上面的文件更目录为/var/www/public(本机的 ./src/public),由于tp根目录为public所以才解析到public中

fastcgi_pass php:9000;这个反向代理到了php容器中,在docker中容器之间可以使用名字来代替ip

4.编写php的相应文件

Dockerfile
这个里面指定了php的镜像地址(还是网易的),安装了php常用的一些扩展

alpine是非常轻量级的Linux系统,只有5M的大小,Docker官方也推荐在alpine上做镜像。

FROM hub.c.163.com/library/php:7.1-fpm-alpine

# packages
RUN apk --update add \
    autoconf \
    build-base \
    linux-headers \
    libaio-dev \
    zlib-dev \
    curl \
    git \
    subversion \
    freetype-dev \
    libjpeg-turbo-dev \
    libmcrypt-dev \
    libpng-dev \
    libtool \
    libbz2 \
    bzip2 \
    bzip2-dev \
    libstdc++ \
    libxslt-dev \
    openldap-dev \
    imagemagick-dev \
    make \
    unzip \
    wget && \
    docker-php-ext-install bcmath mcrypt zip bz2 pdo_mysql mysqli simplexml opcache sockets mbstring pcntl xsl && \
    docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && \
    pecl install imagick && \
    docker-php-ext-enable imagick && \
    pecl install swoole && \
    docker-php-ext-enable swoole && \
    docker-php-ext-install gd && \
    docker-php-ext-enable opcache && \
    apk del build-base \
    linux-headers \
    libaio-dev \
    && rm -rf /var/cache/apk/*




ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /tmp
ENV COMPOSER_VERSION 1.5.1


RUN curl -s -f -L -o /tmp/installer.php https://raw.githubusercontent.com/composer/getcomposer.org/da290238de6d63faace0343efbdd5aa9354332c5/web/installer \
 && php -r " \
    \$signature = '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410'; \
    \$hash = hash('SHA384', file_get_contents('/tmp/installer.php')); \
    if (!hash_equals(\$signature, \$hash)) { \
        unlink('/tmp/installer.php'); \
        echo 'Integrity check failed, installer is either corrupt or worse.' . PHP_EOL; \
        exit(1); \
    }" \
 && php /tmp/installer.php --no-ansi --install-dir=/usr/bin --filename=composer --version=${COMPOSER_VERSION} \
 && rm /tmp/installer.php \
 && composer --ansi --version --no-interaction

VOLUME /var/www
WORKDIR /var/www

CMD php-fpm

php.ini

date.timezone = "Asia/Shanghai"
display_errors = On
error_reporting = E_ALL
short_open_tag=Off
upload_max_filesize = 50M
post_max_size = 50M
memory_limit=512M

php-fpm.conf

[www]

user = www-data
group = www-data
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 50

; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 7

; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 5

; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 9

pm.max_requests = 5000

pm.status_path = /fpm-status.php

5.编写mysql相应文件

/init/init.sql
这个文件是初始化的文件,里面可以定义用户,权限,创建数据库等操作,
下面是一个栗子

#创建数据库
CREATE DATABASE test;
#给予test用户test数据库的权限
GRANT Alter, Alter Routine, Create, Create Routine, Create Temporary Tables, Create View, Delete, Drop, Event, Execute, Grant Option, Index, Insert, Lock Tables, References, Select, Show View, Trigger, Update ON `test`.* TO `test`@`%`;

#进入test数据库
use test;

#创建一个表
DROP TABLE IF EXISTS `qxwh_activity_event`;
CREATE TABLE `qxwh_activity_event`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NULL DEFAULT NULL
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

my.conf

[mysqld]
max_allowed_packet = 20M
innodb_buffer_pool_size=128M
query_cache_size=56M
key_buffer_size = 16M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
log-bin=/var/lib/mysql/binlog
server-id=344
binlog_format=ROW

6.部署代码

将代码部署到./src下,注意访问根目录为public
当然也可以手动创建一个文件来测试

  • 在 ./src下创建public文件夹并在public文件夹下创建home.php
    home.php
<?php
phpinfo();

7.运行

在docker-compose.yml同级目录下打开运行窗口
运行

docker-compose up

等执行完毕后访问 http://127.0.0.1/home.php就可以看到php的环境输出

9.docker-compose的命令

  • 开启所有服务:docker-compose up
  • 关闭所有服务:docker-compose down

10.文件下载

打包了一份到码云上面,src目录下已经有了一个thinkphp6rc4的源码,public入口文件为home.php

地址
https://gitee.com/cq-vip/cocker-composenpm/tree/master

11.参考文章

https://segmentfault.com/a/1190000012834069
https://blog.csdn.net/hjxzb/article/details/84927567

docker,compose,docker-compose,部署,php,nginx,mysql

栏目导航

  1. 杂谈
  2. PHP
  3. 建站
  4. WEB前端
  5. JAVA
  6. Go

手机扫码访问