Docker学习笔记-3

镜像作为Docker的核心组件之一,是容器的运行基础,容器是镜像运行后的形态,两者紧密相连又有所不同。

1.概念

镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上。

镜像是容器运行的基石,使用docker run命令创建一个容器并在其中运行进程时,必须指定一个镜像名称或者镜像ID。

可以将容器理解为一套程序运行的虚拟环境,那么镜像就是用来构建这个环境的模板。通过同一个镜像,我们可以构造出很多相互独立但运行环境一样的容器。

2.本地镜像管理

2.1查看

通过images命令可以列出本机上的所有镜像:

 

REPOSITORY:仓库名称,一般用来存放同一类型的镜像,其名称由它的创建者指定,如果创建时没有指定则为<none>。仓库的名称有下面几种形式。
--[namespace\ubuntu]:由命名空间和实际的仓库名称组成,中间通过\隔开。如果你在Docker Hub上注册一个账户时,账户名自动成为你的命名空间,主要是用来区分Docker Hub上注册的不同用户或者组织。如果你想创建一个分发到Docker Hub上的镜像,必须指定命名空间。
--[ubuntu]:只有仓库名,对于这种没有命名空间的仓库名,可以认为它属于顶级命名空间。该空间只用于官方的镜像,由Docker官方进行管理,用户在本地创建的镜像也可以这样命名,但是无法分发到Docker Hub上进行共享。
--[dl.dockerpool.com:5000\ubuntu:12.04]:指定URL路径的方式,如果该镜像不是放置在Docker Hub上,而是放置在个人搭建的Hub或者第三方Hub上,则使用这种方式命名。dl.dockerpool.com:8080是第三方Hub的主机名及端口,ubuntu是镜像名称。

 TAG:用于区分同一仓库中的不同镜像,如果未指定默认为latest。

IMAGE ID:每一个镜像都有一个字符串类型、长为64位的HashID,用来全网表示一个镜像,该字段只展示前面一部分,因为这一部分足以在本机唯一标识一个镜像了。

CREATED:镜像的创建时间。

VIRTUAL SIZE:镜像所占用的虚拟大小,该大小包含了所有共享文件的大小。

我们还可以在images命令后面添加通配符,找出符合条件的一系列镜像:

通过inspect可以查看镜像更详细的信息:

 

2.2下载

使用docker run 命令运行一个镜像时,Docker首先会在本机寻找镜像,如果本机不存在,会继续去Docker Hub上面搜索符合条件的镜像并将其下载下来运行。

通过search命令可以在Docker Hub上搜索符合要求的镜像:

NAME:镜像的名称,由命名空间和仓库名构成,如果没有命名空间,说明该镜像属于Docker Hub官方镜像。
DESCRIPTION:镜像的简要描述,创建者可以登录Docker Hub修改该项。
STARS:用户对镜像的评分,评分越高质量越高。
OFFICIAL:是否为官方镜像。
AUTOMATED:是否使用了自动构建。 

通过pull命令可以预先将镜像拉回本地,镜像名必须完整地包含命名空间和仓库名,如果一个仓库中存在多个镜像,还必须指定TAG,否则使用默认的TAG--latest。

2.3.删除

可以使用rmi命令删除不需要的镜像。

rmi命令后面,可以指定一个或多个镜像名称或者镜像id,多个镜像之间用空格隔开。

-f            强制删除
-no-prune    不移除该镜像的过程镜像,默认移除

prune命令用来删除不再使用的docker对象。

1.删除所有未被tag标记和未被容器使用的镜像:

 

2.删除所有未被容器使用的镜像:

3.创建本地镜像

3.1使用commit命令创建本地镜像

先创建一个ubuntu镜像并在此基础上进行一定的修改:

root@baida:~# docker run -t -i ubuntu
root@203d6323b3f0:/# apt update
root@203d6323b3f0:/# apt install sqlite
root@203d6323b3f0:/# exit

这里的容器id是:203d6323b3f0,在基础的Ubuntu上安装了1sqlite。

然后使用commit命令将容器里的所有修改提交到本地库中,形成一个全新的镜像:

docker commit -m "Add sqlite" -a "A new docker" --author 203d6323b3f0 yui/sqlite:v1

-m   指定提交的说明信息
-a   指定更新的用户信息
--author   指定作者信息
yui/sqlite    分别是仓库名和镜像名
v1   TAG名

接下来,可以使用刚刚创建的容器来构建一个容器并运行:

 可以发现sqlite已经成功安装了。

3.2使用Dockerfile创建镜像

‌‌‍commit命令扩展镜像比较简单,⁢⁣⁢⁡⁢⁣‬将需要对镜像进行的操作全部写到一个文件中,然后使用docker build命令从这个文件中创建镜像,这种方法可以使镜像的创建变得透明和独立化,并且创建过程可以被重复执行。Dockerfile文件以行为单位,行首为Dockerfile命令,命令都是大写形式,紧跟着的是命令的参数。⁤‍‬‬

