• win10通过Docker搭建LNMP环境全流程


    win10通过Docker搭建LNMP环境全流程 入门版本

    下载安装docker desktop

    由于博主环境已经安装好了,一些异常设置,暂且略过
    根据官方教程下载docker desktop执行文件.exe
    注意尽量不要把docker安装到C盘,除非你的C盘很大,具体可以参考文章

    把安装盘转移到F盘命令,安装前PowerShell 管理员权限 执行

    # 其实只是创建了一个快捷方式
    mklink /j "C:\Program Files\Docker" "F:\environment\Docker"
    
    • 1
    • 2

    把镜像文件下载到其他盘

    mklink /j C:\Users\用户名\AppData\Local\Docker F:\dababase\Docker
    
    • 1

    安装好情况,如图所示
    小鲸鱼正常图片

    设置docker desktop

    设置国内加速镜像
    登陆阿里云,找到容器服务
    在这里插入图片描述
    博主已经弄完,没有完整的流程,最后获取到个人专属的阿里云镜像加速
    配置到docker desktop里面,如图所示
    在这里插入图片描述
    测试下docker环境是否已经备好,编程第一步,hello word起手

    # 不需要去拉取镜像,docker发现没有hello-world镜像,会先自动拉取,然后运行
    docker run hello-world
    
    • 1
    • 2

    在这里插入图片描述
    看到提示 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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    根据官方文档,进入mysql的命令

    # 运行mysql
    docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
    
    • 1
    • 2

    到这里就运行了一个简单的mysql容器,但是问题在于,我需要把三样东西挂载到宿主机:日志文件,数据库文件,配置文件
    所以接下来需要确认这三个文件在容器中的位置,然后挂载到宿主机上

    # 进入宿主机
    docker exec -it test-mysql bash
    
    • 1
    • 2

    挂载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
    
    • 1

    在F:\docker-data\mysql-5.7\conf.d 下添加一个my.cnf文件,配置如下

    [client]
    port=3306
    [mysql]
    default_character_set=utf8
    
    [mysqld]
    port=3306
    character_set_server=utf8
    collation_server=utf8_general_ci
    default_storage_engine=InnoDB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    存在的问题

    my.cnf 不生效

    docker exec -it mysql5.7 bash
    
    • 1

    查看数据库字符编码

    mysql -uroot -proot
    # 查看数据库字符串编码
    show variables like 'character%'
    
    • 1
    • 2
    • 3

    到这一步,你会发现指定的字符串还是默认的latin1。也就是说配置文件没有生效
    这个时候打开docker desktop查看日志
    在这里插入图片描述
    在这里插入图片描述
    发现问题,my.cnf is ignored ,权限太高
    解决方案:将my.cnf设置为只读权限,然后重启容器
    在这里插入图片描述

    logs日志文件夹下,没有日志

    进入数据库,查看错误日志配置

    # 查看数据库错误日志输出路径
    show variables like 'err_log%';
    
    • 1
    • 2

    结果为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
    
    • 1

    安装php拓展

    docker 安装拓展还是很方便的

    #相关依赖安装
    apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev
    #安装mysqli
    docker-php-ext-install mysqli
    
    • 1
    • 2
    • 3
    • 4

    安装完毕后,重启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
    
    • 1
    • 2

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    可以到这里有一个 /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;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    需要注意: 这里的IP写死并不好,因为重启或者容器删除后,这里的IP可能会进行改变,这里放到我的高级编,编排的时候再说

    出现的问题


    1. 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
    
    • 1

    1. 多端口映射
      每次添加一个端口,都多加一次端口映射,过于麻烦
      解决:-p 1201-1290:1201-1290,做区间映射

    1. 访问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;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    进入 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;
    
    • 1
    • 2
    • 3

    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
    
    • 1

    应该改为如下所示配置

    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;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    通过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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    运行dockerfile生成镜像

    docker  build -t tomcat:9.0 .
    
    • 1

    查看镜像

    docker images
    
    • 1

    运行镜像

    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
    
    • 1

    测试是否成功,访问地址 http://22233,出现熟悉的猫就是成功了

    镜像推送阿里云

    首先在阿里云里面创建空间,路径:容器镜像服务/实例列表/镜像仓库
    创建镜像仓库
    在这里插入图片描述
    创建完毕后,会出操作指南,根据操作指南处理
    在这里插入图片描述

    指定需要推送的镜像查看

    docker images
    
    • 1

    命令其实可以参考git

    # 本地打包镜像
    docker commit -m="php7.4测试版本" -a="fendouweiqian" fendouweiqian/php7.4-fpm-test:1.0
    # 登陆仓库(类似登陆git账号)
    docker login --username=6742*****@qq.com registry.cn-hangzhou.aliyuncs.com
    # 指定需要推送的镜像
    docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/fendouweiqian1/php7.4-fpm-1.0:[镜像版本号]
    # 推送
    docker push registry.cn-hangzhou.aliyuncs.com/fendouweiqian1/php7.4-fpm-1.0:[镜像版本号]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    常见异常

    1. ping不同宿主机
      如图:docker容器IP地址为172.17.0.2,宿主机的IP为192.168.43.51,相互不能ping通
      在这里插入图片描述
      解决办法: 不用管它,采用的是桥接模式,访问容器的方法是宿主机IP+映射端口。 而不是容器IP+端口

    2. 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

    3. powershell 卡住不动
      其实正在下载,只是没有显示出来,可以试试ctrl+c,这个对我有用
      另外一种就是重启docker desktop

    4. FastCGI sent in stderr: “Primary script unknown” while reading response header from upstream
      可能是两个容器相互之前映射的文件目录不一致引起的问题
      在这里插入图片描述

  • 相关阅读:
    dockerfile 配置 JVM配置
    Serverless 是什么?BaaS 和 FaaS 是什么?
    python面向对象继承开发时遇到情况——方法的重写(覆盖、扩展)
    LabVIEW样式检查表6
    正确设置PyTorch训练时使用的GPU资源
    企业架构LNMP学习笔记32
    EMNLP-21-Document-level Entity-based Extraction as Template Generation
    java中的IO流之转换流(编码转换)
    【React】精选5题
    数据结构之时间复杂度&&空间复杂度的计算
  • 原文地址:https://blog.csdn.net/fendouweiqian/article/details/128062543