欢迎您, 来到 宁时修博客.^_^

Docker系列14--Docker Compose构建LNMP环境运行wordpress项目

2018/11/28 言则行 Docker 1142
Docker容器技术

    新建个目录,名为dnmp,路径 /usr/local/dnmp,目录结构:

├── db-data           # MySQL存储挂载源
├── docker-compose.yml     # docker-compose编排文件
├── logs            # 日志目录
│   ├── mysql
│   ├── nginx
│   └── php
├── mysql            # MySQL配置文件
│   └── my.cnf
├── nginx            # Nginx配置文件
│   ├── conf.d
│   └── nginx.conf
├── php-fpm           # php-fpm配置文件
│   ├── Dockerfile     # 构建php-fpm镜像
│   ├── php-fpm.conf
│   └── php.ini
└── webroot           # WEB项目目录
    └── wordpress      # PHP开源项目代码


    文件云盘分享:

    链接:https://pan.baidu.com/s/16CvnYiztcl31MMtehTk8tg 

    提取码:ptg1 



    

    为什么用Dockerfile方式构建php镜像,因为直接pull 拉取的镜像默认没有安装开发所需的一些扩展。DockerHub官方扩展示例:https://hub.docker.com/_/php/


    docker-compose.yml文件:

version: "3"         # docker-compose版本3
services:
  nginx:
    image: nginx     # 基础镜像,默认下载最新版
    container_name: dnmp_nginx    # 容器名
    ports:            # 映射端口
      - "80:80"
      - "443:443"
    volumes:       # 挂载卷
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./logs/nginx/:/var/log/nginx/:rw
      - ./webroot/:/var/www/html/:rw    # WEB项目路径要在nginx和php-fpm中都挂载
    networks:     # 自定义网络
      - web-net
    restart: always  # 进程意外退出时总是自动重启
    depends_on:   # 在php-fpm启动后再启动
      - php-fpm

  php-fpm:
    build:        # 构建php-fpm镜像
      context: ./php-fpm   # 构建上下文
      dockerfile: Dockerfile  # Dockerfile文件
    container_name: dnmp_php  # 容器名
    expose:      # 暴露端口,但不映射到宿主机,只被连接的服务访问
      - "9000"
    volumes:    # 挂载卷
      - ./php-fpm/php-fpm.conf:/etc/php/php-fpm.conf:ro
      - ./php-fpm/php.ini:/etc/php/php.ini:ro
      - ./logs/php/:/var/log/php/:rw
      - ./webroot/:/var/www/html/:rw   # WEB项目路径要在nginx和php-fpm中都挂载
    networks:     # 自定义网络
      - web-net
    restart: always
    depends_on:   # 在mysql启动后再启动
      - mysql

  mysql:
    image: mysql:5.6
    container_name: dnmp_mysql
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/my.cnf:/etc/mysql/my.cnf:ro
      - ./logs/mysql/:/var/log/mysql/:rw
      - ./db-data/:/var/lib/mysql/:rw
    environment:  # 环境变量
      MYSQL_ROOT_PASSWORD: rootpasswd  # 设置mysql root用户密码
      MYSQL_DATABASE: wordpress  # 创建新库
      MYSQL_USER: wordpress    # 用户
      MYSQL_PASSWORD: wordpress  # 密码
    networks:
      - web-net
    restart: always

networks:     # 自定义网络
  web-net:


    在docker-compose.yml所在目录下,执行 docker-compose up构建容器。

    然后将WEB项目wordpress代码放到 webroot下,浏览器访问http://宿主机IP/wordpress 即可。




注意:

    1)为什么nginx和php-fpm两个容器都要挂载WEB项目目录?

        因为这两个容器都要读取代码。


    2)php找不到文件,访问页面报404,所以Nginx配置文件内nginx和php需要指定相同的路径

    location / {
        root   /var/www/html;
        index  index.html index.htm index.php;
    }
    
    location ~ \.php$ {
        root /var/www/html;
        fastcgi_pass   dnmp_php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }



    3)fastcgi_pass需要指向php容器

fastcgi_pass   dnmp_php:9000;


    这个可以是以下任意一个:

  php-fpm:    # docker-compose服务名
    container_name: dnmp_php  # docker-compose容器名



    4)如果nginx转发php解析失败。主要问题是php的服务需要修改php-fpm监听地址,默认监听127.0.0.1地址。php-fpm.conf文件内修改成监听任意地址。

listen = 9000


    5)wordpress设置数据库连接

        0634.png

    数据库名、用户名、密码都在docker-compose.yml文件中设置了:

      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

    数据库主机填写以下任意一个:

  mysql:   # docker-compose服务名
    container_name: dnmp_mysql   # docker-compose容器名


    

    如果不能写入wp-config.php文件,就手动写入。



    6)不建议将mysql容器化,参考:https://studygolang.com/articles/9436

    1、容器化应用程序一般都是无状态的,例如一些php,nginx,有状态的是指一些有数据存储的

    2、不能保证数据安全,虽然 -v 参数能映射外部目录的数据,但是程序多了一层映射,多了些处理,也觉得无必要

    3、单机的mysql都是瓶颈了,在单机里再运行mysql容器不合适


    不是说不能MySQL容器化,只是说不合适,其中的取舍看项目的需求。



wordpress展示:

    1217.png


点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群