‌这是一个创建apache镜像的Dockerfile文件范例:

#基于ubuntu的基础镜像
FROM ubuntu:latest

#维护镜像的用户信息
MAINTAINER yui

#原镜像操作指令-安装apache
RUN apt-get install -y update
RUN apt0get install -y install apache2
 
#开启端口
EXPOSE 80
  
#使用&&拼接命令
RUN touch test.txt && echo "This is a web site!" >> test.txt

#添加文件
ADD test.txt /opt/apache/

#添加文件夹
ADD /web /opt/apache

#设置工作目录 
WORKDIR /opt/apache

#设置启动命令
ENTRYPOINT ["StartWeb"]

#设置启动参数
CMD ["-a","-y"]

#设置卷
VOLUME ["/data","/var/www"]

*FROM:构建镜像基于哪个镜像。

*MAINTAINER:镜像维护者姓名或邮箱地址。

*RUN:用来修改镜像的命令,常用来安装库、程序以及配置程序。
一条RUN指令执行完毕之后,会在当前镜像上创建一个新的镜像层,接下来的指令会在新的镜像上继续执行。

RUN语句又有两种形式:
RUN apt-get update
RUN ["apt-get","update"]
第一种是在/bin/sh环境中执行指定的命令。
第二种是直接使用系统调用exec来执行。
还可以使用&&符号将多条命令连接在同一条RUN语句种执行。

*EXPOSE:声明容器的服务端口。

*COPY:从上下文目录种复制文件或者目录到容器的指定位置。

*ADD:向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一个网络文件,也可以是一个文件夹。
ADD命令的第一个参数用来指定源文件(夹),它可以是文件路径、文件夹的路径或网络文件的URL地址。
需要特别注意的是,如果是文件路径或文件夹路径,它必须是相对Dockerfile所在目录的相对路径。
如果是一个文件URL,在创建镜像时,会先下载下来然后再添加到镜像里去。
第二个参数是文件需要放置在目标镜像的位置。
如果源文件是主机上zip或者tar形式的压缩文件,Docker会先解压缩,然后将文件添加到镜像的指定位置。
如果源文件是一个通过URL指定的网络压缩文件,则不会解压。

*VOLUME:该命令会在镜像里创建一个指定路径(文件或文件夹)的挂载点,这个路径可以来自主机或者其他容器。
多个容器可以通过同一个挂载点共享数据,即便其中一个容器已经停止,挂载点也仍然可以访问,只有当挂载点的容器引用全部消失时,挂载点才会自动删除。

*WORKDIR:为接下来执行的指令指定一个新的工作目录,这个目录可以是绝对目录,也可是相对目录。根据需要,WORKDIR可以被多次指定。
当启动一个容器时,最后一条WORKDIR指令所指的目录将作为容器运行的当前工作目录。

*设置容器运行的环境变量。
在运行容器的时候,通过-e参数可以修改这个环境变量NV·值,也可以添加新的环境变量:
docker run -e WEBAPP_PORT=8000 -e WEBAPP_HOST=www.example.com

*CMD:用来设置启动容器时默认运行的命令。

*ENTRYPOINT:与CMD类似,它也是用来指定容器启动时默认运行的命令。
假如,我们指定的ENTRYPOINT是这样的:ENTRYPOINT[“ls","-]"]并构建出名为xixihe/newImage的镜像,那么docker run xixihe/newImage的运行结果与docker run ubuntu ls -l一样,而docker run xixihe/newImage -a的运行结果与docker run ubuntu ls -l-a一样。
ENTRYPINT和CMD的区别在于运行容器时添加在镜像名之后的参数,对ENTRYPOINT是拼接,而对于CMD命令则是覆盖。
我们在运行容器的时候可以通过--entrypoint来覆Dockerfile中的指定:
docker run --entrypoint echo xixihe/newImage "hello docker"
通常情况下,我们会将CMD和ENTRYPOINT搭配起来使用。
ENTRYPOINT用于指定需要运行的命令,CMD用于指定运行命令所需要的参数,
示例如下:
ENTRYPOINT["ls"]
CMD["-a","-l"]

*ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

*ARG:构建参数,与ENV作用一致,不过作用域不一样。
ARG设置的环境变量进队Dockerfile内有效,也就是build的过程中有效,构建好的镜像内不存在此环境变量。 

 接下来,使用build命令构建镜像:

docker build -t apache2:ubuntu .

在Dockerfile文件的存放目录下,执行构建动作。

最后的.表示本次执行的上下文路径。
由于 docker 的运行模式是 C/S,我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值