基于 CentOS 的 Docker LNMP 集成开发环境

[隐藏]

《基于 CentOS 的 Docker LNMP 集成开发环境》

前言

说明:
使用Docker构建的开发环境:Nginx、MySQL、Redis、PHP5.6、PHP7.1、PHP7.2、Memcached、支持 xdebug、Composer

制作 Docker 镜像文件选择 CentOS

为什么 Docker中选择CentOS还是Ubuntu/Debian,在知乎上有文章介绍;而 CentOS 更加适合商业服务器,原因如下:

CentOS(可以说)更稳定以及更安全。由于 CentOS 的更新频率较低,这意味着软件测试的时间更长,并且只有真正稳定的版本才会得到发布。如果你使用 CentOS,你不会因新的有 bug 的应用程序版本而遇到任何稳定性问题,因为你不会得到那个新的有 bug 的版本。

LNMP 结构

开发环境的结构,如下图:
《基于 CentOS 的 Docker LNMP 集成开发环境》

快速部署 Docker CentOS LNMP

根据系统Linux,MacOS 安装 docker and docker-compose , 镜像加速器 使用阿里云。

docker默认从DockerHub仓库下载镜像,更换途径,使用阿里云的加速Docker仓库,注册一个阿里云账号,然后访问阿里云的Docker镜像仓库,能找到加速器地址。

https://cr.console.aliyun.com/cn-beijing/mirrors

根据镜像加速器 选项卡配置 加速器

1. 加速器

使用加速器可以提升获取Docker官方镜像的速度
我的加速器地址:https://j8o6nfq0.mirror.aliyuncs.com 你也可以直接使用。

2. 安装 docker

你也可以安装你自己的相应的版本,以下以安装 Mac 版本为例:

 * 安装/升级 Docker 客户端
    对于10.10.3以下的用户 推荐使用 Docker Toolbox

    Mac安装文件:<http://mirrors.aliyun.com/docker-toolbox/mac/docker-toolbox/>

    对于10.10.3以上的用户 推荐使用 Docker for Mac

    Mac 安装文件:<http://mirrors.aliyun.com/docker-toolbox/mac/docker-for-mac/>

* 配置镜像加速器  
  针对安装了 Docker for Mac 的用户,您可以参考以下配置步骤:  
  右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签(Docker 17.03 之前版本为 Advanced 标签)下的 Registry mirrors 列表中将  
  https://j8o6nfq0.mirror.aliyuncs.com 加到 "registry-mirrors" 的数组里,点击 Apply & Restart 按钮,等待 Docker 重启并应用配置的镜像加速器。

3. 从阿里云 Registry 中拉取镜像


docker pull registry.cn-beijing.aliyuncs.com/dnmp/dnmp_nginx:latest docker pull registry.cn-beijing.aliyuncs.com/dnmp/dnmp_php-7.2:latest docker pull registry.cn-beijing.aliyuncs.com/dnmp/dnmp_php-7.1:latest docker pull registry.cn-beijing.aliyuncs.com/dnmp/dnmp_php-5.6:latest docker pull registry.cn-beijing.aliyuncs.com/dnmp/dnmp_memcached:latest docker pull registry.cn-beijing.aliyuncs.com/dnmp/dnmp_redis:latest docker pull registry.cn-beijing.aliyuncs.com/dnmp/dnmp_mysql:latest docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.cn-beijing.aliyuncs.com/dnmp/dnmp_nginx latest a1c7de60a1bc 2 hours ago 17.7MB registry.cn-beijing.aliyuncs.com/dnmp/dnmp_php-7.2 latest e4520299e968 2 hours ago 806MB registry.cn-beijing.aliyuncs.com/dnmp/dnmp_php-7.1 latest 4b0bd4563162 5 hours ago 890MB registry.cn-beijing.aliyuncs.com/dnmp/dnmp_php-5.6 latest a6d260ec1ba8 5 hours ago 905MB registry.cn-beijing.aliyuncs.com/dnmp/dnmp_memcached latest c1eb398ad98c 5 hours ago 15.6MB registry.cn-beijing.aliyuncs.com/dnmp/dnmp_redis latest 8e1de2836763 6 hours ago 94.9MB registry.cn-beijing.aliyuncs.com/dnmp/dnmp_mysql latest 57b9ce70d5ba 6 hours ago 372MB

