Docker入门(3)

来源:互联网 发布:网络综艺节目2017 编辑:程序博客网 时间:2024/06/05 17:01
图片未上传TODO
Docker镜像:
由文件系统叠加而成。
在docker里,root文件系统永远只能是只读状态。并且利用联合加载技术又会在root文件系统层上加载更多的只读文件系统。
docker将这一的文件系统称为镜像。一个镜像可以放到另一个镜像的顶部。位于下面的镜像称为父镜像,可以以此类推,直到镜像栈的最底部,最底部的镜像称为基础镜像。
写时复制:

列出镜像:
使用docker images命令

镜像从仓库下载下来。镜像保存在仓库中,而仓库存于Registry中。默认的Registry是由docker公司运营的公共的Registry服务,即Docker Hub

使用docker pull命令来拉取仓库中的镜像

Docker Hub中有两个类型的仓库:用户仓库和顶层仓库
用户仓库的镜像都是由用户创建的,而顶层仓库则由docker内部的人来管理。

用户仓库的命名有用户名和仓库名两部分组成:用户名/仓库名
顶层仓库只包含仓库名部分。

拉取镜像:
docker run 命令从镜像启动一个容器时,如果镜像不在本地,docker会先从docker hub下载镜像。如果没有指定具体的镜像标签,那么会自动下载lastest标签的镜像。
也可以直接使用docker pull先将镜像拉取到本地
使用docker pull 可以节省一个新镜像启动一个容器所需的时间。

docker images 后面可以加上镜像名进行查看

查找镜像:
通过docker search来查找所有docker hub上的公共的可用镜像

构建镜像:
两种方法:
使用docker commit命令
使用docker build和Dockerfile文件

一般来说我们并不是真正的创建新镜像,而是基于一个已有的的基础镜像构建新镜像而已。

创建Docker Hub账户:
使用docker login命令登录

docker logout退出

用Docker的commit命令创建镜像:


用Dockerfile构建镜像:
不推荐使用Docker commit的方法来构建镜像。
linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件。

Dockerfile由一系列指令组成:、
每条指令都必须为大写字母且后面要跟随一个参数。
Dockerfile的指令会从上到下按顺序执行
每条指令都会创建一个新的镜像层并对镜像进行提交。

Docker大体上按照如下流程执行Dockerfile:
Docker从基础镜像运行一个容器
执行一条指令,对容器做出修改
执行类似docker commit的操作,提交一个新的镜像层
Docker再基于刚提交的镜像运行一个新容器
执行Dockerfile中的下一条指令,直到所有的指令都执行完毕。

每个Dockerfile的第一条指令必须是FROM,FROM指令是指定一个已经存在的镜像。后续指令都将基于该镜像进行,这个镜像是基础镜像。
接着指定了MAINTAINER指令,这条指令告诉Docker该镜像的作者是谁,以及作者的电子邮件地址。
接着是RUN指令。RUN指令会在当前镜像中运行指定的命令。
每条RUN指令都会创建一个新的镜像层,如果该指令执行成功,就会将此镜像层提交,之后继续下一条指令。

基于Dockerfile构建新镜像:
执行Docker build命令时,Dockerfile中的所有指令都会被执行并且提交,并且在该命令成功结束后返回一个新的镜像。


Dockerfile和构建缓存:
由于每一步的构建过程都会将结果提交为镜像,所以Docker的构建镜像过程就显得非常聪明。它会将之前的镜像层看作缓存。
有时候想确保构建的过程不会使用缓存,可以使用docker build的 --no-cache标志:

基于构建缓存的Dockerfile模板:
ENV指令用来设置环境变量,用来标识该镜像最后的更新时间。

一个Dockerfile模板如果使用了上面的ENV的指令,如果想刷新一个构建,只需修改ENV指令中的日期。这使Docker在命中ENV这个指令时开始重置这个缓存,并运行后续指令而无需依赖该缓存。

查看镜像:
docker images 镜像名/ID
深入探求镜像是如何构建出来的,可以使用docker history命令:

从新镜像启动容器:
我们可以基于新构建的镜像启动一个新容器,来检查一下我们的构建工作是否一切正常。
docker run 。。。--name xxx 镜像名
-p命令,该标志用来控制Docker在运行时应该公开那些网络端口给外部(宿主机),两种方法:
Docker可以在宿主机上随机选择一个位于32768~61000的一个比较大的端口号来映射到容器中的80端口上。
可以在Docker宿主机中指定一个具体的端口号来映射容器中的80端口上。
docker run命令将在Docker宿主机上随机打开一个端口,这个端口会连接到容器中的80端口上。

docker port命令查看容器端口映射情况
也可以使用容器名





Dockerfile指令:
1、RUN 运行后面的指令
2、EXPOSE 公开所有端口
3、CMD 指定一个容器启动时要运行的命令(RUN是指定镜像被构建时要运行的命令,CMD是指定容器被启动时要运行的命令,和docker run后面使用命令非常相似)
但是docker run命令可以覆盖CMD命令
在Dockerfile中只能指定一条CMD指令,如果有多条,则将会执行最后一条。
4、ENTRYPOINT 与CMD指令非常类似。(CMD会被docker run覆盖,而ENTRYPOINT则不容易在启动时被覆盖)
5、WORKDIR 指令用来在镜像创建一个新容器的时候,在容器内部设置一个工作目录,ENTRYPOINT和/或CMD指定的程序会在这个目录下执行。
6、ENV 指令用来在构建镜像的过程中设置环境变量
7、USER 指令用来指定该镜像会以什么样的用户去运行、
8、VOLUME 指令用来基于镜像创建的容器添加卷。
9、ADD 指令用来将构建环境下的文件和目录复制到镜像中。
10、COPY 和ADD类似(COPY只关心在构建上下文中复制本地文件,而不会做文件提取和解压的工作)
11、LABEL 指令用于为Docker镜像添加元数据。元数据以键值对的形式展现。
12、STOPSIGNAL指令用来设置停止容器时发送什么系统调用信号给容器
13、ARG
14、ONBUILD

删除镜像:
docker rmi 镜像名
该操作只会删除本地的镜像,如果已经推送到Docker Hub上,那么它会依然存在Docker Hub上。



















0 0
原创粉丝点击