【Docker】镜像基本操作

镜像 (image)

镜像就是一个只读的模版,用来创建docker容器。
镜像提供了简单的机制来创建或者更新一个容器。
我们可以直接从别人那里拿一个现成的容器来使用。

Docker镜像时由文件系统叠加而成,最底端是一个引导文件系统,即bootfs,这很像典型的Linux/Unix的引导文件系统。Docker用户几乎永远不会和引导文件系统有交互。实际上,当一个容器启动后,他将会被移到内存中,而引导文件系统则会被卸载(unmount),以流出更多的内存供initrd磁盘镜像使用。

目前,Docker看起来还很像一个典型的Linux虚拟化栈。实际上,Docker镜像的第二层是root文件系统rootfs,它位于引导文件系统之上,rootfs可以是一种或多种操作系统(如Debian、Ubuntu)。

在传统的linux引导过程中,root文件系统会最先以只读的方式家长,当引导结束并完成完整性检查之后,他才会被切换成读写模式。但是Docker里,root文件系统永远只是只读状态,并且Docker利用联合加载(union mount)技术又会在root文件系统层上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,但是在外面看起来只能看到一个文件系统。联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录。

Docker将这样的文件系统成为镜像。一个镜像可以放到另一个的顶部,位于下面的镜像称为父镜像(parent image),最底部的称为基础镜像(base image)。

简单来说,Docker 镜像就是一个只读的模板。例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。

镜像是Docker生命周期中的“构建”部分,可以用来创建 Docker 容器。

Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,可以当做容器的“源代码”,它体积很小,便于分享、存储、更新。用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

镜像是基于联合(union)文件系统的一种层式的结构,由一系列指令一步步构建处理。例如:

添加一个文件
执行一个命令
打开一个端口
当从以镜像期待容器时,Docker会在该镜像的最顶层加载一个读写文件系统。想在Docker中运行的程序就是在这个读写层中执行的。

获取镜像

docker pull toturial/learn

列出镜像名字

$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 12.04 74fe38d11401 4 weeks ago 209.6 MB
ubuntu precise 74fe38d11401 4 weeks ago 209.6 MB
ubuntu 14.04 99ec81b80c55 4 weeks ago 266 MB
ubuntu latest 99ec81b80c55 4 weeks ago 266 MB
ubuntu trusty 99ec81b80c55 4 weeks ago 266 MB

列出镜像名字后 字段信息:
来自于哪个仓库,比如 ubuntu
镜像的标记,比如 14.04
它的 ID 号(唯一)
创建时间
镜像大小

修改一个现成的镜像

sudo docker run -t -i ouruse/sinatra /bin/bash
root@0b2616b0e5a8:/#

容器id记住,有用。

在容器中添加 json package(一个 ruby gem)。

root@0b2616b0e5a8:/# gem install json

当结束后,我们使用 exit 来退出,现在我们的容器已经被我们改变了,使用 docker commit 命令来提交更新后的副本。

$ sudo docker commit -m “Added json gem” -a “Docker Newbee” 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。

使用 docker images 来查看新创建的镜像。

$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
training/sinatra latest 5bc342fa0b91 10 hours ago 446.7 MB
ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB
ouruser/sinatra latest 5db5f8471261 10 hours ago 446.7 MB

之后可以启动新的镜像:

$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f680994:/#

用dockerfile来创建镜像

首先要创建一个 目录文件 和一个Dokerfile

$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile

Dockerfile 的每一条指令都创建镜像的一层。
一个镜像 最多不能超过127层。
示例:

# This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee xxxx.com
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra

基本语法:
Dockerfile 基本的语法:
使用#来注释
FROM 指令告诉 Docker 使用哪个镜像作为基础
接着是维护者的信息
RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get 来安装了一些软件

编写完成 Dockerfile 后可以使用 docker build 来生成镜像。

$ sudo docker build -t=”ouruser/sinatra:v2” .

语法介绍:
其中 -t 标记来添加 tag,指定新的镜像的用户信息。 “.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。

可以看到 build 进程在执行操作。它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据 Dockerfile 来进行。 然后,Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的 docker commit 一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被删除和清理了。
此外,还可以利用 ADD 命令复制本地文件到镜像;用 EXPOSE 命令来向外部开放端口;用 CMD 命令来描述容器启动后运行的程序等。例如

# put my local web site in myApp folder to /var/www
ADD myApp /var/www
# expose httpd port
EXPOSE 80
# the command to run
CMD [“/usr/sbin/apachectl”, “-D”, “FOREGROUND”]

用docker tag 来修改一个标签

$ sudo docker tag 5db5f8471261 ouruser/sinatra:devel

从本地文件系统导入

本地》》》镜像
要从本地文件系统导入到一个镜像,可以使用 openvz(容器虚拟化的先锋技术)的模板来创建: openvz 的模板下载地址为 templates

比如,先下载了一个 ubuntu-14.04 的镜像,之后使用以下命令导入:

sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04

然后查看新导入的镜像。

docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 05ac7c0b9383 17 seconds ago 215.5 MB

保存镜像

保存镜像可以用 docker save

$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 c4ff7513909d 5 weeks ago 225.4 MB

$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04

加载镜像

可以使用 docker load 从导出的本地文件中再加载到本地镜像库,例如

$ sudo docker load –input ubuntu_14.04.tar

$ sudo docker load < ubuntu_14.04.tar

这将加载镜像以及其相关的元数据信息(包括标签等)

移除本地镜像

docker rmi

docker rm 是移除容器

*注意:在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器。

清理所有未打过标签的本地镜像

docker images 可以列出本地所有的镜像,其中很可能会包含有很多中间状态的未打过标签的镜像,大量占据着磁盘空间。

使用下面的命令可以清理所有未打过标签的本地镜像

$ sudo docker rmi $(docker images -q -f “dangling=true”)

其中 -q 和 -f 是缩写, 完整的命令:

$ sudo docker rmi $(docker images –quiet –filter “dangling=true”)

参考资料:
https://segmentfault.com/a/1190000002549812
https://yeasy.gitbooks.io/docker_practice/content/image/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值