3、docker lnmp環(huán)境搭建

docker lnmp環(huán)境搭建

提示:本文可能只對lnmp環(huán)境有一定了解的基礎有交流學習的價值航罗。

1禀横、下載相應鏡像到本地

[root@localhost lnmp]# docker pull php:7.1-fpm
[root@localhost lnmp]# docker pull mysql:5.7
[root@localhost lnmp]# docker pull nginx:1.13
[root@localhost lnmp]# docker pull redis:3.2
[root@localhost lnmp]# docker pull memcached:1.5

2、創(chuàng)建相應容器

# 創(chuàng)建php:7.1-fpm的容器并命名php7.1粥血,將容器的9000端口映射到主機的9000端口柏锄。把主機的/home/lnmp/www/目錄掛載到容器的/www目錄(這個目錄用于存放php腳本文件)
[root@localhost lnmp]# docker run -d -p 9000:9000 --name php7.1 -v /home/lnmp/www/:/www php:7.1-fpm

# 創(chuàng)建nginx:1.13的容器并命名nginx1.13,將容器的80端口映射到主機的80端口复亏。把主機的/home/lnmp/app/nginx1.13/conf/目錄掛載到容器的/etc/nginx/conf.d目錄趾娃;/home/lnmp/www/目錄掛載到容器的/www目錄。
[root@localhost lnmp]# docker run -d -p 80:80 --name nginx1.13 -v /home/lnmp/app/nginx1.13/conf/:/etc/nginx/conf.d -v /home/lnmp/www/:/www nginx:1.13 

# 創(chuàng)建mysql:5.7的容器并命名mysql5.7蜓耻,將容器的3306端口映射到主機的3306端口茫舶。把主機的/home/lnmp/data/mysql目錄掛載到容器的/var目錄。設置root的密碼為123456刹淌。
[root@localhost lnmp]# docker run -d -p 3306:3306 --name mysql5.7 -v /home/lnmp/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

# 創(chuàng)建redis:3.2的容器并命名redis3.2饶氏,將容器的6379端口映射到主機的6379端口讥耗。把主機的/home/lnmp/data/redis目錄掛載到容器的/data目錄。設置redis的持久化保存疹启。
[root@localhost lnmp]# docker run -d -p 6379:6379 --name redis3.2 -v /home/lnmp/data/redis:/data redis:3.2 redis-server --appendonly yes

# 創(chuàng)建memcached:1.5的容器并命名memcached1.5古程,將容器的11211端口映射到主機的11211端口。設置最大內存空間64M喊崖。
[root@localhost lnmp]# docker run -d -p 11211:11211 --name memcached1.5 memcached:1.5 -m 64

3挣磨、相關文件的配置

3.1 nignx的配置

在站點目錄下(即lnmp環(huán)境搭建的目錄),結構之后可見github鏈接地址荤懂。

下面以絕對地址說明:在/home/lnmp/app/nginx1.13/conf/目錄下新建nginx.conf文件茁裙,保持nginx原有文件的面貌,配置如下:

