验证docker的例子

根据前面的docker知识点,可以使用这些知识点,结合例子来实际操作一遍。

其实最开始看阮一峰大佬博客的时候,就已经遇到了一个问题:需要用浏览器访问。而我之前一直都直接在命令行里操作,一时间不知道该怎么办。当然了,没有浏览器就真的不行吗,也许不是,根据网上的说法,直接使用curl命令也可以,只是没那么方便,于是还是先下定决心要搞一个可视化界面。这里用到的是VNC。

关于VNC的环境配置,其实也遇到了很多问题,但当时忘记总结了,现在回过头来发现当时的浏览器记录没了(不要问我为什么浏览器记录会没了= =),只能凭印象地稍微说几句。一开始想着直接给服务器安装GNOME桌面,设置了优先使用桌面启动而非控制台,然而一点用处也没有。于是我又回归到VNC上,VNC其实也有很多种,但似乎不同版本之间都是可通的。这里值得一提的是,VNC也是简单的C-S架构,所以我们不能仅仅在本地安装了VNC-Client,就觉得可以连上了,更关键的还要在服务端也安装一个VNC-Server。当时随便找了一个TigerVNC,在CentOS上直接用yum install就可以安装的,建议先用yum list | grep tigervnc,然后把tigervnc跟tigervnc-server都安装了就好。

img

第一次启动vncserver的时候,会让我们设置client登录到server需要的密码,需要输入两次,密码不会显示出来,都是常见的情况。然后是最关键的一步,需要指定端口。tigervnc-server默认开启的是5901端口,可以用netsta -tlnp查看是否存在该端口。这时候我在vncviewer(client)仍然无法ping通,一直显示time-out,其实就是没有连接到。找了很多方法都不行,后来突然想到了之前配置redis的时候也是如此,防火墙,配置文件全都到位了,就是不行,结果直接去腾讯云服务器上的端口管理设置了一下就可以了。于是我也就过去尝试地添加了一个5901端口,竟然就连通了,吃惊,如下:

img

连接上了之后就好办了许多,看阮一峰大佬的例子也一直水到渠成,包括他使用docker安装WordPress的例子,看评论里还有部分朋友是前两个方法无法ping通,而我成功三个方法都完美无差错,感觉还是可以的。于是VNC的部分到此结束。

可是仅仅靠一个博客的例子也太简单了,于是继续按照书上的例子来加深印象。书上用的是nginx的例子,各种参数我大概都理解是什么意思,–volume其实就是-v,-p是端口映射等等的。然后就遇到了一个老生常谈的问题,在映射目录下加了一个html文件,确实可以访问,可是出现了中文乱码。中文乱码真的是经典问题,那么接下来就来具体诉说如何解决这个中文乱码的问题。(题外话,如果前面偷懒直接用curl而不用vnc,就会忽略掉中文乱码这个错误)

以往解决中文乱码,很简单,修改配置文件,mysql等数据库就是这样处理的。那么,我们现在的本机(其实就是localhost,有一些翻译成宿主机),完全就没有安装nginx,全靠一个仓库提供的nginx image,然后在docker里运行,那么哪里找到配置文件呢?

我主要参考的是这篇文章:https://blog.csdn.net/wangfei0904306/article/details/77623400

很显然, 主要用到的就是-v参数,第一个是映射到nginx的默认目录,使得当前的html页面就可以直接被nginx访问到。第二个是把主配置文件nginx.conf映射过去,第三个是子配置文件目录conf.d。我还是先把话说在前面了,这段代码是有问题的,不然也没必要特意开一篇文章:

img

然后另一个问题又来了,那位博主是在宿主机也安装了nginx,所以他能直接拿现成的nginx.conf,conf.d来用,可我并没有。我可选的操作有:①直接上网,比如把博主的这两个配置文件下过来。②那就安装一次nginx。③把nginx image里的配置文件拿出来,然后改造。显然,前两种虽然也能解决问题,但有点蠢,显然不是最优解,第三种方法才是最合适的。用到的命令也很简单,首先启动container,然后进入container:(参数似乎不能乱)

img

然后就是复制文件的命令docker cp:(当时学的时候没看得是什么用处,现在彻底懂了)

img

于是成功把配置文件都拿出来了,然后呢?按照代码运行,出错,预期之内。下面是排错过程:

