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 查看相信信息
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 .)
执行后 如下图所示
虚悬镜像
[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 . 构建镜像,如图所示
** 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
参考小案例 (构建一个网站镜像)
需求:构建一个网站镜像 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浏览器查看是否已经更改了网站网页内容。