Dockerfile使用笔记

最近在做项目时,从头搭了个基于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 ...

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

ENV

ENV
ENV = = ...

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

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 ...] [options] [COMMAND] [ARGS...]

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

你可能感兴趣的:(Dockerfile使用笔记)