admin管理员组文章数量:1602070
win10通过Docker搭建LNMP环境全流程 入门版本
下载安装docker desktop
由于博主环境已经安装好了,一些异常设置,暂且略过
根据官方教程下载docker desktop执行文件.exe
注意尽量不要把docker安装到C盘,除非你的C盘很大,具体可以参考文章
把安装盘转移到F盘命令,安装前,PowerShell 管理员权限 执行
# 其实只是创建了一个快捷方式
mklink /j "C:\Program Files\Docker" "F:\environment\Docker"
把镜像文件下载到其他盘
mklink /j C:\Users\用户名\AppData\Local\Docker F:\dababase\Docker
安装好情况,如图所示
设置docker desktop
设置国内加速镜像
登陆阿里云,找到容器服务
博主已经弄完,没有完整的流程,最后获取到个人专属的阿里云镜像加速
配置到docker desktop里面,如图所示
测试下docker环境是否已经备好,编程第一步,hello word起手
# 不需要去拉取镜像,docker发现没有hello-world镜像,会先自动拉取,然后运行
docker run hello-world
看到提示 hello from docker! docker环境搭建完毕
出现的问题
error during connect: In the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect
解决: 退出docker,重新已管理员权限运行docker
docker 官方镜像教程地址
docker 官方镜像教程地址(需要特殊方式访问)
要啥搜索啥,官方权威
搭建mysql
基础操作运行mysql
# 拉取镜像
docker pull mysql:5.7
# 查看镜像是否拉取成功
docker images
根据官方文档,进入mysql的命令
# 运行mysql
docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
到这里就运行了一个简单的mysql容器,但是问题在于,我需要把三样东西挂载到宿主机:日志文件,数据库文件,配置文件
所以接下来需要确认这三个文件在容器中的位置,然后挂载到宿主机上
# 进入宿主机
docker exec -it test-mysql bash
挂载docker磁盘路径
docker run -d -p 3306:3306 --name mysql5.7 --privileged=true -v F:\docker-data\mysql-5.7\conf.d:/etc/mysql/conf.d -v F:\docker-data\mysql-5.7\logs:/var/log/mysql -v F:\docker-data\mysql-5.7\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
在F:\docker-data\mysql-5.7\conf.d 下添加一个myf文件,配置如下
[client]
port=3306
[mysql]
default_character_set=utf8
[mysqld]
port=3306
character_set_server=utf8
collation_server=utf8_general_ci
default_storage_engine=InnoDB
存在的问题
myf 不生效
docker exec -it mysql5.7 bash
查看数据库字符编码
mysql -uroot -proot
# 查看数据库字符串编码
show variables like 'character%'
到这一步,你会发现指定的字符串还是默认的latin1。也就是说配置文件没有生效
这个时候打开docker desktop查看日志
发现问题,myf is ignored
,权限太高
解决方案:将myf设置为只读权限,然后重启容器
logs日志文件夹下,没有日志
进入数据库,查看错误日志配置
# 查看数据库错误日志输出路径
show variables like 'err_log%';
结果为stderr
标准命令行输出
博主可以接受,就不进行更改了,直接通过docker容器查看日志
安装PHP
运行PHP
docker run -p 9002:9000 --name php7.4 -v F:\docker-data\nginx-1.15\html:/var/www/html -d php:7.4-fpm
安装php拓展
docker 安装拓展还是很方便的
#相关依赖安装
apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev
#安装mysqli
docker-php-ext-install mysqli
安装完毕后,重启PHP容器
安装 Nginx
运行Nginx镜像
有了Mysql安装的学习,这里就直接进入主题
run 方法其实不需要主动pull,没有镜像,程序会自动拉取
# 运行Nginx
docker run --name nginx1.15 -p 1200:80 -p 1201-1202:1201-1202 -v F:\docker-data\nginx-1.15\html:/usr/share/nginx/html:ro -v F:\docker-data\nginx-1.15\conf\nginx.conf:/etc/nginx/nginx.conf:ro -v F:\docker-data\nginx-1.15\conf\conf.d:/etc/nginx/conf.d:ro -d nginx:1.15
nginx.conf 配置文件内容如下
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
可以到这里有一个 /etc/nginx/conf.d/*.conf
这里的意思就是引入.conf后缀的文件
于是我做了一个映射 -v F:\docker-data\nginx-1.15\conf\conf.d:/etc/nginx/conf.d:ro
并创建一个80端口的网站
80.conf内容如下
server {
listen 80; # 1200
server_name localhost 127.0.0.1;
index index.html index.php;
root "/usr/share/nginx/html";
# 这里的IP 172.17.0.2 就是容器的IP
location ~ \.php(.*)$ {
fastcgi_pass 172.17.0.2:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
location /nginx_status
{
stub_status on;
access_log off;
}
}
需要注意: 这里的IP写死并不好,因为重启或者容器删除后,这里的IP可能会进行改变,这里放到我的高级编,编排的时候再说
出现的问题
flags: 0x5001: not a directory: unknown: Are you trying to mount a directory onto a file
原因:nginx.conf 不是文件夹,而是文件
解决:将nginx.conf从容器中复制出来
docker cp nginx1.15:/etc/nginx/nginx.conf F:\docker-data\nginx-1.15\conf\nginx.conf
多端口映射
每次添加一个端口,都多加一次端口映射,过于麻烦
解决:-p 1201-1290:1201-1290,做区间映射
访问index.html成功,访问index.php失败
注意,这里是重点,找了一些文章,大部分漏掉了其中一种情况
为什么会404,明显就是解析index.php不正常
注意看80.conf内容
server {
listen 80; # 1200
server_name localhost 127.0.0.1;
index index.html index.php;
root "/usr/share/nginx/html";
# 这里的IP 172.17.0.2 就是容器的IP
location ~ \.php(.*)$ {
fastcgi_pass 172.17.0.2:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
location /nginx_status
{
stub_status on;
access_log off;
}
}
进入 location ~ .php 后里面的脚本解析,如下
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
nginx 与 php 在同一台机器的时候,确实 $document_root php也是可以定位到相同路径下
但是目前用的是容器,相当于PHP只能找到自己容器的下的脚本路径
在Nginx容器里面这样配置,自然 PHP-fpm是找到文件路径的
所以这里根据PHP 容器挂载路径
docker run -p 9002:9000 --name php7.4 -v F:\docker-data\nginx-1.15\html:/var/www/html -d php:7.4-fpm
应该改为如下所示配置
server {
listen 80; # 1200
server_name localhost 127.0.0.1;
index index.html index.php;
root "/usr/share/nginx/html";
# 这里的IP 172.17.0.2 就是容器的IP
location ~ \.php(.*)$ {
fastcgi_pass 172.17.0.2:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
# 注意,这里的$document_root要改成PHP的路径映射目录
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
# 注意,这里的$document_root要改成PHP的路径映射目录
fastcgi_param PATH_TRANSLATED /var/www/html$fastcgi_path_info;
include fastcgi_params;
}
location /nginx_status
{
stub_status on;
access_log off;
}
}
通过dockerfile 安装 tomcat
进入宿主机目录 F:\docker-data\tomcat,编写dockerfile文件
FROM centos
MAINTAINER fendouweiqian<fendouweiqian@qq.COM>
ADD jdk-8u351-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.70.tar.gz /usr/local
#声明工作目录,并通过WORKDIR命令,切换到工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_333
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:#JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.70
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.70
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.70/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.70/logs/catalina.out
运行dockerfile生成镜像
docker build -t tomcat:9.0 .
查看镜像
docker images
运行镜像
docker run -it -p 22233:8080 --name tomcat9 -v F:\docker-data\tomcat\webapps\test:/usr/local/apache-tomcat-9.0.70/webapps/test -v F:\docker-data\tomcat\logs:/usr/local/apache-tomcat-9.0.70/logs tomcat:9.0
测试是否成功,访问地址 http://22233,出现熟悉的猫就是成功了
镜像推送阿里云
首先在阿里云里面创建空间,路径:容器镜像服务/实例列表/镜像仓库
创建镜像仓库
创建完毕后,会出操作指南,根据操作指南处理
指定需要推送的镜像查看
docker images
命令其实可以参考git
# 本地打包镜像
docker commit -m="php7.4测试版本" -a="fendouweiqian" fendouweiqian/php7.4-fpm-test:1.0
# 登陆仓库(类似登陆git账号)
docker login --username=6742*****@qq registry-hangzhou.aliyuncs
# 指定需要推送的镜像
docker tag [ImageId] registry-hangzhou.aliyuncs/fendouweiqian1/php7.4-fpm-1.0:[镜像版本号]
# 推送
docker push registry-hangzhou.aliyuncs/fendouweiqian1/php7.4-fpm-1.0:[镜像版本号]
常见异常
-
ping不同宿主机
如图:docker容器IP地址为172.17.0.2,宿主机的IP为192.168.43.51,相互不能ping通
解决办法: 不用管它,采用的是桥接模式,访问容器的方法是宿主机IP+映射端口。 而不是容器IP+端口 -
docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
原因:端口被占用
解决办法:看看宿主机的端口进程是被什么占用了,或者改下映射端口。例如 -p 3306:3306 改成 -p 3307:3306 -
powershell 卡住不动
其实正在下载,只是没有显示出来,可以试试ctrl+c,这个对我有用
另外一种就是重启docker desktop -
FastCGI sent in stderr: “Primary script unknown” while reading response header from upstream
可能是两个容器相互之前映射的文件目录不一致引起的问题
版权声明:本文标题:win10通过Docker搭建LNMP环境全流程 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728380509a1156440.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论