直接上一个例子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
因而我选择了二、3组合使用的方案。好比切换pip安装的依赖项放到了镜像里;加载镜像建立容器的指令我放到了docker-compose里。docker
介绍这个镜像是基于哪一个镜像的。通常会在本地找,写个本地的镜像便可,若是没有,就会去网上找。ubuntu
维护者或做者,可有可无。bash
将哪些东西复制到容器里边,copy进入容器里边的东西和外部的东西,是两套东西,会占用两个硬盘内存。copy的时候还可使用正则,~ 源文件或者源目录,这里能够是通配符表达式,其通配符规则要知足 Go 的 filepath.Match 规则 ~scrapy
COPY hom* /mydir/ COPY hom?.txt /mydir/
用于执行后面跟着的命令行命令, 很是重要,很经常使用。ui
用法和copy几乎同样,在copytar文件,且压缩编码方式为gzip,bzip或者zx的状况下,它会自动解压!!!有点坑,有时候会解压时报致使编排失败,或者缓慢。编码
相似于 RUN 指令,用于运行程序,但两者运行的时间点不一样spa
启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。其实用途也不大,多数时候这个功能都被docker-compose替换了。操作系统
理解很容易,当run要带参数运行时,就用它。咱们手启run,参数也不会被覆盖,好比:
$ docker run nginx:test
若是咱们镜像里指定好了,那么里边实际运行的指令是:nginx -c /etc/nginx/nginx.conf
除非特地传参-c:
docker run nginx:test -c /etc/nginx/new.conf
其实也没什么用。
环境变量,设置docker里边的环境变量的值。
挂在路径用的。好比要讲容器中的某个路径,映射出来,就能够用这个。跟copy不同,这个路径是容器和宿主机均可以访问的,文件也只有一份。这个功能很经常使用。命令行里边用它的方法是 -v
仅仅只是声明端口。
指定工做目录。用 WORKDIR 指定的工做目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工做目录,必须是提早建立好的)。docker build 构建镜像过程当中的,每个 RUN 命令都是新建的一层。只有经过 WORKDIR 建立的目录才会一直存在。
docker的镜像是分层的,每个指令都会增长dockerImage的层数,加大docker镜像的体积
因为docker用到的copy-on-write技术(git中也用到了这个技术),就是说当你在docker里建立了某个文件,以后再删除掉,这个文件还在吗?还在的!并且建立和删除执行了两次,docker就增长了两层。
通常随便几层,就有个几百兆的样子。这是影响镜像大小最直观的地方。因此run方法,最好就一个,直接用&&链接符将他们串联起来。通常这样操做后,效果比较直观。
用更精简的镜像,效果不大,
但麻烦的是须要先将容器运行起来,并且这个过程当中你会丢失镜像原有的一些信息,好比:导出端口,环境变量,默认指令。
无论这个容器是否是在运行,均可以导出它,而后交给同事拿去部署,可是会丢失启动指令呀,端口,硬盘映射路径这些,里边只是包含了你的代码环境。
# 导入语法 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
能够为镜像指定新名称