DockerFile

直接上一个例子nginx

from conda/miniconda3

MAINTAINER liangsqrt

COPY ./jupyter /root/.jupyter
COPY ./requirements.txt /home/jupyter/requirements.txt
COPY ./sources.list /etc/apt/sources.list
COPY ./condarc /root/.condarc

RUN pip --disable-pip-version-check --no-cache-dir install pylint -i https://pypi.douban.com/simple \
    && if [ -f "/tmp/conda-tmp/environment.yml" ]; then /opt/conda/bin/conda env update -n base -f /tmp/conda-tmp/environment.yml; fi \
    && rm -rf /tmp/conda-tmp \
    && pip install -i https://pypi.douban.com/simple -r /home/jupyter/requirements.txt \
    # && conda install scrapy

当我想要启动一个jupyter的容器时,我须要个性化定制一下,好比定制开放端口,jupyyter的根路径、用户密码这些。方法有一下几种:git

  1. 直接运行jupyter,容器起来后,进入容器,生成密码,并完成相关的个性化功能。缺点:每次重启容器后,部分指令要进入容器从新敲(没有在启动容器的时候就写好的指令);想要建立多个这样的容器太难
  2. Docker-compose 能够,可是启动多个容器时,至关因而在基础容器上安装新功能
  3. DockerFile生成自定义的镜像,直接经过镜像启动

因而我选择了二、3组合使用的方案。好比切换pip安装的依赖项放到了镜像里;加载镜像建立容器的指令我放到了docker-compose里。docker

DockerFile详解

from

介绍这个镜像是基于哪一个镜像的。通常会在本地找,写个本地的镜像便可,若是没有,就会去网上找。ubuntu

MAINTAINER

维护者或做者,可有可无。bash

COPY

将哪些东西复制到容器里边,copy进入容器里边的东西和外部的东西,是两套东西,会占用两个硬盘内存。copy的时候还可使用正则,~ 源文件或者源目录,这里能够是通配符表达式,其通配符规则要知足 Go 的 filepath.Match 规则 ~scrapy

COPY hom* /mydir/
COPY hom?.txt /mydir/
RUN

用于执行后面跟着的命令行命令, 很是重要,很经常使用。ui

ADD

用法和copy几乎同样,在copytar文件,且压缩编码方式为gzip,bzip或者zx的状况下,它会自动解压!!!有点坑,有时候会解压时报致使编排失败,或者缓慢。编码

CMD

相似于 RUN 指令,用于运行程序,但两者运行的时间点不一样spa

  • CMD 在docker run 时运行
  • RUN 是在 docker build

启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。其实用途也不大,多数时候这个功能都被docker-compose替换了。操作系统

ENTRYPOINT

理解很容易,当run要带参数运行时,就用它。咱们手启run,参数也不会被覆盖,好比:

$ docker run  nginx:test

若是咱们镜像里指定好了,那么里边实际运行的指令是:nginx -c /etc/nginx/nginx.conf

除非特地传参-c:

docker run  nginx:test -c /etc/nginx/new.conf

其实也没什么用。

ENV

环境变量,设置docker里边的环境变量的值。

VOLUME

挂在路径用的。好比要讲容器中的某个路径,映射出来,就能够用这个。跟copy不同,这个路径是容器和宿主机均可以访问的,文件也只有一份。这个功能很经常使用。命令行里边用它的方法是 -v

EXPOSE

仅仅只是声明端口。

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
WORKDIR

指定工做目录。用 WORKDIR 指定的工做目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工做目录,必须是提早建立好的)。docker build 构建镜像过程当中的,每个 RUN 命令都是新建的一层。只有经过 WORKDIR 建立的目录才会一直存在。

Docker层概念,以及精简docker镜像大小

docker的镜像是分层的,每个指令都会增长dockerImage的层数,加大docker镜像的体积

image.png

因为docker用到的copy-on-write技术(git中也用到了这个技术),就是说当你在docker里建立了某个文件,以后再删除掉,这个文件还在吗?还在的!并且建立和删除执行了两次,docker就增长了两层。

因此精简的第一步,减小层,经过减小指令的方式

通常随便几层,就有个几百兆的样子。这是影响镜像大小最直观的地方。因此run方法,最好就一个,直接用&&链接符将他们串联起来。通常这样操做后,效果比较直观。

更精简的镜像

用更精简的镜像,效果不大,

用docker的improt 和export

但麻烦的是须要先将容器运行起来,并且这个过程当中你会丢失镜像原有的一些信息,好比:导出端口,环境变量,默认指令。

Docker部署

容器导出导入 export import

无论这个容器是否是在运行,均可以导出它,而后交给同事拿去部署,可是会丢失启动指令呀,端口,硬盘映射路径这些,里边只是包含了你的代码环境。

# 导入语法
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
# 例子
docker import  my_ubuntu_v3.tar runoob/ubuntu:v4
# 导入语法
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
# 例子
docker import  my_ubuntu_v3.tar runoob/ubuntu:v4
镜像导出导入
# 导出语法
docker save [OPTIONS] IMAGE [IMAGE...]
# 例子,若是须要跨操做系统,请使用 -o 方式
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
docker save runoob/ubuntu:v3 > my_ubuntu_v3.tar

# 导入语法
docker load [OPTIONS]
# 例子,若是须要跨操做系统,请使用 -i 方式
docker load -i ubuntu.tar
docker load < ubuntu.tar
  • docker save 保存的是镜像,docker export 保存的是容器
  • docker load 用来载入镜像包,docker import 用来载入容器包,但二者都会恢复为镜像
  • docker load 不能对载入的镜像重命名,而 docker import 能够为镜像指定新名称
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息