前言
上一篇《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-fpmRUN 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
安装
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
<?phpphpinfo();
启动服务
$ docker-compose up -d Creating compose-php ... doneCreating compose-nginx ... doneCreating 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 ... doneStopping compose-php ... doneStopping 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
关于作者
我是键盘男。
在广州生活,在互联网公司上班,猥琐文艺码农。喜欢科学、历史,玩玩投资。
作者:键盘男
链接:https://www.jianshu.com/p/0561d3cfccda
共同学习,写下你的评论
评论加载中...
作者其他优质文章