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"

把镜像文件下载到其他盘

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

安装好情况,如图所示
win10通过Docker搭建LNMP环境全流程_第1张图片

设置docker desktop

设置国内加速镜像
登陆阿里云,找到容器服务
win10通过Docker搭建LNMP环境全流程_第2张图片
博主已经弄完,没有完整的流程,最后获取到个人专属的阿里云镜像加速
配置到docker desktop里面,如图所示
win10通过Docker搭建LNMP环境全流程_第3张图片
测试下docker环境是否已经备好,编程第一步,hello word起手

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

win10通过Docker搭建LNMP环境全流程_第4张图片
看到提示 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 官方镜像教程地址(需要特殊方式访问)
要啥搜索啥,官方权威
win10通过Docker搭建LNMP环境全流程_第5张图片

搭建mysql

基础操作运行mysql

# 拉取镜像
docker pull mysql:5.7

# 查看镜像是否拉取成功
docker images

win10通过Docker搭建LNMP环境全流程_第6张图片
根据官方文档,进入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 下添加一个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

存在的问题

my.cnf 不生效

docker exec -it mysql5.7 bash

查看数据库字符编码

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

到这一步,你会发现指定的字符串还是默认的latin1。也就是说配置文件没有生效
这个时候打开docker desktop查看日志
win10通过Docker搭建LNMP环境全流程_第7张图片
win10通过Docker搭建LNMP环境全流程_第8张图片
发现问题,my.cnf is ignored ,权限太高
解决方案:将my.cnf设置为只读权限,然后重启容器
win10通过Docker搭建LNMP环境全流程_第9张图片

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可能会进行改变,这里放到我的高级编,编排的时候再说

出现的问题


  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. 多端口映射
    每次添加一个端口,都多加一次端口映射,过于麻烦
    解决:-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;
	}
}

进入 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<[email protected]>

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,出现熟悉的猫就是成功了

镜像推送阿里云

首先在阿里云里面创建空间,路径:容器镜像服务/实例列表/镜像仓库
创建镜像仓库
win10通过Docker搭建LNMP环境全流程_第10张图片
创建完毕后,会出操作指南,根据操作指南处理
win10通过Docker搭建LNMP环境全流程_第11张图片

指定需要推送的镜像查看

docker images

命令其实可以参考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:[镜像版本号]

win10通过Docker搭建LNMP环境全流程_第12张图片

常见异常

  1. ping不同宿主机
    如图:docker容器IP地址为172.17.0.2,宿主机的IP为192.168.43.51,相互不能ping通
    win10通过Docker搭建LNMP环境全流程_第13张图片
    解决办法: 不用管它,采用的是桥接模式,访问容器的方法是宿主机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
    可能是两个容器相互之前映射的文件目录不一致引起的问题
    win10通过Docker搭建LNMP环境全流程_第14张图片

你可能感兴趣的:(服务器,docker,docker,容器,运维)