4. tag 镜像

docker  tag a1c7de60a1bc dnmp_nginx    
docker  tag 4b0bd4563162 dnmp_php-7.1 
docker  tag 4b0bd4563162 dnmp_php-7.2
docker  tag a6d260ec1ba8 dnmp_php-5.6 
docker  tag c1eb398ad98c dnmp_memcached 
docker  tag 8e1de2836763 dnmp_redis 
docker  tag 57b9ce70d5ba dnmp_mysql 

5. 下载集成开发环境包

从Github上下载

github仓库地址:https://github.com/heguangzhi/dnmp.git

$git clone  https://github.com/heguangzhi/dnmp.git

6. 启动docker容器:
$cd dnmp 
$docker-compose up -d
$docker ps 

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES
04f0bf45a8dc        dnmp_nginx          "nginx -g 'daemon ofΒ   2 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   dnmp_nginx_1
f504799df2a7        dnmp_php-5.6        "/usr/bin/supervisord"   2 minutes ago       Up 3 minutes        9000/tcp                                   dnmp_php-5.6_1
754cf783cd67        dnmp_php-7.2        "/usr/bin/supervisord"   2 minutes ago       Up 3 minutes        9000/tcp                                   dnmp_php-7.2_1
fa3b3ab309d4        dnmp_php-7.1        "/usr/bin/supervisord"   2 minutes ago       Up 3 minutes        9000/tcp                                   dnmp_php-7.1_1
a73eab5efff0        dnmp_memcached      "docker-entrypoint.sΒ   2 minutes ago       Up 3 minutes        0.0.0.0:11211->11211/tcp                   dnmp_memcached_1
b0795867d8c9        dnmp_mysql          "docker-entrypoint.sΒ   2 minutes ago       Up 3 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp          dnmp_mysql_1
6ff1bbfd6591        dnmp_redis          "docker-entrypoint.sΒ   2 minutes ago       Up 3 minutes        0.0.0.0:6379->6379/tcp                     dnmp_redis_1

7. 查看容器启动

在浏览器中查看 如下图所示:

《基于 CentOS 的 Docker LNMP 集成开发环境》

8. 目录结构

目录结构如下:

.
├── docker-compose.yml          容器启动配置文件
├── conf                        配置目录
│   ├── mysql                   MySQL 配置文件目录
│   │   └── my.cnf              MySQL 配置文件
│   ├── redis                   Rids 配置文件目录
│   │   └── redis.conf          Rids 配置文件
│   ├── nginx                   Nginx配置文件目录
│   │   ├── conf.d              站点配置文件目录
│   │   │   ├── certs           SSL认证文件、密钥和加密文件目录
│   │   │   │   └── site2       站点2的认证文件目录
│   │   │   ├── www.site1.com.conf  站点1 Nginx配置文件
│   │   │   └── www.site2.com.conf  站点2 Nginx配置文件
│   │   └── nginx.conf          Nginx 通用配置文件
│   └── php-5.6                 PHP 配置目录
│   │   ├── php-fpm.d           PHP-FPM 配置目录
│   │   │   └── www.conf        PHP-FPM 配置文件
│   │   └── php.ini             PHP 配置文件
│   └── php-7.1                 PHP 配置目录
│   │   ├── php-fpm.d           PHP-FPM 配置目录
│   │   │   └── www.conf        PHP-FPM 配置文件
│   │   └── php.ini             PHP 配置文件
│   └── php-7.2                 PHP配置目录
│       ├── php-fpm.d           PHP-FPM配置目录
│       │   └── www.conf        PHP-FPM配置文件
│       └── php.ini             PHP配置文件
├── log                         日志目录
│   ├── mysql                   MySQL 日志目录
│   ├── nginx                   Nginx 日志目录
│   └── php-fpm                 PHP-FPM 日志目录
├── mysql                       MySQL 数据文件目录
└── www                         站点根目录
│   ├── www.sit1.com            站点1根目录
│   └── www.sit2.com            站点2根目录
│ 
└── php                         PHP Dockfiles
│ 
└── other                       Nginx、Redis、MySQL、Memcached Dockfiles

