第2次实践作业
(1) 实现一个自定义的web容器服务
第一步:拉取nginx镜像
sudo docker pull nginx
(因为我已经pull完了,这是事后截图)
第二步:找到镜像的配置文件
-
sudo docker run -it nginx:latest /bin/bash
-
cd /etc/nginx/conf.d/
-
cat default.conf
(location中,root是网站文件存放的根目录,index是网站显示页面的先后顺序。所以这个location的意思是访问网站成功时,将/usr/share/nginx/html目录下的index.html作为默认页面)
第三步:写一个Dockerfile
-
mkdir Dockerfile
(在创建镜像的时候会将整个文件夹上传,新建一个空文件夹可以减少不必要的传输) -
gedit lzh.html
(自己随便写个html用来替换) -
gedit new.conf
-
gedit Dockerfile
(为什么使用new.conf而不是命名为default.conf进行覆盖,是因为在nginx的默认运行文件中,关于使用的网站配置文件的描述是 include /etc/nginx/conf.d/*.conf
所以我觉得他会检查文件夹下的所有.conf结尾的文件,就尝试如果不覆盖能不能实现实验要求,事实证明也是可以的)
第四步:创建镜像
sudo docker bulid -t nginx.lzh2 .
(为什么要叫lzh2不是lzh,因为生活并不总是一帆风顺......)
第五步:运行镜像
sudo docker run -d -P nginx:lzh2
第六步:验证
-
sudo docker ps -a
(网站访问验证 )
-
sudo docker run -it nginx:lzh2 /bin/bash
(自启动工作目录验证)
第七步:注意问题
到这里实验就成功了,不过有2个地方要注意一下:
-
第一个是我们看到上图一中开放了2个端口而不是1个,这是因为在前面我没有删除掉default.conf,所以系统运行了2个网站,将32777给了原来的80端口,把32776给了我新创建的new.conf中的111端口。
-
第二个是在运行时,我使用的是-P而不是-p,-P是docker自动分配端口映射,所以会随机选择非公用端口为nginx进行映射,在Dockerfile中,我们的EXPOSE指明了应该对哪个端口进行映射,所以使用 -P就可以成功实现端口映射。当然,如果我们随机声明另一个端口,比如EXPOSE 222,那么端口就会映射到222上,但是由于配置文件中listen的端口是111,所以会访问失败,如下所示。
-
不过还有个有意思的地方就是,我们仍然可以访问80端口映射的32773端口看到最早的ngnix默认网页,说明 -P 自动分配不仅参考EXPOSE,具体什么原因我就不太清楚了
小结
这次实验最让我困惑的部分是要求中的最后一句话,“容器启动时,能直接进入web代码的存放目录”,我花了很长时间想要使用entrypoint来实现开机自动cd到目标目录,但是如果使用entrypoint会导致在运行容器的时候参数被当作镜像中指令的属性而不是docker run的属性,所以会造成 -P 和-p 全都无法使用,无法为网站建立端口映射。在这个地方卡了很久,后面看到了workdir指令,一切就变得简单了。
(2) 实现一个自定义的数据库容器服务
第一步:拉取mysql:5.7的镜像
(为什么要用5.7版本,因为作为一个学生,要经常关注QQ群)
第二步:找一个同学的博客看看好好理解题目
第一个nginx做好好几天一直没开始做mysql,因为看不懂题目...我一直在等一个合适的可以参考的博客。题目里说需要能够查看容器内的配置信息,包括但不限于网络、应用配置文件等,我不是很理解,因为我觉得这些用/bin/bash进入容器以后都可以找得到,所以不太懂要做什么,是要把工作目录设置在配置文件下?还是运行容器的时候会自己执行cat my.conf。出于这些原因就把实验搁置了,到了最后一天看看已经做好的同学。发现大家大部分是参考了一篇博客,实现的内容是用脚本来实现第一次运行容器就可以自己创建一个数据库和一个表并授权。于是我也决定这样完成实验,同时进行理解。
第三步:写一个Dockerfile
-
mkdir sql_Dockerfile
-
gedit Dockerfile
-
gedit privileges.sql
-
gedit schema.sql
-
gedit setup.sh
第四步:创建镜像 -
sudo docker build mysql:lzh .
-
sudo docker images
第五步:运行容器并验证
sudo docker run -d -P mysql:lzh
sudo docker exec -it **container id** /bin/bash
use docker_mysql;
show table;
select * from user;
实验完成。
第六步:对于授权的刷新的验证
因为做的时候我有一些失误,比如在privileges.sql中我第一次设置密码是123456,第二次是admin。但是在验证的时候使用admin登录时成功进去了。当然这样做是没有问题的,只是当时不理解,误打误撞做出来的,所以在当时我做了个测试来帮助自己理解什么是授权的刷新。- 首先创建一个新用户docker1
- 然后使用密码123456登录
成功的 - 重新登录root,授权给docker1但不刷新
无法登录 - 重新登录root并刷新
成功!