docker-compose的实践(lnmp的多容器服务)

前言

服务器技术日益高大上,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
      配置如下:
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
    原文作者:有时右逝
    原文地址: https://www.jianshu.com/p/53183a475c1d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