docker-compose搭建nginx+php+mysql

2018-03-01 11:09:34来源:网络收集作者:人点击

分享
前言

上一篇 《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.7 tag。


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"




前言

上一篇 《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.7 tag。


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

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



浏览 index.php :




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


可以用 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 . "
";
echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL. "
";
echo "Debugging error: " . mysqli_connect_error() . PHP_EOL. "
";
exit;
} echo "Success: A proper connection to MySQL was made! The my_db database is great." . PHP_EOL. "
";
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


关于作者

我是键盘男。


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




前言

上一篇 《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.7 tag。


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

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



浏览 index.php :




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


可以用 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 . "
";
echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL. "
";
echo "Debugging error: " . mysqli_connect_error() . PHP_EOL. "
";
exit;
} echo "Success: A proper connection to MySQL was made! The my_db database is great." . PHP_EOL. "
";
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


关于作者

我是键盘男。


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

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台