docker-lnmp

作者: 太阳上的雨天 分类: Docker 发布时间: 2021-06-29 14:53

docker-lnmp

启动前准备

```docker.com
# mysql
-> docker pull mysql:5.7

# nginx
-> docker pull nginx

# php
-> docker pull php:7.4-fpm

# redis (6.2.6)
-> docker pull redis

Nginx

1. 第一步 获取nginx镜像(启动前准备工作已获取)

2. 创建nginx镜像

-> docker run -d --name single-nginx -p 8080:80 nginx
  • -d 指定容器以守护进程方式在后台运行

  • –name 指定容器名称,此处我指定的是mynginx

  • -p 指定主机与容器内部的端口号映射关系,格式 -p

  • [宿主机端口号]:[容器内部端口],此处我使用了主机8080端口,映射容器80端口

  • nginx 是nginx的镜像名

命令执行后返回了容器ID,b3bc6….,此时我们已经成功创建了nginx容器

使用docker ps命令,可以查看到正在运行的nginx容器,映射端口为80

在浏览器访问127.0.0.1:8080,即可看到nginx欢迎页

到这里我们已经完成了nginx容器的搭建,但是此时还有个问题,我们如何修改nginx的配置文件?

执行exit命令我们可以从容器内部退出

3. 如何修改nginx的配置文件

容器内配置文件的位置

     ```shell
     /etc/nginx             nginx相关的配置文件
     /usr/share/nginx/html  默认首页目录(以后项目放置代码的位置)
     /var/log/nginx         nginx日志文件
     ```

将nginx容器内部配置文件挂载到宿主机

​ cc 是我的mac用户名

  1. 在用户主目录 /Users/cc/目录下创建mnt目录,在mnt目录下创建single-lnmp目录,然后在single-lnmp目录下创建nginx目录,在ningx目录下分别创建conf, html, logs目录。这几个目录为挂载目录

    /Users/cc/mnt/single-lnmp/nginx/conf

    /Users/cc/mnt/single-lnmp/nginx/html

    /Users/cc/mnt/single-lnmp/nginx/logs

  1. 将容器内的nginx.conf与default.conf文件分别拷贝到主机/Users/cc/mnt/single-lnmp/nginx和/Users/cc/mnt/single-lnmp/nginx/conf目录下,在nginx目录下分别执行

      docker cp 94be2b1a8aaf:/etc/nginx/nginx.conf ./
      docker cp 94be2b1a8aaf:/etc/nginx/conf.d/default.conf ./conf/
      94be2b1a8aaf(容器ID)
  2. 执行docker stop 94be2b1a8aaf 命令停止刚刚创建的nginx容器, 然后执行docker rm 94be2b1a8aaf移除容器

  3. 执行

docker run -d --name single-nginx -p 80:80 -v /Users/cc/mnt/single-lnmp/nginx/nginx.conf:/etc/nginx/nginx.conf -v /Users/cc/mnt/single-lnmp/nginx/logs:/var/log/nginx -v /Users/cc/mnt/single-lnmp/nginx/html:/usr/share/nginx/html -v /Users/cc/mnt/single-lnmp/nginx/conf:/etc/nginx/conf.d --privileged=true nginx

-v 挂载目录,格式 -v: 表示将主机目录与容器目录之间进行共享,
–privileged=true 容器内部对挂载的目录拥有读写等特权

    5. 打开浏览器访问127.0.0.1会出现403。因为我们的主机挂载/Users/cc/mnt/single-lnmp/nginx/html目录还为空,这时cd 到/Users/cc/mnt/single-lnmp/nginx/html目录下执行
-> echo "hello world" > index.html


因为我们宿主机目录与容器内的目录实现了共享,创建的index.html文件也会出现在宿主机的/usr/share/nginx/html目录下,再次访问ip,就大功告成.

PHP 并与上一步 使用nginx作为web服务器交互php

# 启动
docker run --name  single-php -p 9000:9000 -v /Users/cc/mnt/single-lnmp/www:/var/www/html -d php:7.4-fpm

# 启动成功
03251f4869ae35893916600831ce86e95cb67ca0cf9c3254767c2af08e6eceec

# 进入容器
-> docker exec -it single-php /bin/bash
cd /usr/local/etc 目录. 执行 cp php-fpm.conf.default php.ini

# 打开另一个终端,把php.ini和php-fpm.d文件夹拷贝到/Users/cc/mnt/single-lnmp/php目录下
➜ docker cp f7dad9a23666:/usr/local/etc/php.ini ./
➜ docker cp f7dad9a23666:/usr/local/etc/php-fpm.d ./

# exit 退出容器

# 停止signle-php 容器
-> docker stop single-php

# 删除single-php容器
-> docker rm 容器ID

# 挂载宿主机配置文件目录和容器配置文件目录 重启启动php
-> docker run --name  single-php -p 9000:9000 -v /Users/cc/mnt/single-lnmp/www:/var/www/html -v /Users/cc/mnt/single-lnmp/php/php.ini:/usr/local/etc/php-fpm.conf.default -v /Users/cc/mnt/single-lnmp/php/php-fpm.d:/usr/local/etc/php-fpm.d -d php:7.4-fpm

# 启动nginx
注:在启动nginx的时候,处理程序目录映射的时候,应该把php容器中的/www/目录和nginx容器中的/usr/share/nginx/html目录映射到同一目录下
在/Users/cc/mnt/single-lnmp目录下创建www目录

docker run -d --name single-nginx -p 80:80 -v /Users/cc/mnt/single-lnmp/www:/usr/share/nginx/html -v /Users/cc/mnt/single-lnmp/nginx/nginx.conf:/etc/nginx/nginx.conf -v /Users/cc/mnt/single-lnmp/nginx/logs:/var/log/nginx -v /Users/cc/mnt/single-lnmp/nginx/conf:/etc/nginx/conf.d --link single-php:php --privileged=true nginx

# nginx启动成功
ca04b9ebce124ed0872265fa03ea238869b6acb32c56ad9c72a12289188a07c6

# 配置 nginx配置文件
# 配置文件被挂载到了/Users/cc/mnt/single-lnmp/nginx/conf目录下的default.conf
server {
    listen       80;
    server_name  localhost;
    root   /usr/share/nginx/html/;  # //nginx的容器的目录
    index  index.html index.htm index.php;

    #access_log  /var/log/nginx/host.access.log  main;

    # 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$ {
        root           /var/www/html;  # //必须是容器中的目录,而不是你挂在宿主主机的目录
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
        fastcgi_param  PATH_INFO  $fastcgi_path_info;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
注:php容器的/var/www/html目录 和 nginx的/usr/share/nginx/html目录映射的都为宿主主机的/Users/cc/mnt/single-lnmp/www目录 ,配置的nginx的时候一定要分清楚,否则无法解析

在/usr/share/nginx/html目录下创建hello.html和index.php文件

打开浏览器访问:127.0.0.1/hello.html

打开浏览器访问: 127.0.0.1

安装php扩展

```# 查看安装了哪些扩展
```# 进入single-php容器
ls /usr/local/lib/php/extensions/no-debug-non-zts-20190902/ 或者 php -m (php -m | grep openSSL)

opcache.so  sodium.so

```# docker PHP中安装扩展有几个特殊的命令
1. docker-php-source
``` 此命令,实际上就是在PHP容器中创建一个/usr/src/php的目录,里面放了一些自带的文件而已。我们就把它当作一个从互联网中下载下来的PHP扩展源码的存放目录即可。事实上,所有PHP扩展源码扩展存放的路径: /usr/src/php/ext 里面。
``` 格式:
``` docker-php-source extract | delete
``` 参数说明:
``` * extract : 创建并初始化 /usr/src/php目录
``` * delete : 删除 /usr/src/php目录

