1、Dockerfile相关信息
-
Dockerfile
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。Docker通过读取Dockerfile中的指令自动生成映像。docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。
-
基本结构
Dockerfile一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
-
文件说明
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
-
常用指令
- FROM:指定基础镜像,必须是第一条指令
- ADD:将宿主机目录下的文件复制到镜像中
- COPY:复制指令,与ADD相比,COPY的只能是本地文件
- EXPOSE:暴露容器运行时的监听端口给外部
- ENV:设置环境变量
- RUN:容器构建时要运行的命令
- CMD:容器启动时要运行的命令
- ENTRYPOINT:启动时的默认命令。与CMD相比,ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖
- VOLUME:容器数据卷,用于数据保持和持久化工作
- WORKDIR:指定在容器创建后,终端默认登录的进来工作目录,落脚点
- ONBUILD:当构建一个被继承的Dockerfile时运行命令。父镜像在被子镜像继承后父镜像的onbuild被触发
2、自定义的web容器服务(nginx)
-
拉取nginx镜像
输入命令获取nginx镜像
sudo docker pull nginx
- 查看本地镜像,nginx拉取成功
-
运行nginx
运行容器命令
sudo docker run --name <name> -p 8080:80 -d nginx
通过浏览器直接访问端口8080查看nginx服务
-
编辑配置文件
创建文件夹myweb
查看nginx配置信息
sudo docker exec -it <image id> /bin/bash cd /etc/nginx/conf.d cat default.conf
将上述信息复制到一个新的文件中,修改端口(80=>4052)和根目录,命名default.conf并保存在自己所创文件夹中
编写index.html文件,保存在自己所创文件夹中
编写Dockerfile文件,保存在自己所创文件夹中
-
构建镜像
构建命令
sudo docker build -t <Name> .
- 查看本地镜像,hcr_nginx已在本地镜像中,构建成功
-
运行容器,映射端口
sudo docker run --name <Name> -d -p <port1>:<port2> <Name>
-
查看结果
- 浏览器访问端口(4052),会显示自己所编写的index.html文件的内容
3、自定义的数据库容器服务(mysql)
-
主要参考博客
-
拉取一个较稳定的mysql版本
拉取mysql镜像,据说使用最新版本会有问题,因此这里选择mysql5.7
sudo docker pull mysql:5.7
- 查看本地镜像,mysql拉取成功
-
编辑配置文件
创建文件夹
编写Dockerfile
编写容器启动脚本setup.sh
先导入数据,然后再设置用户和权限。因为mysql容器一开始为免密登录,Dockerfile中有如下设置:ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
,此时执行导入数据命令不需要登录验证操作。如果是先执行权限操作,那么导入数据则需要登录验证,整个过程就麻烦了许多。
编写schema.sql并导入数据
编写mysql权限设置命令privileges.sql
-
创建镜像
docker build -t <Name> .
查看本地镜像,hcr_mysql已在本地镜像中,创建成功
-
启动容器,映射端口
docker run --name <Name> -d -p <>port1>:<port2> <name>
查看本地正在运行的容器,hcr_mysql在列表中
-
验证结果
进入容器,使用docker用户登录数据库
docker exec -it <容器ID> /bin/bash mysql -u <Sql_Name> -p
切换数据库
use docker_mysql;
查看数据库中的表
show tables;
查看表中数据
select * from user;
-
查看容器配置信息
使用docker inspect命令,该命令会返回一个json字符串,里面以key-value的格式准备了该容器相关的信息,内容十分丰富,可以一次性取得全部内容,也可以返回指定key对应的信息。
sudo docker inspect <容器ID> sudo docker inspect -f {<key>} <容器ID>
查看全部信息
查看容器端口映射
4、问题&解决
- 构建镜像的命令
docker build -t <Name> .
中,“.”表示上下文,很容易被忽略。- 在做自定义web容器服务做到最后一步在浏览器访问端口时显示未连接。经过排查发现是default.conf文件根目录修改时漏掉了“/”,文件修改后,删除原来的容器和镜像,然后重新创建运行即可。
- 在执行数据库切换、查询等数据库内部的操作时,如果命令末尾没有“;”,mysql会认为该句还没输入完整,系统不会执行该语句。
5、总结
一开始看到题目和要求时,毫无思路,在网上搜索了一会仍旧是一头雾水,无从下手。后来静下心研究了一下Dockerfile,总算是有了一点头绪,果然做事不能太心浮气躁,还是得循序渐进,一步一步慢慢来。通过本次作业完成的2个Dockerfile编写实践,懂得如何使用Dockerfile文件来实现自定义镜像,大致知道了编写Dockerfile的基本流程:编辑配置文件=>编辑Dockerfile(如何构建镜像)=>构建镜像=>运行容器。不过对于Dockerfile的一些指令还需要做进一步的理解和探究。