Ubuntu18.10中使用Docker搭建LNMP环境-多容器

没有使用 dockerfile 搭建,这样搞一遍对于新手来说应该更有助于理解。
最好到 [ docker hub ] 注册一个账号,里边可以查看都有哪些镜像可以使用,也能把自己的镜像存过去。
另外,这里还是有几个坑需要注意一下:
-
挂载文件夹的创建:也就是执行 docker run -v /xxx:/xxx 这种命令的时候,如果宿主机并没有创建这些文件夹,那么执行后文件夹也会被创建,但是属于 root ,需要改下用户
chown -R wu.wu www
。 -
挂载文件夹:文件夹挂载后宿主机的目录也就和容器的目录关联到了一起,但是如果 php 和 nginx 挂载目录不一致时会遇到 404 或者下载 php 文件等一系列错误。改正方法是把 nginx 和 php 文件夹挂载成一样的,或者在 nginx 的配置中,把 fastcgi_param SCRIPT_FILENAME
*****
$fastcgi_script_name; 中*****
的地方改成 php 的挂载目录。比如创建 php 容器时,运行-v ~/www/web:/var/www/html
,那么 nginx 中*****
的地址应该是/var/www/html/
-
composer 的安装:composer是需要 php 支持的,如果宿主机没有 php 环境,就需要使用 composer 镜像来处理。
docker 安装
进入系统后,打开终端执行下 docker
,然后根据返回信息安装。
不是最新版,不过也没关系,只差几个小版本号。
在 ubuntu 系统中,docker 被添加了 masked,也就是被禁止建立启动链接。
所以安装完成后不需要启动,直接执行下 docker --version
看看是否安装成功。
wu@ubuntu:~$ docker --version
Docker version 18.06.1-ce, build e68fc7a
非 root 用户使用 docker
docker 安装后,很多命令需要 root 用户才能执行,太烦,看到官网有说明,所以放心改。

sudo groupadd docker
sudo usermod -aG docker $USER
reboot
准备工作
在 home/用户名/ 文件夹下创建以下文件夹和内容:
wu@ubuntu:~/www
├── data
├── nginx
│ └── conf.d
│ └── default.conf
└── web
├── index.html
└── index.php
这几个文件夹要做挂载用,然后 default.conf 内容如下:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass php-fpm-7-3:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
include fastcgi_params;
}
}
mysql 安装
因为 php 需要连接 mysql ,而 nginx 需要连接 php ,所以安装顺序为 mysql > php > nginx 。
下载 mysql 5.7 镜像,然后挂载数据文件夹。
docker pull mysql:5.7
docker run --name mysql-5-7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d -v ~/www/data:/var/lib/mysql mysql:5.7
php 安装
下载 php-fpm:7.3 ,然后运行并关联到 mysql。
docker pull php:7.3-fpm
docker run --name php-fpm-7-3 -d -v ~/www/web:/var/www/html --link mysql-5-7:mysql php:7.3-fpm
nginx 安装
docker pull nginx
docker run -d --name nginx -p 80:80 -v ~/www/web/:/usr/share/nginx/html -v ~/www/nginx/conf.d:/etc/nginx/conf.d --link php-fpm-7-3:php-fpm nginx
打开浏览器访问 localhost :

composer 安装
本地没有 php 就装不上 composer, 又不想进 php 容器去装,查了一圈资料也没个详细点的说明,还是用镜像吧。镜像唯二的缺点就是 命令太长
和 不能更换 composer 源
。
获取 composer 镜像,然后挂载到本地目录创建 laravel 5.7 的新项目。
docker pull composer
docker run --rm -it --volume ~/www/web:/app composer create-project laravel/laravel laravel 5.7
cd ~/www/web
sudo chown -R wu.wu laravel/
sudo chmod +777 laravel/storage
加上 --rm ,每次运行完删掉容器避免堆积,反正这个容器也不能复用。
然后再修改 nginx 配个域名,加下 hosts,打开浏览器,完美。

artisan 使用
有了 composer 的经验,artisan 想必也是一个镜像。
到 docker hub 上搜一把,果然很多,但是没有官方认证过的,而且不用 dockerfile 来搭建也没有查到相关的资料,所以这里还是暂时放弃挣扎吧。
docker exec -it php-fpm-7-3 bash
cd /usr/share/nginx/html/laravel
php artisan make:auth
刷新后可以看到结果已经出来了。

结果出来了,试下数据库的连接,先配置下 mysql 远程访问:
docker exec -it mysql-5-7 bash
mysql -uroot -p
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges;
商店直接安装 datagrip ,打开并新建链接,ok。

结尾
多容器的手工搭建就先到这里吧,最后的 artisan 实在是太不方便,接下来研究下用 docker-compose 和 dockerfile 来搭建会不会方便些。