小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Docker LNMP環(huán)境搭建

 昵稱(chēng)21532077 2019-12-12

本文介紹如何使用Docker容器,快速部署LNMP環(huán)境。
最終完成的環(huán)境我們稱(chēng)為:DNMP(即 Docker + Nginx + MySQL + PHP)。

最終實(shí)現(xiàn)一鍵部署LNMP環(huán)境的目的,該環(huán)境特點(diǎn):

  1. 完全開(kāi)源
  2. 支持多版本PHP切換(PHP5.4、PHP5.6、PHP7.2...)
  3. 支持綁定任意多個(gè)域名
  4. 支持HTTPS和HTTP/2
  5. PHP源代碼位于host
  6. MySQL data位于host
  7. 所有配置文件可在host中直接修改
  8. 所有日志文件可在host中直接查看
  9. 內(nèi)置完整PHP擴(kuò)展安裝命令
  10. 本站實(shí)際使用,確保100%可用
  11. 實(shí)現(xiàn)一次配置,Windows、Linux、MacOs皆可用

github倉(cāng)庫(kù)地址https://github.com/yeszao/dnmp

QQ群: 572041090 (請(qǐng)備注dnmp交流)

1 快速使用

1、安裝gitdockerdocker-compose。

2、使用git下載完整代碼:

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

3、用docker-compose命令啟動(dòng)容器,首次使用需要下載鏡像,會(huì)稍慢:

$ docker-compose up

4、然后在瀏覽器中訪問(wèn)localhost,就可以看到如下頁(yè)面:

5、源代碼在:./www/site1/ 目錄下。

2 安裝docker和docker-compose

具體安裝步驟:

注意:Docker安裝要求Linux 3.10以上版本,用uname -a命令可查看到。

安裝之后,可查看版本:

$ docker -v
$ docker-compose -v

然后把當(dāng)前用戶(hù)加到docker用戶(hù)組里面:

$ sudo gpasswd -a ${USER} docker

就不用每次啟動(dòng)Docker都得加sudo了。

注意,執(zhí)行gpasswd命令之后要重新登陸才有效。

3 使用國(guó)內(nèi)鏡像倉(cāng)庫(kù)

在沒(méi)有梯子的情況下,Docker默認(rèn)從Docker Hub倉(cāng)庫(kù)下載鏡像,完整的LNMP鏡像估計(jì)需要一兩天時(shí)間。

所以只能換個(gè)途徑,比如使用阿里云的加速倉(cāng)庫(kù)。

首先注冊(cè)一個(gè)阿里云賬號(hào),然后訪問(wèn)阿里云的Docker鏡像倉(cāng)庫(kù),能找到加速器地址。

對(duì)于Docker 1.10+,打開(kāi)配置文件 /etc/docker/daemon.json(沒(méi)有時(shí)新建該文件):

{
    "registry-mirrors": ["https://6evg8u3r.mirror."]
}

以上是我的加速地址。

然后重啟Docker Daemon:

sudo systemctl daemon-reload
sudo systemctl restart docker

就可以了。

Docker 1.10以下請(qǐng)看:https://yq.aliyun.com/articles/29941。

4 目錄說(shuō)明

大致框架如下:

(圖片使用UMLet繪制,下載原文件

4.1 目錄結(jié)構(gòu)

目錄結(jié)構(gòu)如下:

.
├── docker-compose.yml          容器啟動(dòng)配置文件
├── Dockerfile                  PHP-FPM構(gòu)建配置文件
├── conf                        配置目錄
│   ├── mysql                   MySQL配置文件目錄
│   │   └── my.cnf              MySQL配置文件
│   ├── nginx                   Nginx配置文件目錄
│   │   ├── conf.d              站點(diǎn)配置文件目錄
│   │   │   ├── certs           SSL認(rèn)證文件、密鑰和加密文件目錄
│   │   │   │   └── site2       站點(diǎn)2的認(rèn)證文件目錄
│   │   │   ├── site1.conf      站點(diǎn)1 Nginx配置文件
│   │   │   └── site2.conf      站點(diǎn)2 Nginx配置文件
│   │   └── nginx.conf          Nginx通用配置文件
│   └── php                     PHP配置目錄
│       ├── php-fpm.d           PHP-FPM配置目錄
│       │   └── www.conf        PHP-FPM配置文件
│       └── php.ini             PHP配置文件
├── log                         日志目錄
│   ├── mysql                   MySQL日志目錄
│   ├── nginx                   Nginx日志目錄
│   └── php-fpm                 PHP-FPM日志目錄
├── mysql                       MySQL數(shù)據(jù)文件目錄
└── www                         站點(diǎn)根目錄
    ├── site1                   站點(diǎn)1根目錄
    └── site2                   站點(diǎn)2根目錄

4.2 站點(diǎn)部署

本文有默認(rèn)加了兩個(gè)站點(diǎn):www.site1.com(同localhost)和www.site2.com

要在本地訪問(wèn)這兩個(gè)域名,需要修改你的hosts文件,添加以下兩行:

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

其中,www.site2.com支持SSL/https和HTTP/2的示例站點(diǎn)。

因?yàn)檎军c(diǎn)2的SSL采用自簽名方式,所以瀏覽器有安全提示,繼續(xù)訪問(wèn)就可以了,自己的站點(diǎn)用第三方SSL認(rèn)證證書(shū)替換即可。

如果只用到站點(diǎn)1,把站點(diǎn)2相關(guān)的目錄和配置文件刪除:

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

重啟容器內(nèi)的Nginx生效:

docker exec -it dlnmp_nginx_1 nginx -s reload

4.3 HTTPS使用

在容器中我們也是可以用HTTPS的,具體的配置請(qǐng)參考如下文件:

./conf/nginx/conf.d/site2.conf

如果是自簽名,可以用廖雪峰提供的一個(gè)自動(dòng)生成認(rèn)證文件、私鑰腳本:gencert.sh,

這個(gè)腳本已經(jīng)放在項(xiàng)目中,在這個(gè)目錄下:

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

在Bash中輸入:

$ ./gencert.sh

輸入一次域名,和幾次密碼(內(nèi)容隨意)后,就會(huì)生成幾個(gè)認(rèn)證文件。

其中自簽名情況不需要.csr.origin.key后綴的文件。

然后修改Nginx配置文件,配置SSL支持就可以了。

5 docker-compose.yml文件

如下是docker容器的運(yùn)行配置docker-compose.yml的內(nèi)容:

nginx:
  image: nginx:alpine
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - ./www/:/var/www/html/:rw
    - ./conf/nginx/conf.d:/etc/nginx/conf.d/:ro
    - ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    - ./log/nginx/:/var/log/nginx/:rw
  links:
    - php-fpm:fpm

php-fpm:
  build: .
  expose:
    - "9000"
  volumes:
    - ./www/:/var/www/html/:rw
    - ./conf/php/php.ini:/usr/local/etc/php/php.ini:ro
    - ./conf/php/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf:rw
    - ./log/php-fpm/:/var/log/php-fpm/:rw
  links:
    - mysql:mysql
    - redis:redis

mysql:
  image: mysql:latest
  ports:
    - "3306:3306"
  volumes:
    - ./conf/mysql/my.cnf:/etc/mysql/my.cnf:ro
    - ./mysql/:/var/lib/mysql/:rw
    - ./log/mysql/:/var/log/mysql/:rw
  environment:
    MYSQL_ROOT_PASSWORD: "123456"

redis:
  image: redis:latest
  ports:
    - "6379:6379"

這里我們用了nginx的alpine鏡像,以及php-fpm和MySQL的最新鏡像。

這里默認(rèn)加了redis容器,不需要的話可以把文件的最后4以及php-fpm塊下的- redis:redis刪除。

5.1 為什么用nginx:alpine?

因?yàn)橄啾?code>nginx:latest,nginx:alpine有幾點(diǎn)優(yōu)勢(shì):

  1. 用的是最新版nginx鏡像,功能與nginx:latest一模一樣
  2. alpine鏡像用的是Alpine Linux內(nèi)核,比ubuntu內(nèi)核要小很多。
  3. nginx:alpine默認(rèn)支持http2。

