用docker 搭建lnmp环境

我刚开始学习docker时,想的是docker pull centos, 然后在centos上安装所有应用。但是去docker官方网站上能看见, php, mysql, nginx都有现成的镜像。几乎所有这种软件,redis, mongodb,esearch都有官方的docker镜像。 以后docker直接下载软件会很方便。

嗯,那就安装三个,然后相连吧。

拉取,开容器,进入容器

docker pull nginx

docker run -itd  -p 80:80 --name nginx nginx

docker exec -it 26204fca20dc /bin/bash

里面连个ps命令也没,vim也没,支持apt-get命令,有需要可以自己安装。只查看文件内容可以用cat

Apt-get update

Apt-get install vim

 apt-get install procps  安装ps

apt-get install inetutils-ping  安装ping

apt-get install net-tools  安装ifconfig

本地80端口没被占用的话,可以直接访问 , http://localhost/  

nginx是默认启动的。

Nginx -h 查看配置文件目录,

默认nginx都是这个目录

vim /etc/nginx/conf.d/default.conf

看到默认访问目录是

vim /etc/nginx/conf.d/default.conf

/usr/share/nginx/html。

我们再开一个容器,映射这个目录吧。

我们查看下本地81是否被占用, 名字改成nginx2

lsof -i:81

dockerrun -itd  -p 81:80 -v /Users/guanliyang/php:/usr/share/nginx/html  --name nginx nginx2

访问下,

http://localhost:81/

403,我本地目录没有index.html文件, 嗯,起码证明nginx启动成功

这里不要学我, 第一次就映射你的项目目录, 这时可以删除第一个无用镜像。

然后我们来搞php-fpm

docker pull php:7.4-fpm  

docker run -itd --name php-fpm7.4 -p 9000:9000 -v /Users/guanliyang/php:/Users/guanliyang/php 77cd7cd803b2

注意我们这里必须映射php项目目录,  你项目目录是nginx.conf文件里面配置的,但这个配置会作为参数传给php-fpm, 然后php-fpm会读取php文件并解析, 这样php才可用。

映射9000端口,映射前还是 lsof -i:9000 查看一下。

然后建立一个index.php文件,nginx访问他http://localhost:81/index.php

会直接把index.php文件下载下来,因为我们配置文件里面没有支持php,

去nginx容器里面。

vim  /etc/nginx/conf.d/default.conf

修改配置文件。


以下是废话

这里我们又想重新run我们的nginx镜像里,原因是我想把nginx.conf配置文件映射处理,便于配置。其他两个nginx容器删掉,避免重名。

docker run -itd  -p 80:80 -v /Users/guanliyang/php:/usr/share/nginx/html -v  /Users/guanliyang/nginx.conf:/etc/nginx/nginx.conf  --name nginx nginx

我们配置文件的内容是    

#user nobody;

worker_processes  1;

error_log /var/log/nginx/error.log;

#error_log  /usr/share/nginx/log/error.log;

#error_log  /Users/guanliyang/php/log/error.log;

#error_log  /Users/guanliyang/php/log/error.log  notice;

#error_log  /Users/guanliyang/php/log/error.log  info;

#pid        logs/nginx.pid;

events {

    worker_connections  1024;

}

http {

    include      mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    #tcp_nopush    on;

    #keepalive_timeout  0;

    keepalive_timeout  65;

    #gzip  on;

    server {

        listen      80;

        #server_name  www.fu.com;

        #charset koi8-r;

      #root  /Users/guanliyang/php;

        root /usr/share/nginx/html;

        #access_log  /Users/guanliyang/php/log/host.access.log;

        location / {

        index index.html index.htm;

        }

        #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  html;

        }

        location ~ ^/assets/.*\.php$ {

            deny all;

        }


        location ~ \.php$ {

            include fastcgi_params;

            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

            fastcgi_pass 172.17.0.3:9000;

            #fastcgi_pass unix:/var/run/php5-fpm.sock;

            try_files $uri =404;

        }

    }

}

继续废话,这里真是废话。

