Dockerfile是docker的脚本指令,分层写,每一条指令构建一层
以tomcat为例子:
在/usr/local/tomcat 建立tomcat文件夹
vi Dockerfile 建立文本,在里面写入docker命令即可
FROM tomcat:9-jre8 指定基础镜像
RUN ehco "hello docker" > /usr/local/tomcat/webapps/ROOT/index.html
写完之后 构建镜像
docker build -t 标签名 . 镜像上下文路径
docker build -t myshop .
然后docker images查询镜像是否被创建
docker run -p 8080:8080 myshop 启动容器,看是否成功
解释一下命令的作用:
from所有镜像必须要有,而且在最开始
run 执行程序命令
workdir 指定路径为工作目录,这个很重要。因为不指定的话run每次都是从默认的目录开始执行,如果两个run有目录变更,就会导致路径衔接不上去
镜像默认工作目录在哪里呢?
容器启动的时候切换到的目录就是工作目录
expose 暴露服务端口,好处是启动后程序员能直接看见这个端口,但不是因为有了这个ecpose这个端口就会被打开,只有本身被打开,才会打开
copy index.html /usr/local/tomcat/webapps/ROOT 将上下文中的index.html文件拷贝到 镜像的目录下
左边是上下文路径 右边是镜像路径
add 和copy类似,但是add url可以拷贝一个链接 add *.gz 复制和解压缩
因此add不明白语义
上下文:
docker build -t . 会讲当前目录整个打包压缩发送给docker服务器。服务器解压获得文件,而这个目录就是上下文目录
如果使用copy ./abc.txt ./app/ ./abc.txt指的是上下文路径下的abc.txt文件 复制到/app/下
上下文环境中的abc.txt,也就是说你必须把文件放在你构建Dockerfile的目录下,不然没有办法复制到。
另外注意虚悬镜像问题:
docker pull 和 build 都会触发虚悬镜像问题,新旧镜像同名,新的镜像会取代旧的镜像,旧的镜像名字为none
容器启动:
docker run -p 8080:8080 tomcat 将宿主机的8080端口映射到容器的8080端口上