dockerfile 指令参数详情介绍

FROM    写一个dockerfile  文件里面写入FROM  来自于那个镜像  (FROM nginx 来自于nginx镜像)
RUN     镜像在构建的时候就会执行 RUN 后面跟的命令  (docker build . (构建))
COPY    把宿主机的文件复制一份到容器内
        COPY语法: copy qwe.txt /home/   表示将宿主机的qwe.txt 文件拷贝到容器的/home/目录下
        配合通配符多个文件的写法: copy qqq* /tmp/www?.txt  /home  将前面的多个路径下的文件拷贝到home下

ADD     和COPY基本一致,
	    ADD支持解压缩文件,如果是gzip,bzip2,xz,tar情况下,ADD指令将自动拷贝过去并解压
	    ADD语法: ADD qqq.tgz /home/    自动解压该文件并拷贝到home目录下

CMD     运行容器之后自动执行的某个命令
	    正常执行 docker run  -it centos bash
		如果不加入 bash 默认执行后就是执行的 CMD  CMD默认就是bash
		CMD用法: CMD ["/bin/bash"]  默认执行的就是bash  可以更改
		CMD ["cat", "/etc/os-release"]   即表示 该容器运行时默认执行 cat /etc/os-release
		就等于是 docker run  -it centos cat /etc/os-release

ENTRYPOINT  作用和CMD一样 区别就是CMD的参数就是单纯的参数 ENTRYPOINT的参数可以被系统灵活识别
		例: CMD ["yum","install","vim"]   docker run -it centos    执行centos容器时,会按照CMD写的格式自动执行yum安装vim
		但是没有-y选项,会提示是否输入-y
		如果使用的是ENTRYPOINT而不是CMD 那么运行镜像事就会自动识别-y选项
		docker run -it centos -y   #这个是CMD,无法识别-y选项 会报错,系统不知道后面的-y是什么意思
		docker run -it centos -y   #这个是ENTRYPOINT,系统会自动识别-y选项,直接运行yum安装vim,并识别-y选项进行安装

ARG/ENV 这两个指令都是给容器设置环境变量
		ENV用法:  ENV NAME="mysqlqqqqqqqq" 跟正常设置环境变量一样,ADD COPY FUN等等都可以调用该变量
		ARG       与ENV一样,区别就是ENV设置的变量无论在镜像构建时,或者容器运行时,该变量都可以使用
		ARG       只是用于构建镜像需要设置的变量,容器运行时就消失了

WORKDIR 用于dockerfile中,目录的切换,更改工作目录
		WORKDIR用法: WORKDIR /etc   表示运行容器时,进入容器后直接就在/etc目录下

USER    用于改变环境,用于切换用户
		USER用法: USER root 或者 USER abc  表示切换用户

VOLUME  容器运行时应该保证任何数据不写入存储层,运行容器产生的数据推荐使用挂载,写到宿主机上进行维护
		VOLUME用法: VIOLUME /data 表示将容器内的data文件夹,再运行容器时自动的挂载为匿名卷,
		任何向该目录写入的数据都不会被容器记入, 类似于 mount 挂载命令
		如写一个Dockerfile 时  VOLUNE ["/data1","/data2"]  可以直接挂载多个文件目录
		写了之后 运行该容器时,这两个目录自动的与宿主机上的该目录做好映射
		挂载使用步骤为:写了dockerfile加入了volume挂载之后构建镜像,然后运行该镜像,
		根据docker ps -a 找到该镜像的id号,然后使用 inspect进行查看相关信息
详细解释如下图所示  使用docker inspect  跟容器的id 查看相信信息

image.png

image.png

image.png

dockerfile 实践

需求: docker pull centos 下载的镜像不具备 vim ifconfig 等相关命令, 构建一个新的centos镜像,且镜像内能够使用vim+ifconfig+jdk8 jdk8的下载链接:https://mirrors.yangxingzhen.com/jdk/jdk-8u171-linux-x64.tar.gz

1、编写dockerfile, 注意文件名称,必须是dockerfile

[root@localhost ~]#  mkdir /docker
[root@localhost ~]# cd /docker
[root@localhost docker]# ls 
jdk-8u171-linux-x64.tar.gz		    jdk安装包
[root@localhost docker]# vim dockerfile     创建Dockerfile  添加下列内容
#定义来自 centos 
FROM centos:7

#创建变量
ENV MY_PATH /usr/local

#引用变量。运行容器时进入到指定路径下
WORKDIR $MY_PATH

#下载vim
RUN yum -y install vim

#下载ifconfig命令
RUN yum -y install net-tools

# 安装java8和 lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java