2. docker-php-ext-install
``` 这个命令,是用来安装并启动PHP扩展的。
``` 命令格式:
``` docker-php-ext-install “源码包目录名”
``` 注意点:
``` 源码包“需要放在 /usr/src/php/ext 下
``` 默认情况下,PHP容器没有 /usr/src/php这个目录,需要使用 docker-php-source extract来生成。
``` docker-php-ext-install 安装的扩展在安装完成后,会自动调用docker-php-ext-enable来启动安装的扩展。
``` 卸载扩展,直接删除/usr/local/etc/php/conf.d 对应的配置文件即可。

3. docker-php-ext-enable
``` 这个命令,就是用来启动 PHP扩展 的。我们使用pecl安装PHP扩展的时候,默认是没有启动这个扩展的,如果想要使用这个扩展必须要在php.ini这个配置文件中去配置一下才能使用这个PHP扩展。而 docker-php-ext-enable 这个命令则是自动给我们来启动PHP扩展的,不需要你去php.ini这个配置文件中去配置。

4 .docker-php-ext-configure
``` docker-php-ext-configure 一般都是需要跟 docker-php-ext-install搭配使用的。它的作用就是,当你安装扩展的时候,需要自定义配置时,就可以使用它来帮你做到
```

##### 安装zip扩展

```shell
# 进入容器
apt-get update && apt-get install -y zlib1g-dev && apt-get install -y libzip-dev

