目录
2.1 新建tomcat的Dockerfile,创建新镜像jforum/tomcat,用新镜像创建容器,配置
2.2 新建mysql的Dockerfile,创建新镜像jforum/mysql, 用新镜像创建容器,配置
2.3 重启tomcat容器,在浏览器端访问jforum网页
【写在前面】
在前文中通过命令逐步实现过该操作, 这里在学了Dockerfile之后,尝试用Dockerfile来实现。
前文参考:Docker操作(四):tomcat中部署jforum应用,连接mysql数据库
1. 设计要求
2. 操作步骤
2.1 新建tomcat的Dockerfile,创建新镜像jforum/tomcat,用新镜像创建容器,配置
(1)将要放到tomcat容器的war包放到文件夹jforum_tomcat下(文件夹下不要有其他无关的文件,因为最终都会被加载到新镜像里)
(2)在文件夹jforum_tomcat下,vim创建Dockerfile文件(名字就是Dockerfile)
注:在Dockerfile中利用参数,将宿主机上的目录或文件拷贝到镜像中(会自动解压)
(3)创建新镜像:docker build -t 新镜像名 .
(4)生成了新镜像,用新镜像启动新容器
(5)将需要修改的配置文件从容器中拷贝到宿主服务器,进行修改,然后重新拷贝回容器中,覆盖旧的配置文件 (因为上面创建容器是没有使用数据卷,所以这里只能通过cp命令拷贝修改)
2.2 新建mysql的Dockerfile,创建新镜像jforum/mysql, 用新镜像创建容器,配置
(1)新建一个文件夹jforum_mysql,存放:jforum.sql
(2)在文件夹jforum_mysql中,新建 create.sql 脚本
create.sql脚本的作用:在登录MySQL后,操作数据库相关的命令,比如新建数据库,授权,导入jforum.sql库表等。
(3)在文件夹jforum_mysql中,新建 setup.sh 脚本
setup.sh脚本的作用:用于启动mysql服务,然后导入脚本create.sql进而对数据库进行具体操作。
(4)在文件夹jforum_mysql中,新建 Dockerfile
Dockerfile中导入上面几个脚本和数据库资源文件,然后运行相关脚本
(5)创建新镜像:docker build -t 新镜像名 .
(6)生成了新镜像,用新镜像启动新容器
2.3 重启tomcat容器,在浏览器端访问jforum网页
命令:docker restart jforum_tomcat1
网址: http://IP:tomcat端口/jforum-2.1.9/forums/list.page
3. 补充知识点
(1)docker history 镜像名:查看镜像的详细构建信息/过程
(2)一般不在Dockerfile里进行解压命令,因为解压文件名不可控。都是解压好并改好名字后,再建Dockerfile。 比如上文例子中的tomcat9。
(3)手动生成tomcat镜像时,docker run 命令行中的 - -privileged=true是给予管理员权限,/usr/sbin/init是给超级管理员用的。
(4)因为Dockerfile里无法执行mysql相关的命令,所以:需要把mysql内部运行相关的命令,比如导入source.sql库信息,授权信息等,写到一个.sql脚本中。
然后,把mysql操作相关的命令的脚本.sql(如登录,加载数据文件等),写到另外的shell脚本里,在shell脚本中调用, 比如mysql < create.sql。同时,在shell脚本里还执行了启动mysql, 关闭等任务。
最后,在Dockerfile里通过CMD或者ENTRYPOINT["sh", "xxx" ]来运行shell脚本。
(5)Dockerfile文件创建好之后,很多内容都配置好了,生成镜像后,就可以根据镜像快速的启动容器 (docker run),命令行就不需要加很多参数了。
(6)Dockerfile中,参数比如RUN 后面的路径是容器/镜像里的,这些路径不会自动创建,要自己mkdir。 注意创建的目录和其他句子中用到的目录要一致,否则会报错。
(7)RUN之类的,执行的是Linux本身的一些命令。ADD将服务器里某个目录的内容,添加到容器里面,后面接的是容器里的路径,不是宿主机里的。
(8)Dockerfile文件里的内容,都是针对容器来说的,就是在容器里执行的。
(9)如何对待错误?要看报错内容,查看日志; docker logs -f 容器ID
(10)只要没有语法错误,打镜像一般都是能成功的。但是如果有错误,那在之后的启动/运行容器过程中,就会报错。有时候run 一开始是成功的,但是过了一会儿ps -a看,Exited了,说明前面可能还没执行到错误的地方。此时, docker logs -f 容器ID 来查看具体的日志信息。