美文网首页
Dockerfile使用笔记

Dockerfile使用笔记

作者: 喵帕斯0_0 | 来源:发表于2018-10-28 21:17 被阅读18次

    最近在做项目时,从头搭了个基于Flask的小框架,由于小伙伴之前没有用Flaks写过项目,而我又引入了一些第三方包,为了方便小伙伴进行开发,无需重新自己从头搭建一套环境,就打算用Docker搭个环境,这样对大家都方便。之前学过Dockfile,不过忘记了大部分细节,因此,用这篇博客来记录。不过,用到啥,记啥,不想面面俱到,因此本篇随时更新。

    下面是我写的一个搭建Flask环境的Dockerfile文件

    FROM python:3.7.1-slim-stretch
    
    RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak  
    COPY sources.list /etc/apt/sources.list
    COPY requirements.txt /root/requirements.txt
    
    RUN mkdir ~/.pip \
        && echo "[global]\nindex-url = https://mirrors.aliyun.com/pypi/simple/" > ~/.pip/pip.conf \
        && ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime \
        && apt-get update \
        && apt-get install -y apt-utils \
        && apt-get install -y wget \
        && apt-get install -y curl \
        && apt-get install -y git \
        && apt-get install -y zsh \
        && chsh -s /bin/zsh \
        && pip install -r /root/requirements.txt
    
    RUN sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"  || true; \    
        echo "PROMPT='\$fg_bold[blue]%}(docker)\${ret_status} %{\$fg[cyan]%}%c%{\$reset_color%} \$(git_prompt_info)'" >> /root/.zshrc
    ENV FLASK_ENV dev
    ENV FLASK_APP main.py
    ENV APP_DIR /code
    WORKDIR /code/Vote
    
    EXPOSE 5000     
    
    CMD ["zsh"]
    
    基础指令介绍
    FROM

    FROM name:tag

    指定用来制作镜像的基础镜像,从官网hub上面可以找到许多十分优质的镜像,你可以在其基础上进行修改。
    我常用的基础镜像有ubuntu/python
    Docker还提供了一种虚拟镜像scratch,又表示空镜像,即不以任何系统为基础,这个用到的时候再详说把。

    COPY

    COPY 原路径 ... 目标路径
    COPY ["源路径", ... , "目标路径"] ---- 推荐

    COPY只能复制build过程中上下文的文件,上下文之外的文件不可复制,一般Dockerfile文件所在的目录就是其上下文。

    WORKDIR

    WORKDIR 工作目录路径

    指定后续各层的工作路径,如果不存在,Docker为自动为你创建给目录。
    在RUN中cd并不会影响后续各层的工作目录,只会影响盖层当前处理的目录

    EXPOSE

    EXPOSE <port1> ... <portn>

    仅仅用于声明容器想要暴露的端口,实际开启的端口由容器的服务决定另一方面在随机端口映射时,Docker会随机映射Docker指定的端口

    ENV

    ENV <key> <value>
    ENV <key>=<value> <key2>=<value2> ...

    设置环境变量,后续的指令(用$访问)或者运行的容器均可以像普通环境变量一样使用变量

    CMD

    CMD <命令>
    CMD ["可执行文件","参数1","参数2"...]

    设定容器启动时的默认执行命令,该命令应该是可以在前台一直运行的进程,否则容器一启动完进程运行结束后就立马关闭了

    RUN

    RUN <命令>
    RUN ["可执行文件","参数1","参数2" ... ]

    用来执行系统命令,如安装工具、解压包、下载文件等,主要构建镜像的逻辑都在于此。因为在Docker中,每一个指令都会构建一层,因此尽量将命令都放在一个RUN指令中,用 && 来串联
    在命令最后需要添加清理工作的命令,如apt-get purge -y --auto-remove wgetrm -rf /redis-3.2.5等删除下载数据或文件的命令,防止这些无用数据被添加到镜像中。

    其他
    1. 要使用$,需要使用\进行转义;
    2. Dockerfile支持shell的换行\
    3. 使用ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime修改镜像的时区;
    Docker-compose

    docker-compose本身使用来快速部署容器集群,它允许用户通过一个yml文件定义一组相关联的容器,从而成为一个项目。而我用compose的原因是方便自己定义启动容器的参数,从而无需在命令行中写入超长的命令启动,如docker run --rm -it -v ~/.SpaceVim:/root/.SpaceVim -v ~/.SpaceVim.d:/root/.SpaceVim.d -v ~/.vimrc:/root/.vimrc -v ~/.config:/root/.config develop

    通过docker-compose,我只需定义以下yml文件:

    version: '3'
    services:
        develop:
            image: "develop:1.0"
            ports:
                - "5000:5000"
            command: "zsh"
            volumes: 
                - ~/.SpaceVim:/root/.SpaceVim
                - ~/.SpaceVim.d:/root/.SpaceVim.d
        terminal:
            image: "terminal:1.0"
            command: "zsh"
            volumes: 
                - ~/.SpaceVim:/root/.SpaceVim
                - ~/.SpaceVim.d:/root/.SpaceVim.d
    

    就可以方便的使用命令docker-compose run --rm image_name启动我想要的容器,顺便也学习下docker-compose的用法。

    安装

    docker-composepython写的,因此通过pip install docker-compose就可以安装。

    yml文件

    简单介绍我用过的

    key value
    version docker-compose版本
    image 对应的镜像
    ports 端口映射
    command 容器启动执行命令
    volumes 卷映射
    docker-compose命令

    docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

    Command Description
    config 验证yml是否正确
    exec 进入指定的容器
    run 在指定服务器上执行一个命令,可带--rm参数,关闭后删除容器
    up 自动构建镜像,创建服务,启动服务等一条龙服务

    相关文章

      网友评论

          本文标题:Dockerfile使用笔记

          本文链接:https://www.haomeiwen.com/subject/hlaptqtx.html