9. 站点部署

默认加了两个站点:www.site1.com(同 localhos t)和www.site2.com, 在www站点目录中,在 Nginx conf 目录也有相应的配置文件

要在本地访问这两个域名,需要修改本机hosts文件,添加以下两行:

127.0.0.1 www.site1.com
127.0.0.1 www.site2.com

其中,www.site2.com为支持SSL/https和HTTP/2的示例站点。

因为站点2的SSL采用自签名方式,所以浏览器有安全提示,继续访问就可以了,自己的站点用第三方SSL认证证书替换即可。

如果只用到站点1,把站点2相关的目录和配置文件删除:

./conf/nginx/conf.d/certs/site2/
./conf/nginx/conf.d/site2.conf
./www/site2/

重启容器内的Nginx生效:

$docker-compose  restart nginx 

nginx 为docker-compose.yml 规定的服务名(service)

10. 切换不同的PHP版本

找到nginx虚机配置文件
例如: www.site1.com.conf 修改nginx配置文件:

location ~ \.php$ {
    fastcgi_pass   fpm-5.6:9000;
    fastcgi_index  index.php;
    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}

仅需把fastcgi_pass改成:fpm-7.1:9000 ; PHP-FPM的侦听主机改成:Nginx links PHP-FPM service的别名,在docker-compose.yml文件里面我们设置为service别名,例如 php-7.2 为fpm-7.2、php-7.1为fpm-7.1。

具体查看 docker-compose.yml文件

links:
    - php-7.2:fpm-7.2
    - php-7.1:fpm-7.1
    - php-5.6:fpm-5.6

Nginx容器启动的时候,就会自动修改nginx容器的/etc/hosts,让fpm-* 指向php-* 容器的IP。

修改之后,重启容器中的nginx:

$docker-compose  restart nginx 

11. 使用MySQL数据库

docker-compose.yml文件中,指定了MySQL数据库root用户的密码为123456。
在主机终端中输入密码,就可以进入MySQL命令行。

$ mysql -h 127.0.0.1 -u root -p

也可以通过数据库管理软件 navicat 连接MySQL数据库。

在PHP代码中的使用方式与在主机中使用稍有不同,如下:

$pdo = new PDO('mysql:host=mysql;dbname=****', 'root', '123456');

其中,host的值就是在docker-compose.yml里面指定的MySQL服务的别名。

这是因为PHP代码是在PHP-FPM容器中,PHP-FPM容器启动时会自动在/etc/hosts中加上,可能在你的机器上 IP 有差别:

172.17.0.2 mysql 11e55f91c4c3 dnmp_mysql_1

就是说,mysql 自动指向了 MySQL 容器动态生成的 IP。

12. 使用Redis

Redis使用和MySQL类似。在主机和容器内部都通过地址 127.0.0.1,端口 6379 访问。PHP 则是跨容器访问,host是参数用redis(links指定的名称),端口用6379。

构建集成开发环境

1. 从Github上下载

github仓库地址:https://github.com/heguangzhi/dnmp.git

$git clone  https://github.com/heguangzhi/dnmp.git

2. 构建 LNMP

$cd dnmp  
$docker-compose  build 

需要等待一段时间。

$docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
dnmp_nginx          latest              a1c7de60a1bc        13 seconds ago      17.7MB
dnmp_php-7.2        latest              e4520299e968        33 seconds ago      806MB
dnmp_php-7.1        latest              4b0bd4563162        3 hours ago         890MB
dnmp_php-5.6        latest              a6d260ec1ba8        3 hours ago         905MB
dnmp_memcached      latest              c1eb398ad98c        3 hours ago         15.6MB
dnmp_redis          latest              8e1de2836763        3 hours ago         94.9MB
dnmp_mysql          latest              57b9ce70d5ba        3 hours ago         372MB
mysql               5.7                 702fb0b7837f        11 days ago         372MB
redis               latest              1babb1dde7e1        2 weeks ago         94.9MB
memcached           1.5.11-alpine       01e7979fa175        3 weeks ago         8.97MB
centos              7.2.1511            4cbf48630b46        3 weeks ago         195MB
nginx               alpine              aae476eee77d        4 weeks ago         17.7M