server {
    listen       80;
    server_name  localhost;
    index  index.php index.html index.htm;
    root   /www/testweb/project/ac;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
    try_files $uri $uri/ /index.php?$query_string;
    index  index.php index.html index.htm;
        # root   /usr/share/nginx/html;
        root   /www/testweb/project/ac;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /www;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    # 關鍵點在這里节仿,下面會有說明晤锥。
    location ~ [^/]\.php(/|$) {
        fastcgi_pass   172.17.0.2:9000; # 這里的ip是對應PHP版本的容器的ip地址,這個為容器之間的通信廊宪,下節(jié)會有介紹
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

在/home/lnmp/app/nginx1.13/conf/目錄下新建fastcgi_params文件矾瘾,配置如下:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  PATH_INFO          $fastcgi_script_name;  
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

虛擬主機等配置這里暫不介紹。

3.2 php的擴展的配置

官網文檔是最好的說明箭启。

打開鏈接轉How to install more PHP extensions壕翩。

在介紹一個網上看著比較好的博文Docker 中的 PHP 如何安裝擴展,有時打開慢傅寡,這里再搬來下放妈。

1、PHP 源碼

為了保證 Docker 鏡像盡量小赏僧,PHP 的源文件是以壓縮包的形式存在鏡像中大猛,官方提供了 docker-php-source 快捷腳本,用于對源文件壓縮包的解壓(extract)及解壓后的文件進行刪除(delete)的操作淀零。

FROM php:7.1-apache
RUN docker-php-source extract \
    # 此處開始執(zhí)行你需要的操作 \
    && docker-php-source delete

注意:一定要記得刪除挽绩,否則解壓出來的文件會大大增加鏡像的文件大小。

2驾中、安裝擴展

a唉堪、核心擴展

這里主要用到的是官方提供的 docker-php-ext-configure 和 docker-php-ext-install 快捷腳本,如下

FROM php:7.1-fpm
RUN apt-get update \
    # 相關依賴必須手動安裝
    && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev \
    # 安裝擴展
    && docker-php-ext-install -j$(nproc) iconv mcrypt \
    # 如果安裝的擴展需要自定義配置時
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd

注意:這里的 docker-php-ext-configure 和 docker-php-ext-install 已經包含了 docker-php-source 的操作肩民,所有不需要再手動去執(zhí)行唠亚。

b、PECL 擴展

因為一些擴展并不包含在 PHP 源碼文件中持痰,所有需要使用 PECL(PHP 的擴展庫倉庫灶搜,通過 PEAR 打包)。用 pecl install 安裝擴展,然后再用官方提供的 docker-php-ext-enable 快捷腳本來啟用擴展割卖,如下示例:

FROM php:7.1-fpm
RUN apt-get update \
    # 手動安裝依賴
    && apt-get install -y libmemcached-dev zlib1g-dev \
    # 安裝需要的擴展
   && pecl install memcached-2.2.0 \
   # 啟用擴展
   && docker-php-ext-enable memcached

c前酿、其它擴展

一些既不在 PHP 源碼包,也不再 PECL 擴展倉庫中的擴展鹏溯,可以通過下載擴展程序源碼罢维,編譯安裝的方式安裝,如下示例:

FROM php:5.6-apache
RUN curl -fsSL 'https://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz' -o xcache.tar.gz \
    && mkdir -p xcache \
    && tar -xf xcache.tar.gz -C xcache --strip-components=1 \
    && rm xcache.tar.gz \
    && ( \
        cd xcache \
        && phpize \
        && ./configure --enable-xcache \
        && make -j$(nproc) \
        && make install \
    ) \
    && rm -r xcache \
    && docker-php-ext-enable xcache

注意:官方提供的 docker-php-ext- 腳本接受任意的絕對路徑(不支持相對路徑丙挽,以便與系統(tǒng)內置的擴展程序進行區(qū)分)*肺孵。

所以,上面的例子也可以這樣寫:

FROM php:5.6-apache
RUN curl -fsSL 'https://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz' -o xcache.tar.gz \
    && mkdir -p /tmp/xcache \
    && tar -xf xcache.tar.gz -C /tmp/xcache --strip-components=1 \
    && rm xcache.tar.gz \
    && docker-php-ext-configure /tmp/xcache --enable-xcache \
    && docker-php-ext-install /tmp/xcache \
    && rm -r /tmp/xcache

這里make -j$(nproc)這個數(shù)字好像是指cpu的核數(shù)颜阐,也沒找到具體的相關說明平窘。

然后這里可以參閱下節(jié)Dockerfile的使用

3.3 其它相關的配置

沒啥好說的瞬浓,以后來補充初婆。

4蓬坡、容器之間的通信

1猿棉、獲取各個容器的ip地址:兩種方法

a、參考博文:如何獲取 docker 容器(container)的 ip 地址

[root@localhost conf]# docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
/php7.1 - 172.18.0.4
/redis3.2 - 172.18.0.5
/mysql5.7 - 172.18.0.3
/memcached1.5 - 172.18.0.6
/nginx1.13 - 172.18.0.2

b屑咳、裝完容器后萨赁,利用iptables

[root@localhost conf]# iptables -L --line-number
Chain DOCKER (2 references)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  anywhere             172.18.0.2           tcp dpt:http                 # nginx
2    ACCEPT     tcp  --  anywhere             172.18.0.3           tcp dpt:mysql                # mysql
3    ACCEPT     tcp  --  anywhere             172.18.0.4           tcp dpt:cslistener           # php 這里就是上面nginx配置需要寫的ip地址
4    ACCEPT     tcp  --  anywhere             172.18.0.5           tcp dpt:6379                 # redis
5    ACCEPT     tcp  --  anywhere             172.18.0.6           tcp dpt:memcache             # memcache

上面已經說過nginx配置需要的php-fpm的ip地址就是dpt:cslistener對應的地址。其它擴展對應的地址在代碼中填寫連接即可兆龙,例我的代碼如下:

<?php 
return [
    'file'=>[
        'type'=>'file',
        'debug'=>true,
        'pconnect'=>0,
        'autoconnect'=>0,
    ],
    'memcache'=>[
        'hostname'=>'172.17.0.6',
        'port'=>11211,
        'type'=>'memcache',
        'debug'=>true,
        'pconnect'=>0,
        'autoconnect'=>0,
        'pre'=>'@ns_ls_',
        'ismaster'=>true,
    ],
    'memcached'=>[
        'hostname'=>'172.17.0.6',
        'port'=>11211,
        'type'=>'memcached',
        'debug'=>true,
        'pconnect'=>0,
        'autoconnect'=>0,
        'pre'=>'@ns_ls_',
        'ismaster'=>true,
    ],
    'redis'=>[
        'hostname'=>'172.17.0.5',
        'port'=>6379,
        'timeout'=>0,
        'type'=>'redis',
        'debug'=>true,
        'pconnect'=>0,
        'autoconnect'=>0,
        'pre'=>'@ns_ls_',
        'isusecluster'=>false,
    ],
    'apc'=>[
        'type'=>'apc',
        'pre'=>'@ns_ls_',
    ],
    'xcache'=>[
        'type'=>'xcache',
        'pre'=>'@ns_ls_',
    ],
    'eaccelerator'=>[
        'type'=>'eaccelerator',
        'pre'=>'@ns_ls_',
    ],
    '__pre'=>'TnPGcc_',
];

5杖爽、一些采坑的記錄及建議

1、docker容器卷印射錯誤

[root@localhost ~]# docker run -d -p 9000:9000 --name php7.1 -v /home/wwwroot/:/var/www/ php:7.1-fpm
71f401361040492798a2deab03ccc86025fbd521f2db6308679ef13109162974
docker: Error response from daemon: oci runtime error: container_linux.go:262: starting container process caused "chdir to cwd (\"/var/www/html\") set in config.json failed: no such file or directory".

工作目錄途徑導致

2紫皇、nginx無法解析php文件或輸出頁為空白

[error] 5#5: *3 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

解決:

location ~ [^/]\.php(/|$) {
    fastcgi_pass   172.17.0.4:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

建議:

  • 單個容器一個個跑著安裝積累經驗慰安,最后全部刪除統(tǒng)一安裝。
  • 注意過程中的資料查找及筆記記錄聪铺。
  • 官檔是最好的說明化焕。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市铃剔,隨后出現(xiàn)的幾起案子撒桨,更是在濱河造成了極大的恐慌,老刑警劉巖键兜,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凤类,死亡現(xiàn)場離奇詭異,居然都是意外死亡普气,警方通過查閱死者的電腦和手機谜疤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夷磕,你說我怎么就攤上這事苇侵。” “怎么了企锌?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵榆浓,是天一觀的道長。 經常有香客問我撕攒,道長陡鹃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任抖坪,我火速辦了婚禮萍鲸,結果婚禮上,老公的妹妹穿的比我還像新娘擦俐。我一直安慰自己脊阴,他們只是感情好,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布蚯瞧。 她就那樣靜靜地躺著嘿期,像睡著了一般。 火紅的嫁衣襯著肌膚如雪埋合。 梳的紋絲不亂的頭發(fā)上备徐,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音甚颂,去河邊找鬼蜜猾。 笑死,一個胖子當著我的面吹牛振诬,可吹牛的內容都是我干的蹭睡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼赶么,長吁一口氣:“原來是場噩夢啊……” “哼肩豁!你這毒婦竟也來了?” 一聲冷哼從身側響起禽绪,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蓖救,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后印屁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體循捺,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年雄人,在試婚紗的時候發(fā)現(xiàn)自己被綠了从橘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片念赶。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖恰力,靈堂內的尸體忽然破棺而出叉谜,到底是詐尸還是另有隱情,我是刑警寧澤踩萎,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布停局,位于F島的核電站,受9級特大地震影響香府,放射性物質發(fā)生泄漏董栽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一企孩、第九天 我趴在偏房一處隱蔽的房頂上張望锭碳。 院中可真熱鬧,春花似錦勿璃、人聲如沸擒抛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歧沪。三九已至,卻和暖如春癣丧,著一層夾襖步出監(jiān)牢的瞬間槽畔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工胁编, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鳞尔。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓嬉橙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寥假。 傳聞我的和親對象是個殘疾皇子市框,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容