1.简介
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
2.构建三步骤
编写Dockerfile文件
docker build
docker run
3.Dockerfile解析过程
3.1 Dockerfile内容基础知识
(1)每条保留字指令都必须为大写字母且后面要跟随至少一个参数
(2)指令按照从上到下,顺序执行
(3)#表示注释
(4)每条指令都会创建一个新的镜像层,并对镜像进行提交
3.2 Docker执行Dockerfile的大致流程
(1)docker从基础镜像运行一个容器
(2)执行一条指令并对容器作出修改
(3)执行类似docker commit 的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令直到所有指令都执行完成
4.Dockerfile结构体系
4.1 保留字指令
FROM : 基础镜像,当前镜像是基于哪个镜像的
MAINTAINER : 镜像维护着的姓名和邮箱地址
RUN:容器构建时需要运行的命令
EXPOSE: 当前容器对外暴露的端口号
WORKDIR: 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV: 用来在构建镜像过程中设置环境变量
ADD: 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY: 类似于ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内<目标路径>位置。(COPY src dest)(COPY [“src”,“dest”])
VOLUME: 容器数据卷,用于数据保存和持久化工作
CMD: 指定一个容器启动时要运行的命令,Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT: 指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。(追加 不会被覆盖)
ONBUILD: 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
5 . 案例
5.1 base镜像(scratch)
DockerHub 中99%的镜像都是通过base镜像中安装和配置需要的软件构建出来的
5.2 自定义镜像myUbuntu
(1)编写Dockerfile文件
在根目录下创建一个文件夹myDocker,并创建一个Dockerfile文件
cd /
sudo mkdir myDocker
cd myDocker
sudo gedit Dockerfile2
在Dockerfile2(因为我之前在这个文件夹下有个Dockerfile,所以这次新建一个在后面添加个2,按自己意愿) 中添加:
FROM ubuntu:18.04
MAINTAINER wjy
ENV MYPATH /usr/local #设置环境变量
# ADD sources.list /etc/apt/
WORKDIR $MYPATH
#COPY test ./test #将宿主机目录里的内容 复制 到 镜像/usr/local/test目录下
RUN apt-get update #更新包索引
RUN apt-get -y install vim #创建镜像时 安装vim
RUN apt-get -y install net-tools
RUN apt-get -y install gedit
EXPOSE 80 #对外端口号
CMD echo $MYPATH #打印
CMD echo "success--------ok!"
CMD /bin/bash #使用bash解释器
(2)然后build
sudo docker build -f /myDocker/Dockerfile2 -t myubuntu:1.0 . #-t后面的标签必须得小写,不然会出错,最后一个"." 表示在当前文件夹下执行
经过一系列构建,myubuntu:1.0构建成功了
(3)运行
sudo docker run -it myubuntu:1.0
或者指定名字或端口号:
sudo docker run -it --name myUbuntu ubuntu:18.04 #新建一个Ubuntu18.04容器 ,取别名myUbuntu ,并启动
sudo docker run -it -p 8888:8080 tomcat #docker端口8888映射tomcat端口8080 p 指定端口
sudo docker run -it -P tomcat # dockerP随机生成端口 映射 tomcat 端口8080
如果想将宿主机上的文件拷到容器中,也可以在创建好容器后在使用docker cp来拷贝:
例如:将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
docker cp /www/runoob 96f7f14e99ab:/www/
将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
docker cp /www/runoob 96f7f14e99ab:/www
将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。
docker cp 96f7f14e99ab:/www /tmp/
(4)导出镜像
sudo docker save -o /home/xxx/ubuntu_16.04.tar ubuntu:16.04 #将ubuntu:16.04导出到 /home/xxx/ 名字为ubuntu_16.04.tar
从上图可以看到 容器的初始目录变成了/usr/local,同时也可以使用 vim gedit 等工具了
(4)列出镜像的变更历史,docker history +镜像名
sudo docker history
5.4 本地镜像推到阿里云
(1)查看镜像,进入myubuntu:1.0镜像生成的容器,重新commit一个2.0版本的镜像
sudo docker images
sudo docker run -it myubuntu:1.0
ctrl +P+Q 不停止退出
sudo docker ps
sudo docker commit -m "new myubuntu 2.0" -a wjy af5fb67febf3 myubuntu:2.0
下图可以看到生成了myubuntu:2.0版本的镜像
(2)推向阿里云
进入阿里云网页:阿里云
自己可以注册账号,注册好后在容器镜像服务中点击创建镜像仓库
进去后先点击 创建命名空间
sudo docker login --username=哈书说大话 registry.cn-hangzhou.aliyuncs.com
会出现以下问题,一直没解决。。。
剩下的两条命令就是将ImageId改成自己的,镜像版本号改成自己想要的就行了。
遗憾的是上述那个问题没解决,希望哪位大神不吝赐教。。。
5.3 小结