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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容