docker-compose搭建nginx+php+mysql

前言

上一篇《docker入门——安装(CentOS)、镜像、容器》讲了docker镜像获取、启动容器等基本使用,本篇讲讲常用的php、nginx、mysql容器安装及关联。


镜像选择

nginx

nginx使用latest tag。

php

由于php比较多版本,读者在php offical选一个tag,本文使用7.2-fpm(笔者使用latest启动不起来,不知道为什么)。

PHP Dockerfile

要让php连接mysql,还要在docker官方的php镜像上,安装插件。于是,我们使用Dockerfile来构建一个新镜像。

新建php-mysqli目录:

$ mkdir php-mysqli
$ cd php-mysqli
$ vi Dockerfile

编辑Dockerfile,内容如下:

FROM php:7.2-fpm

RUN apt-get update \
    && apt-get install iputils-ping \
    && docker-php-ext-install mysqli && docker-php-ext-enable mysqli

FROM php:7.2-fpm表示基于php:7.2-fpm tag镜像;
RUN后面的指令,是创建完该镜像的容器后,再在容器上执行这些指令。

这里先不用手动build镜像,等会用docker-compose会自动build

关于Dockerfile参考 《Docker — 从入门到实践》——使用 Dockerfile 定制镜像

mysql

mysql offical,本文选5.7tag。


docker compose

官方Guide

安装

1.下载最新版(本文使用1.19.0):

sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

读者可以到Compose GitHub查看所有发布版本。

2.设置权限

sudo chmod +x /usr/local/bin/docker-compose

3.测试是否安装成功

$ docker-compose --version
docker-compose version 1.19.0, build 1719ceb

构建目录结构

我们做一个demo,新建如下目录结构:

php-nginx-compose/
├── conf.d
│   └── nginx.conf
├── docker-compose.yml
├── html
│   └── index.php
└── php-mysqli
    └── Dockerfile

php-mysqli

就是刚才在PHP Dockerfile中创建的目录,直接放在php-nginx-compose目录中。

docker-compose.yml:

version: '3'
services:
    nginx:
        image: nginx:latest
        # 端口映射
        ports:
            - "80:80"
        # 依赖关系 先跑php
        depends_on:
            - "php"
        # 数据卷
        volumes:
            # 映射主机./conf.d目录到容器/etc/nginx/conf.d目录
            - "$PWD/conf.d:/etc/nginx/conf.d"
            - "$PWD/html:/usr/share/nginx/html"
        networks:
            - app_net
        # 容器名称
        container_name: "compose-nginx"
    php:
        build: ./php-mysqli
        # image指定build Dockerfile生成镜像的名称
        image: php:7.2-fpm-mysqli
        ports:
            - "9000:9000"
        volumes:
            - "$PWD/html:/var/www/html"
        networks:
            - app_net
        container_name: "compose-php"
    mysql:
        image: mysql:5.7
        ports:
            - "3306:3306"
        # 环境变量
        environment:
            # mysql密码
            - MYSQL_ROOT_PASSWORD={自己填密码}
        networks:
            app_net:
                # 固定子网ip,网段必须在子网络10.10.*.*
                ipv4_address: 10.10.10.1
        container_name: "compose-mysql"
networks:
    # 配置docker network
    app_net:
        driver: bridge
        ipam:
            config:
                # 子网络
                - subnet: 10.10.0.0/16

关于Compose file配置,官方详细说明。网上还有一篇中文配置说明《如何写docker-compose.yml,Docker compose file 参考文档》。笔者建议先看官方文档,不懂了再找翻译。

conf.d/nginx.conf

server {
    listen       80;
    server_name  localhost;
    location / {
        root   /var/www/html;
        index  index.html index.htm index.php;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /var/www/html;
    }
    location ~ \.php$ {
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
        include        fastcgi_params;
    }
}

html/index.php

<?php
phpinfo();

启动服务

$ docker-compose up -d
Creating compose-php ... done
Creating compose-nginx ... done
Creating compose-mysql ...
Creating compose-nginx ...

查看是否启动成功:

 docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
aeb1f626516b        nginx:latest         "nginx -g 'daemon of…"   5 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp       compose-nginx
4e681d94c146        php:7.2-fpm-mysqli   "docker-php-entrypoi…"   7 seconds ago       Up 5 seconds        0.0.0.0:9000->9000/tcp   compose-php
fcdf6ac20bac        mysql:5.7            "docker-entrypoint.s…"   7 seconds ago       Up 5 seconds        0.0.0.0:3306->3306/tcp   compose-mysql

nginxphpmysql容器都启动了。如果三者没全启动,尝试再docker-compose up -d;如果还启动不成功,就排查一下是否配置有误。

浏览index.php

这个画面出现,证明nginxphp容器关联起来了。

可以用Navicat等数据库工具连接mysql,账号:root,密码是刚才配置的MYSQL_ROOT_PASSWORD环境变量的值,端口:3306

停止服务

1.docker-compose停止
2.docker命令停止

docker-compose停止

docker-compose up -d。即使用docker命令停止部分容器,也可以用docker-compose up来启动未成功启动的容器。

$ docker-compose stop
Stopping compose-nginx ... done
Stopping compose-php   ... done
Stopping compose-mysql ... done

docker命令停止

docker stop 容器名/容器id

重启服务

直接用docker-compose up -d重启即可,即使停止了部分容器。


php连接mysql

php-nginx-compose/html/目录,新建connect_mysql.php

<?php
// mysqli_connect参数:ip:port、账号、密码、数据库
$link = mysqli_connect("10.10.10.1:3306", "root", "密码", "mysql");

if (!$link) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL . "</br>";
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL. "</br>";
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL. "</br>";
    exit;
}

echo "Success: A proper connection to MySQL was made! The my_db database is great." . PHP_EOL. "</br>";
echo "Host information: " . mysqli_get_host_info($link) . PHP_EOL;

mysqli_close($link);
?>

ip是刚才docker-compose.yml配置的子网ip ipv4_address: 10.10.10.1。php语法参考官方文档:mysqli_connect

浏览connect_mysql.php

出现Success: A proper connection to MySQL was made! The my_db database is great. Host information: 10.10.10.1:3306 via TCP/IP证明连接mysql成功。

Demo

kkmike999/docker-compose-php-nginx-mysql


关于作者

我是键盘男。
在广州生活,在互联网公司上班,猥琐文艺码农。喜欢科学、历史,玩玩投资。

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