①把后面两个-v都去掉,看能否运行。结果是可以的,说明,错误确实就在后面两个-v的映射过程。

②加上后面的参数,又报错。这里值得一提的是,启动一般不会有报错信息,除非你把image名写错了,那么如何查看容器是否启动出错了?docker container ls -all。这可以列出所有的container,包括隐藏的container。而且有一项关键的属性是,status,可以根据该属性的值判断是否启动成功。当status为UP,说明容器启动成功。如果status是exited,说明启动了一下就退出,那自然就是出错了。还有一种情况,status是created,这也被我遇到了,直觉地想就是一直卡在了创建阶段,自然也是出错的时候。

③把所有的容器都关闭了,并且也删除了,再访问该IP地址(在这之前都是通过浏览器访问的),竟然还可行?这一点有点匪夷所思,因为container确实已经关闭了,甚至都已经删掉了,可在VNC的browser上却可以访问。一开始以为是缓存的问题,后来换成无痕浏览也有这个问题(换成无痕浏览倒是减少了这个情况)。这其实让我很无语,所以浏览器也不是万能的,它不仅卡,还可能本身就有问题!那么此时应该怎么办?curl。

④接下来就是具体地看代码哪里出错的地方了。首先有一个有趣的地方,目录映射是通过一个冒号完成的。然后冒号前后似乎不能加空格,加了会报错。(虽然直觉上不会,但我测试的时候,只有第一个-v,是应该可以正常运行的,可有空格就会报错,没有就不会报错,也许还有其他干扰我没注意到,但我懒得继续测试了)第二个错误的点,幸好我当时选择的是第三种解决方法,所以我刚刚进入了容器内部,查看了文件目录结构,我发现它的目录是 /etc/nginx/nginx.conf,而非/etc/nginx/nginx.conf:ro,这可能是版本的原因,也许以后还会变,但只要知道如何操作就行。同时由于我懒,我用的是参数”$PWD/…”,所以记得一定要在正确的目录调用该命令。不然后面就遇到了这种错误,我进入了conf.d目录,修改了配置文件,然后直接就在那里启动命令,PWD是错的,那么命令自然也会错了,最终的命令如下:(还是顺便提一下吧,”"真的就是最简单的换行符而已,所以如果你喜欢,你可以全部写在一起,都是可行的,只是可读性不高)

1
2
3
4
5
6
7
8
9
10
11
12
13
14

docker run \

--name myNginx \

-d -p 96:80 \

-v "$PWD/":/usr/share/nginx/html \

-v "$PWD/nginx.conf":/etc/nginx/nginx.conf \

-v "$PWD/conf.d/":/etc/nginx/conf.d \

nginx:my

⑤这时候可以成功启动,通过docker container ls -all就可以看到status是UP。可是,还是乱码。关于配置文件的修改,我是在default.bak里增加了一行 charset: utf-8。结果,原来最后的原因就是错误三。我把整个容器重新关了删了再启动,然后无痕浏览,总算没有乱码了。至此,解决Docker中的nginx中文乱码问题到此解决。

⑥PS:中间还遇到一些非常weird的错误,比如WARNING: IPv4 forwarding is disabled. Networking will not work.原因可能是前面操作docker不当,导致“ default the ipv4 forwarding is not turned on in the image from docker to prevent any security vulnerabilities. ”即Docker处于安全考虑默认关闭该设置。解决方法是:https://blog.csdn.net/Kohang/article/details/85125054 好吧,实际上只要你上网搜一下上面的WARNING,你就会看到无数篇一模一样的解决方法。还好,这次是可行的答案,不然。

其实这个例子也不是简单的中文乱码问题,因为跟乱码相关的东西,其实就一行charset: utf-8。从这个例子中,学到的不仅仅是如何解决中文乱码,更多的是:如何获取container中的文件到宿主机,-v映射具体是什么,如何查看container是否正常运行等等。关于-v映射,我在修改default.conf的时候,先进行了备份:cp default.conf default.conf.bak,然后再对default.conf进行修改,如果出错了可以直接删掉,把default.conf.bak改回原名即可。最后我进入container内部查看的时候,发现对应的映射目录,存在的就是两个文件,default.conf和default.conf.bak。所谓的映射,其实就是把宿主机的文件放入容器的指定路径。

img

img

1
2


-------------本文结束感谢您的阅读-------------