• 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 

     

    项目成功启动

  • 相关阅读:
    JSP学习(一)
    Servlet学习(五)——通过response设置响应体及中文乱码问题
    SQLServer -------- 不展示后两位小数
    MySQL ------ 数据库操作 (二)
    MySQL ------ CentOS 上 安装mysql (一)
    java ----------- I/O (六) 标准输入输出流
    java ----- I/O (五) 数据流读写文件
    Linux ------ centos 上安装JDK
    iis 中找不到安装的 .net 4.0
    清理C 盘
  • 原文地址:https://www.cnblogs.com/hszstudypy/p/11574475.html
Copyright © 2020-2023  润新知