#ADD将相对路径下jar包添加到容器中(将宿主机下的jar包添加到容器内并解压到指定目录下),注意安装包必须要和Dockerfile文件在同一个位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java

#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

#爆露出80端口
EXPOSE 80

#自动运行命令
CMD echo $path
CMD echo "success~~~~~~~~~~~~~~~~~~~~~~~~OK"
CMD /bin/bash

使用build 构建dockerfile镜像

[root@localhost docker]# pwd
/docker
[root@localhost docker]# ls 
dockerfile  jdk-8u171-linux-x64.tar.gz
[root@localhost docker]# docker build -t centos:1.1 .
# docker build 构建镜像
# -t 自定义镜像名称及版本号
# . 表示在当前目录下

PS:docker build -t centos:1.1 . 该命令构建镜像时默认在当前目录中使用dockerfile文件,如果同一目录下有多个dockerfile文件时,
								需要使用-f 指定,例如(docker build -f dockerfile -t centos:1.1 .)

执行后 如下图所示

image.png

虚悬镜像

[root@localhost test]# pwd 
/docker/test
[root@localhost test]# ls 
[root@localhost test]# vim dockerfile    写入下方错误的内容
[root@localhost test]# cat dockerfile 
from centos
cmd echo 'centos install is ok……’
[root@localhost test]# docker build .     构建镜像,如图所示

1689145575119.jpg

** PS:构建或者删除的时候出现某些错误,导致仓库和tag都为<none> <none> 的即表示为虚悬镜像, 如果出现这种情况可能会对服务器造成一定的隐藏风险,最少删除掉**

docker image ls -f dangling=true   
查找容器内的虚悬镜像

[root@localhost test]# docker image ls -f dangling=true
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
<none>       <none>    4ebe495a01e3   22 months ago   231MB

docker image prune
删除虚悬镜像

[root@localhost test]# docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:4ebe495a01e3aa48a30e6ea16b2f820117d71750c64b80d9503425c24937fed0

Total reclaimed space: 0B
[root@localhost test]# docker image

image.png

参考小案例 (构建一个网站镜像)

需求:构建一个网站镜像 1.用python语言,基于flask web框架,开发一个网站,写一个后端的网站代码 2.开发dockerfile,部署该代码,生成镜像 3.其他人基于该镜像,docker run 就可以在电脑上跑起来

#在宿主机下,准备一个目录
#写一个flask的python代码

#1.创建代码文件
[root@localhost docker]# touch aaa_flask.py  #写入下列内容
#coding:utf8
from flask import Flask
app=Flask(__name__)
@app.route('/hello')
def hello():
 return "hello,welcome to docker."
if __name__=="__main__":
 app.run(host='0.0.0.0',port=8080)

#2.编写dockerfile 
[root@localhost docker]# vim Dockerfile  #写入如下内容
FROM centos
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo;
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo;
RUN yum makecache fast;
RUN yum install python3-devel python3-pip -y
RUN pip install -i http://pypi.douban.com/simple flask
COPY  aaa_flask.py /opt
WORKDIR /opt
EXPOSE 8080
CMD ["python","aaa_flask.py"]

#3.构建镜像
[root@localhost docker]# docker build --no-cache -t 'centos-171/my_flask_web' .
# -t 自定义镜像名称  单引号引住 --no-cache 不使用旧缓存,重新下载构建   后面不要忘记 点
#最后的结果类似如下图二 才是正确

#4.运行镜像 生成容器。
docker images  #查看是否生成了 centos-171/my_flask_web 该镜像
#生成之后 使用该镜像进行启动容器,需要做的只是一个端口映射 因为设置了CMD 所以容器启动后会自动执行CMD的命令
#ducker run -d --name myabc -p 90:8080 centos-171/my_flask_web
# 执行后 看是否返回启动成功的容器id  docker ps 查看 是否正确,然后确定端口转发情况

#5. 访问宿主机查看容器内flask web网站 
#通过宿主机ip地址 192.168.xx.xx:90/hello  
#由于设置了端口映射,还有上方脚本文件的路径,因此需要加入:90/hello 才能正确访问到

如何修改容器内网站的信息

#1.修改容器内网站的信息 进入容器
docker exec -it 容器id bash  
这时进入到了 /opt 目录下 该目录下有个脚本文件(都是上面的dockerfile定义的)

#2 编辑修改脚本文件
然后vi 打开脚本文件,修改网页显示的信息即可,

#3 退出容器 重启容器
exit  退出
docker restart 容器id  进行重启  
docker ps  查看是否一切正常,  最后web浏览器查看是否已经更改了网站网页内容。

image.pngimage.png