读了上一章,应该掌握了docker的基本概念和使用方法,但心里一定有疑问。 这个篇会告诉你docker的镜像是怎么来的。
Docker镜像是容器的基础。 Image镜像是根文件系统更改的有序集合,是运行容器时使用的相应执行参数。 镜像通常包含彼此分层到顶层的文件系统的并集。 它没有状态,永远不会改变。
镜像相当于你的集装箱最基础的模板,镜像的好坏、优化的质量决定着你的集装箱运行的性能和稳定性,所以对你的集装箱服务来说很重要。 但是,大家也不必担心。 基本上常用的软件、服务、APP在Docker Hub上有官方镜像,但是为了满足你的个性化需求,最好记住自制镜像。
镜像的管理
1.拉后视镜[根@ centos~] #文档库资源中心:最后
latest :轮询频率库/中心
digest : sha 2563360 a 799 DD8A2 DED 4a 83484 BBAE 769 d 97655392 B3 F86533 CEB 7DD 96 BBAC 929809 F3C
status : downloadednewerimageforcentos 3360最后测试
与命令相同:坞站图像拉动
冒号前面是镜像名称,后面是版本号,无写入或latest都意味着抽取最新版本。
2 .看后视镜
[根@ centos-VM7~ ] #文件夹图像
repositorytagimageidcreatedsize
centos latest9f 38484 d 220 F4 months ago 202 MB
命令相同: docker image ls
3 .删除镜像
[根@ centos-vm7~] #文档库3360最后
命令相同: docker image rm
也可以在镜像名称或ID之后。
4 .反射镜的推动
[根@ centos~] #文档库用户_注册/中心3360最后
命令同步: docker图像推送
如果推送的仓库需要登录验证,则首先需要docker login
存储器登录名称
5 .清扫集装箱未使用的后视镜
[根@ centos~] #文档库图像计划
6 .导出镜像
docker save-oimage.tar centos :最后测试
与命令相同: docker image save
-o表示要导出到image.tar文件中
7 .导入镜像文件
坞站加载图像. tar
或者
dockerimportimage.tar image _ name :版本
命令相同: docker图像加载
8 .镜像的构建
docker build-t引擎:最后测试。
-t表示镜像名称(标签),后面的)点)表示当前目录,该目录必须是名为Dockerfile的目录
命令同步: docker图像构建
9 .查找镜像
docker search nginx
10 .通过提交容器生成镜像
docker commit-m='更新电视2 '-a=' your name ' e 218 EDB 10161 Ubuntu : v 2
-m:提交的说明信息-指定a :镜像创建者e218edb10161。 容器IDubuntu:v2:指定要创建的目标镜像名称11。 标记镜像(与添加别名相同)
dockertagubuntu : v2 centos : dev
centos:dev是新的标签名称
镜像的构建
Docker提供了通过配置docker文件来构建镜像的方法。 详情请参阅官方网站使用Dockerfile构建镜像就像积木一样,Docker读取Dockerfile的内容,将层次的概念堆积起来形成最终的镜像。 介绍Dockerfile的主要命令。
功能文件命令基础镜像信息FROM维护者信息MAINTAINER镜像操作命令RUN、复制、添加、导出、工作区、构建、用户、卷、枚举、实验室
从
指定新镜像的基础镜像。 示例:
从Ubuntu :14.04
维修器
表示镜像的创建者及其电子邮件。 示例:
maintainer自动机'自动机@邮件.com '
运行
在新镜像中运行的命令,包括软件安装、基本环境配置和shell支持
l中使用来换行,如:RUN echo 'hello docker!'
&& echo 'hello world!' > /tmp/test.txt
也可以使用exec格式RUN [“executable”, “param1”, “param2”]的命令,如:
RUN ["yum","install","-y","nginx"]
要注意的是,executable是命令,后面的param是参数
COPY
将主机的文件复制到镜像内,如果目的位置不存在,Docker会自动创建所有需要的目录结构,但是它只是单纯的复制,并不会去做文件提取和解压工作。如:
COPY application.yml /etc/springboot/test/src/resources
注意:需要复制的目录一定要放在Dockerfile文件的同级目录下,因为构建环境将会上传到Docker守护进程,而复制是在Docker守护进程中进行的。任何位于构建环境之外的东西都是不可用的。COPY指令的目的的位置则必须是容器内部的一个绝对路径。
ADD
将主机的文件复制到镜像中,跟COPY一样,限制条件和使用方式都一样,如:
ADD application.yml /etc/springboot/test/src/resources
但是ADD会对压缩文件(tar, gzip, bzip2, etc)在镜像中做提取和解压操作,如:
ADD conf.tgz /etc/springboot/test/src/resources
EXPOSE
暴露镜像的端口供主机做映射,启动镜像时,使用-P参数来讲镜像端口与宿主机的随机端口做映射。使用方式(可指定多个):
EXPOSE 8080
EXPOSE 8081
WORKDIR
在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录。如
WORKDIR /tmp
WORKDIR web
RUN echo 'hello docker' > 1.txt
最终会在/tmp/web/目录下生成1.txt文件
ONBUILD
当一个包含ONBUILD命令的镜像被用作其他镜像的基础镜像时(比如用户的镜像需要从准备好的位置添加源代码,或者用户需要执行特定于构建镜像的环境的构建脚本),该命令就会执行。
如创建镜像image1
FROM ubuntu
...
ONBUILD ADD . /var/www
...
然后创建镜像image2,指定image1为基础镜像,如
FROM image1
...
然后在构建image2的时候,日志上显示如下:
Step 0 : FROM image1
# Execting 1 build triggers
Step onbuild-0 : ADD . /var/www
...
USER
指定该镜像以什么样的用户去执行,如:
USER www-data
VOLUME
用来向基于镜像创建的容器添加卷。比如你可以将mongodb镜像中存储数据的data文件指定为主机的某个文件。(容器内部建议不要存储任何数据)
如:
VOLUME /data/db /data/configdb
说明:VOLUME 主机目录 容器目录
CMD
容器启动时需要执行的命令,如:
CMD /感动的流沙/bash
同样可以使用exec语法,如
CMD ["/感动的流沙/bash"]
当有多个CMD的时候,只有最后一个生效。
ENTRYPOINT
作用和用法和CMD一样,但CMD和ENTRYPOINT有区别,一定要注意:
CMD的命令会被docker run的命令覆盖而ENTRYPOINT不会如使用CMD ["/感动的流沙/bash"]或ENTRYPOINT ["/感动的流沙/bash"]后,再使用docker run -ti image启动容器,它会自动进入容器内部的交互终端,如同使用
docker run -ti image /感动的流沙/bash。
但是如果启动镜像的命令为docker run -ti image /感动的流沙/ps,使用CMD后面的命令就会被覆盖转而执行感动的流沙/ps命令,而ENTRYPOINT的则不会,而是会把docker run 后面的命令当做ENTRYPOINT执行命令的参数。
以下例子比较容易理解
ENTRYPOINT ["/user/s感动的流沙/nginx"]
然后通过启动构建镜像的容器
docker run -ti image -g "daemon off"
此时-g "daemon off"会被当成参数传递给ENTRYPOINT,最终的命令变成了
/user/s感动的流沙/nginx -g "daemon off"
CMD和ENTRYPOINT都存在时CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被docker run后面的命令覆盖,如:
ENTRYPOINT ["echo","hello","i am"]
CMD ["docker"]