zoukankan      html  css  js  c++  java
  • Dockerfile

    镜像是容器的基础,每次执行docker run的时候都会指定哪个镜像作为容器运行的基础。我们之前的例子都是使用来自docker hub的镜像,直接使用这些镜像只能满足一定的需求,当镜像无法满足我们的需求时,就得自定制这些镜像。

    镜像的定制就是定制每一层所添加的配置、文件。如果可以把每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile
    Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

    .Dockerfile指令解析

    1. FROM参数(指定基础镜像)

    FROM scratch # 制作base image基础镜像,尽量使用官方的image作为base image

    FROM centos # centos为基础镜像,进行二次构建镜像

    FROM ubuntu:14.04 # 带有tagbase image

    2. LABEL参数(标签, 定义作者信息)

    LABEL version=“1.0” # 容器元信息,帮助信息,Metadata,类似于代码注释

    LABEL maintainer=”zero@163.com" # 标签表示作者信息

    3. RUN参数(是一个万能指令,执行命令)

    #对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!

    RUN yum update && yum install -y vim

        Python-dev # 反斜线换行

    RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”

    4. WORKDIR参数(相当于linuxcd命令)

    WORKDIR /root # 相当于linuxcd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd

    WORKDIR /test # 如果没有就自动创建

    WORKDIR demo # 再进入demo文件夹

    RUN pwd     # 打印结果应该是/test/demo

    5. ADD参数(把宿主机的一个文件,添加到容器空间内)

    ADD /opt/django/manage.py /opt/  # 把宿主机的/opt/django/manage.py放到容器空间内的/opt/目录下

    ADD /opt/python3.6.tar.gz /opt/  # ADD的解压文件作用,将宿主机的/opt/下的python3.6.tar.gz解压到容器内的/opt/目录下

    ADD and COPY

    ADD hello /  #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录

    ADD test.tar.gz /  #添加到根目录并解压

    WORKDIR /root

    ADD hello test/  # 进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径

    COPY hello test/  # 等同于上述ADD效果

    6. COPY参数(拷贝指令)

    # 将宿主机的文件, 拷贝到容器内,但是没有解压缩的命令,尽量使用COPY,不要使用ADD

    COPY filename /opt/

    ADDCOPY

       - 优先使用COPY命令

        -ADD除了COPY功能还有解压功能

    添加远程文件/目录使用curlwget

    7. ENV参数(docker的环境参数指令)

    ENV # 环境变量,尽可能使用ENV增加可维护性

    ENV MYSQL_VERSION 5.6 # 设置一个mysql常量,这个${MYSQL_VERSION}类似于全局常量

    RUN yum install -y mysql-server=“${MYSQL_VERSION}”  # 如果版本号有变更,则只需要改这个常量就可以了

    8.其他参数介绍

    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 DockerfileFROm centos

    ENV name Docker#CMD ["/bin/bash","-c","echo hello $name"]

    ENTRYPOINT ["/bin/bash","-c","echo hello $name”]

    二.使用Dockerfile创建一个django并运行

    1.使用Dockerfile封装Django镜像

    (1)查看镜像

    首先需要一个最基础的镜像centos

    2.将需要的安装包放在一个目录下

    例:

    /opt下建立了docker目录,下载一个django的源码包,touch Dockerfilerun.sh,其中run.sh是用来执行Djangobash脚本,Dockerfile即为自动build python的文件,此文中的核心也是Dockerfile.

    wget https://media.djangoproject.com/releases/2.1/Django-2.1.7.tar.gz

    下载阿里云源与扩展源epel.repo文件,也放在此目录

    # wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    #wget -O epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

     

    3.编写运行项目的脚本

    vim run.sh

    python3 manage.py runserver 0.0.0.0:8000

    4..编写dockerfile文件

    以上为准备好的所有文件

    解析版:

    FROM centos   # 基础镜像使用centos
    MAINTAINER zero # 作者信息zero
    
    ADD CentOS-Base.repo /etc/yum.repos.d  # 将CentOS-Base.repo换为阿里源
    ADD epel.repo /etc/yum.repos.d  # epel.repo 源放到容器中
    RUN yum clean all  # 清空yum缓存
    RUN yum makecache # 创建新的yum缓存
    RUN yum update -y  # 更新库文件
    
    RUN yum install -y python36  # 安装python
    RUN yum install -y python36-pip # 安装pip
    RUN pip3 install setuptools  # 安装setuptools
    ADD Django-2.1.7.tar.gz /opt/ # 放入django包并解压
    
    WORKDIR /opt/
    RUN mv Django-2.1.7 django  # 进入目录修改文件名
    
    WORKDIR /opt/django
    RUN python3 setup.py install   # 安装setup工具
    
    WORKDIR /opt
    RUN django-admin.py startproject djangodemo  # 创建项目
    
    ADD run.sh /opt/djangodemo/run.sh  # 运行run脚本
    RUN sed -i "s/ALLOWED_HOSTS = []/ALLOWED_HOSTS = ['*']/g" /opt/djangodemo/djangodemo/settings.py  # 使用sed修改django项目配置文件
    WORKDIR /opt/djangodemo
    RUN chmod 777 run.sh  # 给脚本添加权限
    EXPOSE 8000  # 声明容器端口8000
    CMD ["/bin/sh","run.sh"]  # 

    简洁版:

    FROM centos
    MAINTAINER zero
    
    ADD CentOS-Base.repo /etc/yum.repos.d
    ADD epel.repo /etc/yum.repos.d
    RUN yum clean all
    RUN yum makecache
    RUN yum update -y
    
    RUN yum install -y python36
    RUN yum install -y python36-pip
    RUN pip3 install setuptools
    ADD Django-2.1.7.tar.gz /opt/
    
    WORKDIR /opt/
    RUN mv Django-2.1.7 django
    
    WORKDIR /opt/django
    RUN python3 setup.py install
    
    WORKDIR /opt
    RUN django-admin.py startproject djangodemo
    
    ADD run.sh /opt/djangodemo/run.sh
    RUN sed -i "s/ALLOWED_HOSTS = []/ALLOWED_HOSTS = ['*']/g" /opt/djangodemo/djangodemo/settings.py
    WORKDIR /opt/djangodemo
    RUN chmod 777 run.sh
    EXPOSE 8000
    CMD ["/bin/sh","run.sh"]
    View Code

    5.构建镜像并运行

    # Dockerfile的内容进行构建成名为 zero/djangodemo-217的镜像并放于当前目录

    # docker build -t zero/djangodemo-217 .

    # 上面这个过程需要十分钟左右

    最后构建成功

    运行镜像

    # 服务器端口9090映射容器8000端口 后面为镜像名

    [root@node209 docker]# docker run -d -p 9090:8000 zero/djangodemo-217

    进入容器检查下项目进程

    [root@node209 docker]# docker exec -it 373876e5ac68  /bin/bash

    [root@373876e5ac68 djangodemo]#  ps -ef 

     

    项目成功启动

  • 相关阅读:
    iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)
    iOS NSArray数组过滤
    App Store2016年最新审核规则
    iOS 根据字符串数目,自定义Label等控件的高度
    iOS 证书Bug The identity used to sign the executable is no longer valid 解决方案
    Entity FrameWork 增删查改的本质
    EF容器---代理类对象
    Entity FrameWork 延迟加载本质(二)
    Entity FrameWork 延迟加载的本质(一)
    Entity FrameWork 增删查改
  • 原文地址:https://www.cnblogs.com/hszstudypy/p/11574475.html
Copyright © 2011-2022 走看看