3. 启用 LNMP

$doker-compose  up  -d
Creating dnmp_mysql_1     ... done
Creating dnmp_memcached_1 ... done
Creating dnmp_redis_1     ... done
Creating dnmp_php-7.1_1   ... done
Creating dnmp_php-5.6_1   ... done
Creating dnmp_php-7.2_1   ... done
Creating dnmp_nginx_1     ... done

$docker ps 

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES
13798e2af9aa        dnmp_nginx          "nginx -g 'daemon ofΒ   14 seconds ago      Up 13 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   dnmp_nginx_1
62a205e13f60        dnmp_php-5.6        "/usr/bin/supervisord"   15 seconds ago      Up 14 seconds       9000/tcp                                   dnmp_php-5.6_1
684309c55220        dnmp_php-7.1        "/usr/bin/supervisord"   15 seconds ago      Up 14 seconds       9000/tcp                                   dnmp_php-7.1_1
ee4b54a4ed8f        dnmp_php-7.2        "/usr/bin/supervisord"   15 seconds ago      Up 14 seconds       9000/tcp                                   dnmp_php-7.2_1
bff009fbf384        dnmp_memcached      "docker-entrypoint.sΒ   16 seconds ago      Up 15 seconds       0.0.0.0:11211->11211/tcp                   dnmp_memcached_1
d42fed007ac6        dnmp_mysql          "docker-entrypoint.sΒ   16 seconds ago      Up 15 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp          dnmp_mysql_1
933c7e41e335        dnmp_redis          "docker-entrypoint.sΒ   16 seconds ago      Up 15 seconds       0.0.0.0:6379->6379/tcp                     dnmp_redis_1

4. 发布到阿里云

按照阿里云说明 
* 创建镜像仓库
* 登录阿里云Docker Registry
* 将镜像推送到Registry
REPOSITORY                                             TAG                 IMAGE ID            CREATED             SIZE
dnmp_nginx                                             latest              a1c7de60a1bc        2 hours ago         17.7MB
registry.cn-beijing.aliyuncs.com/dnmp/dnmp_nginx       latest              a1c7de60a1bc        2 hours ago         17.7MB
dnmp_php-7.2                                           latest              e4520299e968        2 hours ago         806MB
registry.cn-beijing.aliyuncs.com/dnmp/dnmp_php-7.2     latest              e4520299e968        2 hours ago         806MB
dnmp_php-7.1                                           latest              4b0bd4563162        5 hours ago         890MB
registry.cn-beijing.aliyuncs.com/dnmp/dnmp_php-7.1     latest              4b0bd4563162        5 hours ago         890MB
dnmp_php-5.6                                           latest              a6d260ec1ba8        5 hours ago         905MB
registry.cn-beijing.aliyuncs.com/dnmp/dnmp_php-5.6     latest              a6d260ec1ba8        5 hours ago         905MB
dnmp_memcached                                         latest              c1eb398ad98c        5 hours ago         15.6MB
registry.cn-beijing.aliyuncs.com/dnmp/dnmp_memcached   latest              c1eb398ad98c        5 hours ago         15.6MB
dnmp_redis                                             latest              8e1de2836763        5 hours ago         94.9MB
registry.cn-beijing.aliyuncs.com/dnmp/dnmp_redis       latest              8e1de2836763        5 hours ago         94.9MB
dnmp_mysql                                             latest              57b9ce70d5ba        5 hours ago         372MB
registry.cn-beijing.aliyuncs.com/dnmp/dnmp_mysql       latest              57b9ce70d5ba        5 hours ago         372MB
mysql                                                  5.7                 702fb0b7837f        11 days ago         372MB
redis                                                  latest              1babb1dde7e1        2 weeks ago         94.9MB
memcached                                              1.5.11-alpine       01e7979fa175        3 weeks ago         8.97MB
centos                                                 7.2.1511            4cbf48630b46        3 weeks ago         195MB
nginx                                                  alpine              aae476eee77d        4 weeks ago         17.7MB
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注