zoukankan      html  css  js  c++  java
  • 利用dockerfile定制镜像

    利用dockerfile定制镜像

    镜像的定制就是定制每一层所添加的配置、文件。如果可以吧每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile。
    Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
    #指定一个基础镜像
    FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
    FROM centos #使用base image
    FROM ubuntu:14.04 #带有tag的base image
    
    LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
    LABEL maintainer=“yc_uuu@163.com"
    
    #对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
    RUN yum update && yum install -y vim 
        Python-dev #反斜线换行
    RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”
    
    WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
    WORKDIR /test #如果没有就自动创建
    WORKDIR demo #再进入demo文件夹
    RUN pwd     #打印结果应该是/test/demo
    

    #ADD是添加文件,从物理机本地,添加到容器空间内 ADD and COPY ADD hello / #把本地文件添加到镜像中,把本地的hello可执行文件拷贝到镜像的/目录 ADD test.tar.gz /tmp #将物理环境下的test添加到容器tmp目录并解压,但是建议使用copy WORKDIR /root ADD hello test/ #进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径 COPY hello test/ #等同于上述ADD效果 ADD与COPY - 优先使用COPY命令 -ADD除了COPY功能还有解压功能 添加远程文件/目录使用curl或wget ENV #环境变量,尽可能使用ENV增加可维护性 ENV MYSQL_VERSION 5.6 #设置一个mysql常量 RUN yum install -y mysql-server=“${MYSQL_VERSION}” VOLUME and EXPOSE 存储和网络 RUN and CMD and ENTRYPOINT RUN:执行命令并创建新的Image Layer CMD:设置容器启动后默认执行的命令和参数 ENTRYPOINT:设置容器启动时运行的命令 Shell格式和Exec格式 RUN yum install -y vim CMD echo ”hello docker” ENTRYPOINT echo “hello docker” Exec格式 RUN [“apt-get”,”install”,”-y”,”vim”] CMD [“/bin/echo”,”hello docker”] ENTRYPOINT [“/bin/echo”,”hello docker”] 通过shell格式去运行命令,会读取$name指令,而exec格式是仅仅的执行一个命令,而不是shell指令 cat Dockerfile FROM centos ENV name Docker ENTRYPOINT [“/bin/echo”,”hello $name”]#这个仅仅是执行echo命令,读取不了shell变量 ENTRYPOINT [“/bin/bash”,”-c”,”echo hello $name"] CMD 容器启动时默认执行的命令 如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略 如果定义多个CMD,只有最后一个执行 ENTRYPOINT 让容器以应用程序或服务形式运行 不会被忽略,一定会执行 最佳实践:写一个shell脚本作为entrypoint COPY docker-entrypoint.sh /usr/local/bin ENTRYPOINT [“docker-entrypoint.sh] EXPOSE 27017 CMD [“mongod”] [root@master home]# more Dockerfile FROm centos ENV name Docker #CMD ["/bin/bash","-c","echo hello $name"] ENTRYPOINT ["/bin/bash","-c","echo hello $name”]

    打包flask程序与dockerfile

    环境准备

    [root@localhost ~]# cd /opt/
    [root@localhost opt]# mkdir mydocker
    [root@localhost opt]# cd mydocker/
    [root@localhost mydocker]# touch myflask.py
    [root@localhost mydocker]# vim myflask.py 

    写入一下内容

    #coding:utf8
    from flask import Flask
    app=Flask(__name__)
    @app.route('/')
    def hello():
        return "hello docker"
    if __name__=="__main__":
        app.run(host='0.0.0.0',port=8080)

    准备构建dockerfile,用于生成镜像

    拷贝本地的yum仓库到容器内部空间

    [root@localhost mydocker]# cp /etc/yum.repos.d/CentOS-Base.repo .
    [root@localhost mydocker]#  cp /etc/yum.repos.d/epel.repo .
    [root@localhost mydocker]# ll
    总用量 12
    -rw-r--r--. 1 root root 2523 3月  14 19:29 CentOS-Base.repo
    -rw-r--r--. 1 root root  664 3月  14 19:30 epel.repo
    -rw-r--r--. 1 root root  176 3月  14 19:19 myflask.py

    创建Dockerfile文件,必须大写的D开头

    [root@localhost mydocker]# touch Dockerfile

    写入内容

    FROM centos     #指定一个基础镜像 
    COPY CentOS-Base.repo /etc/yum.repos.d/  #拷贝本地的yum仓库,到容器空间内               
    COPY epel.repo /etc/yum.repos.d/    
    RUN yum clean all  #清除yum缓存
    RUN yum install python-setuptools -y
    RUN easy_install flask   #linux默认使用python2,想要使用python3使用RUN 执行命令安装
    COPY myflask.py /opt/
    WORKDIR /opt       
    EXPOSE 8080     #暴露容器的8080端口,供给物理机去映射访问,myflask.py 设置的端口
    CMD ["python","myflask.py"]       #cmd代表执行命令
    [root@localhost mydocker]# ls
    CentOS-Base.repo  Dockerfile  epel.repo  myflask.py

    构建镜像

    确保文件在同一目录

    [root@localhost mydocker]# ll
    总用量 16
    -rw-r--r--. 1 root root 2523 3月  14 19:29 CentOS-Base.repo
    -rw-r--r--. 1 root root  281 3月  14 20:47 Dockerfile
    -rw-r--r--. 1 root root  664 3月  14 19:30 epel.repo
    -rw-r--r--. 1 root root  176 3月  14 19:19 myflask.py
    [root@localhost mydocker]# docker build .   
    会去执行当前目录中的Dockerfile文件
    构建了一个ID为a7f439ad8953 的镜像
     ---> a7f439ad8953
    Successfully built a7f439ad8953
    [root@localhost mydocker]# docker tag  a7f myflask
    [root@localhost mydocker]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    myflask             latest              a7f439ad8953        3 minutes ago       346MB

    运行镜像,生成容器实例

    [root@localhost mydocker]# docker run -p 8080:8080 -d a7f 
    e6e1721be1c346f05c8913c2efed6bb3f3564f97ff6b2e64caad18d64c6a5e32
    [root@localhost mydocker]# docker ps
    CONTAINER ID        IMAGE               COMMAND               CREATED              STATUS              PORTS                    NAMES
    e6e1721be1c3        a7f                 "python myflask.py"   About a minute ago   Up About a minute   0.0.0.0:8080->8080/tcp   thirsty_swanson

    查看容器的映射状态

    [root@localhost mydocker]# docker port e6e
    8080/tcp -> 0.0.0.0:8080

    访问windows

    http://192.168.11.174:8080/
  • 相关阅读:
    cv2.imwrite()指定图片存储路径问题
    fgets读取文件最后一行重复问题
    KEAZ128 时钟配置
    MinGW x64 for Windows安装
    [python] pygame安装与配置
    S32K144之时钟配置
    C/C++ scanf和gets 区别 , printf和puts区别
    堆排序
    约瑟夫问题
    Coursera 国内无法登陆问题
  • 原文地址:https://www.cnblogs.com/wanglan/p/7458327.html
Copyright © 2011-2022 走看看