前言
服务器技术日益高大上,docker持续火热。作为一个开发者,不使用docker,那就太落后。从去年就开始接触docker,在本地的开发中也使用了dokcer.但是还是处于不熟练状态。这2天抽空研究了docker-compose,将docker多容器组合进行了实践,以方便后期的软件部署的需要。
文件地址
问题
使用docker-compose 实现Lnmp的搭建。
linux+nginx+mysql+php
docker 好处:
- 环境的一致性。本地,测试,生产环境不再存在差异。
- 生产环境下,运维的自动化和扩容方便。容易复制和迁移。
docker-compose的好处:
- 批量管理docker,省时省力。
解决
- 在本地创建一个文件夹,里面结构如下:
├── README.md
├── db_data 数据库文件存储目录
├── docker-compose.yml docker-compose的配置文件
├── mysql
│ └── Dockerfile mysql的dockfile文件。这里没用到。是空白
├── nginx
│ ├── Dockerfile nginx的dockfile文件
│ └── default.conf nginx的配置
├── php-fpm
│ ├── Dockerfile php的dockfile文件
│ ├── php.ini php的配置文件
│ ├── php.ini-development php的开发配置文件
│ └── php.ini-production php的生产配置文件
└── web php项目代码
├── db.sql 数据库文件
├── index.html
├── index.php
└── mysql.php
- 介绍下docker-compose的配置文件
#版本号
version: "3"
#服务
services:
#mysql服务
db:
#服务器镜像
image: mysql:latest
#磁盘映射。./db_data 是宿主的目录。后者是容器里的目录。
volumes:
- ./db_data:/var/lib/mysql
restart: always
# 端口映射。前者是宿主的。后者是容器里端口
ports:
- "3307:3306"
#环境变量
environment:
#mysql的root密码
MYSQL_ROOT_PASSWORD: 123456
#容器会创建的数据库
MYSQL_DATABASE: testdb
#test用户
MYSQL_USER: test
#test用户的密码
MYSQL_PASSWORD: 123456
#php-fpm服务
php:
volumes:
- ./web:/www/web
#依赖的服务。会在容器里的host文件里添加 一条记录。访问db,即可访问mysql的服务。
depends_on:
- db
#服务器镜像构建的目录。会在该目录下寻找dockerfile构建镜像。
build: ./php-fpm
restart: always
#nginx服务
nginx:
depends_on:
- php
volumes:
- ./web:/www/web
build: ./nginx
ports:
- "81:80"
restart: always
- 安装步骤
nginx的基础镜像
docker pull daocloud.io/library/nginx:1.13.0
php的基础镜像
docker pull daocloud.io/library/php:7.0.20-fpm
mysql的基础镜像
docker pull mysql:latest
执行服务编排,创建容器,启动php mysql nginx
docker-compose up -d
- 访问测试
测试nginx
http://localhost:81/
测试phpinfo
http://localhost:81/index.php
测试数据库
http://localhost:81/mysql.php
- 遇到的坑
- php找不到文件路径。
nginx服务和php服务需要映射相同的路径。例如这里都是/www/web
配置如下:
- php找不到文件路径。
location ~ \.php$ {
root /www/web;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www/web/$fastcgi_script_name;
include fastcgi_params;
}
- nginx转发php解析失败。
主要问题是php的服务需要修改配置,默认的配置php-fpm只监控127.0.0.1地址。需要修改监控任意地址。
RUN sed -i -e 's/listen = 127.0.0.1:9000/listen = 9000/' /usr/local/etc/php-fpm.d/www.conf
- php服务无法连接mysql配置。
主要是php扩展的问题。这个问题其实很奇怪,按理基础镜像里应该包含这个。不知道为何没有。
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
- 补充命令。
停止容器
docker-compose stop
删除容器
docker-compose rm