(docker最麻烦的就是刚开始不好理解容器和镜像的作用, 比如这里, 第一个nginx容器我们装过vim, 第二个开启的容器,vim不可能存在,需要重新装。第一个容器的任何修改都不会出现在第二个容器里面。 结论是我们在容器里做的任何修改,都要重新导出镜像, 然后在新镜像里面重新  run, 开启容器,你修改的内容才会存在) 创建新镜像 docker container commit -m "ad a new file" -a "docker newbee"  89b4e9f1bcb5 test:0.1 打好标签,你可以把它上传到云上。 docker tag centos:0.3 guanliyang/centos:0.3 Docker push   guanliyang/centos:0.3 注意这里名字不能重复   vim  /etc/nginx/conf.d/default.conf   里面,把对php的配置去掉, root 后面路径删除。   重启nginx Nginx -s reload 其实在docker配置文件, dashboart 里面有容器列表, 可以直接点击重启按钮。   哦,两种发放均重启失败, ps命令没有,安装一下。  apt-get install procps   docker restart nginx 重启nginx,  其实重启成功,配置错误。

这里有一个大坑, 由于run的时候没有映射配置文件, 一旦你配置文件配置错误,  你 docker restart nginx  的时候查看log,说你配置文件错误不能启动,不能启动就进不去容器,你改不了配置。改不了配置就启动不成功,。这是一个死循环。 只有删掉容器重新run。  原来的容器就废掉了。

上条语句回报 nginx: [emerg] open() "/Users/guanliyang/php/log/error.log" failed (2: No such file or directory) 错误,让我分析一下原因, 开启容器,容器自动开启nginx服务, nginx开启前一定加载配置文件, 配置文件我映射的本地nginx.conf文件, 我这个配置文件里有一行: error_log  /Users/guanliyang/php/log/error.log; 有意思了, 这行配置它会去容器里找这个文件,容器里没有目录 /Users/guanliyang/php/log/,  这时候你在宿主机器怎么建立文件都没有,因为他会去容器里找这个文件。  知道原因就好办了, 修改命令为 docker run -itd  -p 80:80 -v /Users/guanliyang/php:/Users/guanliyang/php -v  /Users/guanliyang/nginx.conf:/etc/nginx/nginx.conf  --name nginx nginx 容器开启成功了,


安装mysql

docker pull mysql 

默认安装的是mysql8.0

映射 -p 3307:3306   容器的是3306端口,宿主机是3307端口。

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql  mysql

这里MYSQL_ROOT_PASSWORD=123456可以直接指定密码,舒不舒服。

然后你还得开启,其他机器可以访问。

# 创建用户和用户密码,%表示通配,在所有host上都可以登录  create user 'guanliyang'@'%'  IDENTIFIED BY '123456';

#删除用户 drop user hanMM

#授权用户所有权限 GRANT ALL ON *.* TO 'guanliyang'@'%'; 

建立了一个用户guanliyang , 密码123456,  且宿主机也可以访问。

我们给一个php文件

<?php try {    

$dbh = new PDO('mysql:host=172.17.0.4;port=3306;dbname=sys', 'guanliyang', '123456');    

foreach(

    $dbh->query('SELECT * from sys_config') as $row) {         print_r($row);     }    

    $dbh = null;

}

catch (PDOException $e) {     print "Error!: " . $e->getMessage() . "<br/>";     die(); } ?>

没啥玩应儿哈,要注意的是。

这里端口是3306,我run是对应端口  3307:3306

就是从php-fpm容器对应端口时,直接对应mysql容器中的3306端口,而不是宿主机的3307端口。


好!  三大件都通了。



以上的, 172.17.0.1  是什么意思也清楚了, 他是宿主机的ip,  


知道原理就很好完了,我们修改nginx.conf  配置文件

fastcgi_pass

172.17.0.9:9000;

我瞎写一个ip,docker restart nginx 重启下,  访问一下,

http://localhost/t.php

html文件访问正常,我们所有php文件都报404错误, 证明fastcgi_pass不通。

修改下:

fastcgi_pass

172.17.0.3:9000;


172.17.0.1是宿主机ip, 172.17.0.3是php-fpm容器ip, 这两个都通。



官方文档解释了为什么mac去平容器ip不通,但其实容器ping宿主机是通的。


好,万事大吉,大吉大利。终于成功了。恭喜恭喜。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容