docker-php-ext-install zip

# 查看是否安装成功
php -m | grep zip
安装pdo_mysql扩展
docker-php-ext-install pdo_mysql
编译安装phpGD扩展
# 更新软件源
apt-get update

# 安装相关库
apt-get install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev

# gd 源码文件夹
cd /usr/src/php/ext/gd

docker-php-ext-configure gd --help //查看参数
``` docker-php-ext-configure gd --with-webp=/usr/include/webp --with-jpeg=/usr/include --with-freetype=/usr/include/freetype2

``` make && make install

``` cd /usr/local/lib/php/extensions/no-debug-non-zts-20190902/

ls 

gd.so  opcache.so  pdo_mysql.so  sodium.so

# 安装gd扩展
docker-php-ext-install gd

php -m | grep gd
安装redis扩展
# 找到自己要安装的版本,复制链接
https://github.com/phpredis/phpredis/tags

连接: https://github.com/phpredis/phpredis/archive/refs/tags/5.3.4.tar.gz

# 首先进入到php容器内
docker exec -it single-php /bin/bash

# 下载phpredis
cd /tmp
wget https://github.com/phpredis/phpredis/archive/refs/tags/5.3.4.tar.gz
如果没有wget命令,则执行
apt-get update
apt-get install wget 

# 解压
tar xfz 5.3.4.tar.gz

# mkdir -p /usr/src/php/ext (忽略 因为之前执行过 docker-php-source命令)

# mv phpredis-5.3.4/ /usr/src/php/ext/redis

# docker-php-ext-install redis

# php -m 即可查看

# 重启single-php 容器
docker restart single-php 

浏览器 就可以查看

安装swoole扩展
# 找合适的版本
https://pecl.php.net/package/swoole

# 下载
cd /tmp
wget https://pecl.php.net/get/swoole-4.6.3.tgz

# 解压
tar zxvf swoole-4.6.3.tgz

rm -f swoole-4.6.3.tgz
rm package.xml

# 重命名
mv swoole-4.6.3/ swoole

# 移动
mv swoole /usr/src/php/ext/

# 安装
docker-php-ext-install swoole

# 查看
php -m | grep swoole
swoole

# 查看swoole配置  
php --ri swoole

swoole

Swoole => enabled
Author => Swoole Team <team@swoole.com>
Version => 4.6.3
Built => Oct 31 2021 08:19:10
coroutine => enabled with boost asm context
epoll => enabled
eventfd => enabled
signalfd => enabled
cpu_affinity => enabled
spinlock => enabled
rwlock => enabled
zlib => 1.2.11
brotli => E16777225/D16777225
mutex_timedlock => enabled
pthread_barrier => enabled
futex => enabled
async_redis => enabled

Directive => Local Value => Master Value
swoole.enable_coroutine => On => On
swoole.enable_library => On => On
swoole.enable_preemptive_scheduler => Off => Off
swoole.display_errors => On => On
swoole.use_shortname => On => On
swoole.unixsock_buffer_size => 8388608 => 8388608

# 重启single-php
docker restart single-php

浏览器查看

安装pcntl扩展
docker-php-ext-install pcntl

php -m | grep pcntl
安装event扩展
# 1. 安装libevent库依赖

docker exec -it docker-php /bin/bash 进入php容器内

apt-get install libevent-dev

apt-get install libssl-dev

# 2. 下载event扩展

wget http://pecl.php.net/get/event-2.3.0.tgz

tar -zxvf event-2.3.0.tgz

mv event-2.3.0 /usr/src/php/ext/event && cd /usr/src/php/ext

docker-php-ext-install event

# 报错
configure: error: Couldn't find /usr/local/include/php/sockets/php_sockets.h. Please check if sockets extension installed

cd /usr/local/etc/php/conf.d 目录下 ll 命令查看并没有看到sockets扩展
docker-php-ext-install sockets 安装sockets扩展

# 再次执行  docker-php-ext-install event

php -m | grep event

php容器中安装composer

wget https://github.com/composer/composer/releases/download/1.8.6/composer.phar
chmod u+x composer.phar
mv composer.phar /usr/local/bin/composer
# 将 Composer 镜像设置为阿里云镜像,加速国内下载速度
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer

mysql

# 创建目录
/Users/cc/mnt/single-lnmp/mysql
/Users/cc/mnt/single-lnmp/mysql/logs
/Users/cc/mnt/single-lnmp/mysql/data

# 启动
-> docker run -p 3306:3306 --name single-mysql -v /Users/cc/mnt/single-lnmp/mysql:/etc/mysql -v /Users/cc/mnt/single-lnmp/mysql/logs:/var/log/mysql -v /Users/cc/mnt/single-lnmp/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

#启动成功
b9e2543291ab2fdcf3b177fdd6cce5a32d3724528f88ac409e44dce579b048b2

# 进入容器
-> docker exec -it single-mysql bash

# 进入mysql命令行
-> mysql -u root -p root

# 修改可以使用外部客户端链接(比如navicat/sequel)
mysql> show databases;
mysql> use msyql;
mysql> show tables;
msyql> update user set host='%' where user='root';
mysql> grant all privileges on *.* to root@"%" identified by "password" with grant option;
mysql> flush privileges;

# 关闭single-mysql容器
-> docker ps
-> docker top Container ID || Container Name (二选一)
-> docker kill Container ID || Container Name(二选一)

# 关闭之后启动single-mysql容器
-> docker ps -a
-> docker start Container ID

# 删除single-mysq容器
-> docker rm -i Container ID || Container Name

# 删除mysql镜像
-> docker ps (doccker ps -a)
-> docker rmi -f 镜像ID

redis

# 创建存放redis 持久化数据和配置文件的目录
cd 到/Users/cc/mnt/single-lnmp/ 目录创建redis目录
然后cd redis 目录下 创建 data目录

/Users/cc/mnt/single-lnmp/redis/data

# 从官网获取redis.conf
cd /Users/cc/mnt/single-lnmp/redis/
wget http://download.redis.io/redis-stable/redis.conf   //下载redis配置文件

# 编辑配置文件
bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问
protected-mode no #默认yes,开启保护模式,限制为本地访问
dir  ./ #输入本地redis数据库存放文件夹(可选) 我配置的是 /Users/cc/mnt/single-lnmp/redis/data
appendonly yes #redis持久化(可选)
requirepass 你的密码#给redis设置密码

注意:
daemonize no #用守护线程的方式启动 默认为no。 不能改为yes 否则启动闪退

# 启动
docker run -p 6379:6379 --name single-redis -v /Users/cc/mnt/single-lnmp/redis/redis.conf:/etc/redis/redis.conf  -v /Users/cc/mnt/single-lnmp/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

# 进入容器
docker exec -it single-redis /bin/bash

# 容器内console连接redis
root@9f9cc1d86500:/data# redis-cli
127.0.0.1:6379> auth 123456
127.0.0.1:6379> set a 1

# 使用RDM连接docker里的redis
就可以看到刚才设置的 a

安装laravel

# composer 安装 (百度资料一大堆)

# 进入/Users/cc/mnt/single-lnmp/nginx/conf目录,创建配置文件 
# touch blog.laravel.conf

server {
    listen       80;
    server_name  blog.caixiaoxin.cn;
    root   /usr/share/nginx/html/blog/public;   //nginx容器内的目录不变
    index  index.html index.htm index.php;

    #access_log  /var/log/nginx/host.access.log  main;

    # 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$ {
        root           /var/www/html/blog/public;  // single-php容器中blog下的public目录
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/blog/public$fastcgi_script_name;
        fastcgi_param  PATH_INFO  $fastcgi_path_info;
        include        fastcgi_params;
    }

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

# 添加域名解析
vim /etc/hosts

127.0.0.1     blog.laravel.cn

# 重启single-nginx && single-php,访问浏览器

laravel 连接docker mysql

.env文件里的host应填写php容器中的ip
docker inspect 容器id

发表回复

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