Alpine的更多請(qǐng)看《Alpine Linux,一個(gè)只有5M的Docker鏡像》。

如要進(jìn)入alpine容器,命令是(后面的路徑不是/bin/bash):

$ docker exec -it dnmp_nginx_1 /bin/sh

5.2 站點(diǎn)根目錄掛載

為什么站點(diǎn)根目錄在Nginx和PHP-FPM都這樣掛載?

./www/:/var/www/html/

我們知道,Nginx配置都有這樣一項(xiàng):

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

其中,$document_root就是server塊下root所指的路徑:

server {
    #...
    root /var/www/html;
    #...
}

這里$document_root就是/var/www/html。

如果Nginx和PHP-FPM在同一主機(jī),Nginx會(huì)通過(guò)9000端口把這個(gè)目錄值腳本URI傳給PHP-FPM。

PHP-FPM再通過(guò)9000端口接收Nginx發(fā)過(guò)來(lái)的目錄值和腳本URI,發(fā)給PHP解析。

PHP收到后,就到指定的目錄下查找PHP文件并解析,完成后再通過(guò)9000端口返回給Nginx。

如果Nginx和PHP-FPM在同一個(gè)主機(jī)里面,PHP就總能找到Nginx指定的目錄。

但是,如果他們?cè)诓煌娜萜髂兀?/p>

未做任何處理的情況,Nginx容器中的站點(diǎn)根目錄,PHP-FPM容器肯定不存在。

所以,這里需要保證Nginx和PHP-FPM都掛載了Host的./www/,并且都掛載在容器的:/var/www/html。

(當(dāng)然,你也可以指定別的目錄,確保統(tǒng)一即可)

5.3 修改docker-compose.yml文件之后?

如果容器已經(jīng)生成,回頭再編輯docker-compose.yml,用

docker-compose up

命令會(huì)直接啟動(dòng)原來(lái)的容器,修改的內(nèi)容不會(huì)體現(xiàn)在啟動(dòng)的容器里。

所以,要使修改的docker-compose.yml生效,需要以下4步:

$ docker stop dnmp_nginx_1                      # 第一步:停止容器
$ docker rm dnmp_nginx_1                        # 第二步:刪除容器
# !!第三步:重啟Docker服務(wù)!!
$ docker-compose up -d --no-deps --build mysql  # 第四步:重新啟動(dòng)容器

其中最后一條命令參數(shù)作用:

  • -d:后臺(tái)執(zhí)行
  • --no-deps:不啟動(dòng)link的容器
  • --build:?jiǎn)?dòng)容器前先構(gòu)建鏡像

6 Dockerfile文件

因?yàn)镻HP-FPM構(gòu)建稍微復(fù)雜,涉及到很多擴(kuò)展。

所以單獨(dú)用Dockerfile文件構(gòu)建PHP-FPM:

FROM php:fpm

## Copy sources.list to container.
## Here we use 163.com sources list.
##     PHP 5.6.31+ should use jessie sources list
##     PHP 7.2.0+ should use stretch sources list
## For more please check:
## PHP official docker repository: https://hub./r/library/php/
#COPY ./files/sources.list.stretch /etc/apt/sources.list
#COPY ./files/sources.list.jessie /etc/apt/sources.list

## Update Ubuntu
RUN apt-get update

## mcrypt
RUN apt-get install -y libmcrypt-dev
RUN docker-php-ext-install mcrypt

## GD
RUN apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
RUN docker-php-ext-install -j$(nproc) gd

## Intl
RUN apt-get install -y libicu-dev
RUN docker-php-ext-install -j$(nproc) intl

## General
RUN docker-php-ext-install zip
RUN docker-php-ext-install pcntl
RUN docker-php-ext-install opcache
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install mysqli
RUN docker-php-ext-install mbstring

## ...

完整Dockerfile請(qǐng)移步本項(xiàng)目GitHub倉(cāng)庫(kù)。

7 nginx配置文件

這里,我們還需要稍微修改nginx配置文件:

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

這里,我們僅需把fastcgi_pass改成:fpm:9000。

