V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
WangYan
V2EX  ›  分享创造

Docker image for lnmp

  •  
  •   WangYan ·
    wangyan · 2016-09-04 13:10:06 +08:00 · 4222 次点击
    这是一个创建于 3011 天前的主题,其中的信息可能已经有所发展或是发生改变。

    基于 Ubuntu 16.04 构建,一键自动安装最新版的 php7,支持使用外部MySQL数据库以及Composer组件。

    项目地址

    GitHub : https://github.com/wangyan/docker-lnmp

    国内镜像: https://git.wangyan.org/root/docker-lnmp

    一、安装 Docker

    关于 Docker 更多信息,请访问其官网。https://docs.docker.com

    debian

    apt-get update && \
    apt-get -y install curl && \
    curl -fsSL https://get.daocloud.io/docker | sh \
    update-rc.d -f docker defaults && \
    service docker start
    

    CentOS

    yum update && \
    curl -fsSL https://get.docker.com/ | sh && \
    systemctl enable docker.service && \
    systemctl start docker.service
    

    二、安装外部 MySQL 数据库

    如果你想使用内置的数据库,请忽略此步骤(二)(三),直接跳到步骤(四)

    2.1 安装 MySQL 数据库

    注意将123456换成你的 MySQL Root 密码

    docker run --name mysql \
    -v /var/lib/mysql:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -p 3306:3306 \
    -d mysql:latest
    

    2.2 安装 phpMyAdmin (可选)

    温馨提示:国内主机请将 idiswy/phpmyadmin:latest 换成 docker.wangyan.org/root/docker-phpmyadmin:latest

    docker run --name phpmyadmin \
    --link mysql:mysql \
    -p 8080:80 \
    -P -d idiswy/phpmyadmin:latest
    

    三、安装 LNMP (外部数据库)

    • -name 容器名称
    • -link 链接步骤(二)装好的外部数据库
    • -v 左边是宿主机路径,右边是容器里的路径

    温馨提示:国内主机请将 idiswy/lnmp:latest 换成 docker.wangyan.org/root/docker-lnmp:latest

    docker run --name wangyan \
    --link mysql:mysql \
    -v /home/wangyan:/home/wangyan \
    -p 80:80 \
    -p 443:443 \
    -d idiswy/lnmp:latest
    

    四、安装 LNMP (内置数据库)

    在一个容器中,一键安装全套的LNMP,但如果你想使用外部数据库,请返回到步骤(二)开始安装

    4.1 安装 LNMP

    • -name 容器名称
    • -v 左边是宿主机路径,右边是容器里的路径
    • -MYSQL_ROOT_PASSWORD 设置 MySQL Root 密码

    温馨提示:国内主机请将 idiswy/lnmp:latest 换成 docker.wangyan.org/root/docker-lnmp:latest

    docker run --name wangyan \
    -v /home/wangyan:/home/wangyan \
    -p 80:80 \
    -p 443:443 \
    -d idiswy/lnmp:latest
    

    4.2 配置内置 MySQL 数据库

    注意将123456换成你的 MySQL Root 密码

    docker exec -it wangyan mysql-setup MYSQL_ROOT_PASSWORD=123456
    

    4.3 安装内置 MySQL 数据库时,可额外选用的变量

    • MYSQL_USER
    • MYSQL_PASSWORD
    • MYSQL_DATABASE
    docker exec -it wangyan mysql-setup \
    MYSQL_ROOT_PASSWORD=123456  \
    MYSQL_USER=wangyan \
    MYSQL_PASSWORD=123456 \
    MYSQL_DATABASE=test
    

    五、其他

    5.1 快捷进入容器

    首先,安装个小工具

    curl --fail -L -O https://github.com/phusion/baseimage-docker/archive/master.tar.gz && \
    tar xzf master.tar.gz && \
    ./baseimage-docker-master/install-tools.sh
    

    然后,进入容器

    docker-bash wangyan
    

    5.2 配置文件路径

    nginx: /etc/nginx/nginx.conf

    nginx site conf: /etc/nginx/conf.d/default.conf

    nginx site html: /var/www/

    nginx logs: /var/log/nginx/

    php5: /etc/php/fpm/php.ini

    php7: /etc/php/7.0/fpm/php.ini

    5.3 启动、重启操作

    sv start|stop|status <service_folder>
    例如: sv restart nginx
    

    via 《使用 runit 管理服务 》

    5.4.设置中国时区

    Debbian

    rm -rf /etc/localtime && \
    ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone && \
    apt-get -y install ntpdate && ntpdate -d cn.pool.ntp.org
    

    CentOS 7

    via http://blog.wangyan.org/linux-centos-timedatectl

    imedatectl set-timezone Asia/Shanghai
    timedatectl set-ntp yes 
    

    5.5 mail 发邮件

    dpkg-reconfigure exim4-config
    

    六、了解更多

    关于lnmp更多信息,请访问lnmp主页。http://blog.wangyan.org/docker-lnmp

    更多使用帮助请阅读wiki,其他问题欢迎在issues中反馈。

    第 1 条附言  ·  2016-09-05 02:22:44 +08:00
    放在一个容器里相当于一个小型虚拟机,功能完整更加灵巧。喜欢编排 alpine 的,可以直接用 11 楼的代码,或者在 docker-compose.yml 中编排官方版的 nginx/php/mysql/都很快。青菜萝卜各有所好,不喜欢的人请默默走开吧!
    17 条回复    2017-10-17 12:27:56 +08:00
    htfy96
        1
    htfy96  
       2016-09-04 13:14:22 +08:00 via Android
    不如 docker-compose …
    ivmm
        2
    ivmm  
       2016-09-04 13:21:47 +08:00
    怎么办,我还是喜欢自己编译。。。

    感觉已经跟不上时代了,真心觉得 docker 没有编译的好用。。。。。。
    crazycen
        3
    crazycen  
       2016-09-04 13:39:39 +08:00 via iPhone
    好复杂,还不如自己编译了!!!
    WangYan
        4
    WangYan  
    OP
       2016-09-04 13:46:23 +08:00
    @ivmm 刚接触 linux 的时候也是喜欢大包小包都编译,慢慢的就会觉得纯属瞎折腾...
    cxbig
        5
    cxbig  
       2016-09-04 13:46:49 +08:00
    写个 docker-compose 。。。一个个命令跑人家怎么用。。。
    WangYan
        6
    WangYan  
    OP
       2016-09-04 13:52:51 +08:00
    文档写得详细了就觉得复杂。。。其实就下面两行代码,复制粘贴两次就可以了。。

    ```
    docker run --name wangyan -p 80:80 -p 443:443 -d idiswy/lnmp:latest
    docker exec -it wangyan mysql-setup MYSQL_ROOT_PASSWORD=123456
    ```
    necpowman
        7
    necpowman  
       2016-09-04 14:28:38 +08:00
    docker-compose
    做编排
    Bardon
        8
    Bardon  
       2016-09-04 16:59:38 +08:00
    1. docker-compose
    2. alpine

    楼主落伍了。
    9hills
        9
    9hills  
       2016-09-04 17:05:58 +08:00 via iPhone
    你把 LNMP 放到一个容器内,用 Docker 干毛啊,老老实实用 VM 不就好了么

    很多人吐槽 Docker ,但大多数只是被 LZ 这种奇葩用法给误导了罢了……
    icybee
        10
    icybee  
       2016-09-04 17:13:45 +08:00
    看了楼上的吐槽,我只能说。。。。。。。。。确实有点道理
    Havee
        11
    Havee  
       2016-09-04 17:14:24 +08:00   ❤️ 1
    一个容器一个服务,不要堆砌,另外,建议容器基于 apline linux 来构建,轻量,小巧。譬如:

    https://hub.docker.com/r/registercn/php/
    https://hub.docker.com/r/registercn/nginx/
    https://hub.docker.com/r/registercn/mariadb/

    运行的时候,采用 docker-compose ,譬如

    version: '2'

    services:
    mariadb:
    container_name: mariadb
    image: registercn/mariadb
    volumes:
    - /your/mysql/path:/var/lib/mysql
    restart: always
    phpfpm:
    container_name: phpfpm
    image: registercn/php:5
    volumes:
    - /your/web/path:/var/www
    links:
    - mariadb
    restart: always
    nginx:
    container_name: nginx
    image: registercn/nginx
    ports:
    - "80:80"
    - "443:443"
    volumes:
    - /var/web/web:/var/www
    - ./nginx/conf.d:/etc/nginx/conf.d:ro
    links:
    - phpfpm
    restart: always

    web 应用中, mysql 的 host 填 mariadb
    nginx.conf 中的 fastcgi_pass 为 phpfpm:9000 ,譬如

    server {
    listen 80;
    server_name www.domain.com;
    root /var/www/www.domain.com;
    index index.html;

    location ~ .*\.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass phpfpm:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }
    Havee
        12
    Havee  
       2016-09-04 17:21:06 +08:00   ❤️ 3
    xiqingongzi
        13
    xiqingongzi  
       2016-09-04 19:01:49 +08:00 via Android
    @ivmm 大规模集群必须上镜像,不然会跪的。
    ivmm
        14
    ivmm  
       2016-09-04 23:21:36 +08:00
    @Havee
    alpinelinux 要是版本能像 archlinux 那样新就好了。 php 没有 7
    WangYan
        15
    WangYan  
    OP
       2016-09-05 02:31:12 +08:00
    @ivmm

    有 php7 的,所有包在官网都可以找到。 <https://pkgs.alpinelinux.org/packages>
    ivmm
        16
    ivmm  
       2016-09-05 09:16:01 +08:00
    @WangYan 噗, php 竟然不能搜索出 php7 ...... 这个设计还是不怎么合理啊
    yeszao
        17
    yeszao  
       2017-10-17 12:27:56 +08:00
    实用!!
    一键部署就用《 Docker 搭建可一键部署的多域名 LNMP 环境》 https://www.awaimai.com/2120.html
    细节讲得很到位
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3526 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:13 · PVG 19:13 · LAX 03:13 · JFK 06:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.