docker-lnmp
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用户名
-
在用户主目录 /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
-
将容器内的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)
-
执行docker stop 94be2b1a8aaf 命令停止刚刚创建的nginx容器, 然后执行docker rm 94be2b1a8aaf移除容器
-
执行
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