也就是,PHP-FPM的偵聽(tīng)主機(jī)改成:Nginx links PHP-FPM容器的別名,在docker-compose.yml文件里面我們?cè)O(shè)置為fpm。

這樣Nginx容器啟動(dòng)的時(shí)候,就會(huì)自動(dòng)修改自己的/etc/hosts,讓fpm指向php-fpm容器的IP。

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

$ docker exec dlnmp_nginx_1 nginx -s reload

其中,dlnmp_nginx_1是容器的名稱(chēng),也可以指定容器的ID。

8 站點(diǎn)根目錄寫(xiě)權(quán)限

有時(shí)候,我們的PHP代碼需要某個(gè)目錄的寫(xiě)權(quán)限。

比如,Wordpress的wp-content/uploads目錄,只有寫(xiě)權(quán)限我們才能正常上傳文件。

默認(rèn)的,容器中的/var/www/html目錄屬于root,我們需要修改為www-data,PHP才能正常寫(xiě)目錄。

先進(jìn)入到容器中:

$ docker exec -it dlnmp_php-fpm_1 /bin/bash

然后修改目錄權(quán)限:

$ chown -R www-data:www-data /var/www/html

這樣PHP就能正常讀寫(xiě)目錄了。

9 數(shù)據(jù)庫(kù)

9.1 使用MySQL

在docker-compose.yml文件中,我們指定了MySQL數(shù)據(jù)庫(kù)root用戶(hù)的密碼為123456。

所以,我們就可以在主機(jī)中通過(guò):

$ mysql -h 127.0.0.1 -u root -p

輸入密碼,就可以進(jìn)入MySQL命令行。

說(shuō)明:這里MySQL的連接主機(jī)不能用localhost,因?yàn)镸ySQL客戶(hù)端默認(rèn)使用unix socket方式連接,應(yīng)該直接用本地IP。

在PHP代碼中的使用方式與在主機(jī)中使用稍有不同,如下:

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

其中,host的值就是在docker-compose.yml里面指定的MySQL容器的名稱(chēng)。

這是因?yàn)镻HP代碼是在FPM容器中,F(xiàn)PM容器啟動(dòng)時(shí)會(huì)自動(dòng)在/etc/hosts中加上:

172.17.0.2 mysql 11e55f91c4c3 dlnmp_mysql_1

就是說(shuō),mysql自動(dòng)指向了MySQL容器動(dòng)態(tài)生成的IP。

9.2 使用Redis

Redis使用和MySQL類(lèi)似。

在主機(jī)和容器內(nèi)部都通過(guò)地址127.0.0.1,端口6379訪問(wèn)。

PHP則是跨容器訪問(wèn),host參數(shù)用redislinks指定的名稱(chēng)),端口用6379

10 讓DNMP隨系統(tǒng)啟動(dòng)

到這里我們用docker搭建的Docker (Linux) + Nginx + MySQL + PHP環(huán)境已經(jīng)可以正常使用了。

但每次啟動(dòng)系統(tǒng)都得切換到項(xiàng)目目錄,再執(zhí)行compose up,就略顯繁瑣。

要是能在系統(tǒng)啟動(dòng)的時(shí)候自動(dòng)啟動(dòng)容器,豈不是更好,下面是具體的方法。

10.1 Ubuntu系統(tǒng)Unity桌面

從Launcher中搜索Startup Applications(啟動(dòng)應(yīng)用程序),

然后Add一項(xiàng),名字:Dnmp,命令填:

docker-compose -f /home/gary/dnmp/docker-compose.yml up -d

其中,-f 指定docker-compose.yml文件的位置。

然后保存即可。

10.2 其他Linux系統(tǒng)

其他命令行下的Linux系統(tǒng),可以直接編輯 /etc/rc.local 文件,加上上面的命令。

Docker相關(guān)的有用文章:

  1. Docker 常用命令
  2. docker-compose中ports和expose的區(qū)別
  3. 手動(dòng)用Docker一步步部署LNMP完整教程
  4. Docker容器使用十大注意事項(xiàng)

 

? ?        

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多