docker-lnmp

2,486 次浏览次阅读
没有评论

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-lnmp

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

docker-lnmp

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

docker-lnmp

到这里我们已经完成了 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 移除容器
    docker-lnmp
    docker-lnmp

  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

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

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
docker-lnmp
打开浏览器访问: 127.0.0.1
docker-lnmp

安装 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 

浏览器 就可以查看
docker-lnmp

安装 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

浏览器查看
docker-lnmp

安装 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

docker-lnmp

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

docker-lnmp

安装 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, 访问浏览器

docker-lnmp

laravel 连接 docker mysql

.env 文件里的 host 应填写 php 容器中的 ip
docker inspect 容器 id
正文完
 0
评论(没有评论)