Docker学习笔记(4)--镜像篇

基本概念

Docker镜像可以用来创建Docker容器,为一个只读的模板。

Docker运行容器前需要本地存在对应的镜像,如果镜像不在本地,Docker会从镜像仓库下载。

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统被称为UnionFS。在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。Docker在bootfs之上的一层是rootfs(根文件系统)。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不可写,所以镜像是无状态的。

docker镜像的层级结构图:

获取镜像

从Docker Hub仓库获取

目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了超过 15,000 的镜像。大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现。可以使用 docker pull 命令来从仓库获取所需要的镜像。

例如从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像:

1
sudo docker pull ubuntu:12.04S

有时候官方仓库注册服务器下载较慢,可以从其他仓库下载,如下所述。

从Docker Hub Mirror获取

《Docker学习笔记(2)–使用Docker Hub Mirror加速Docker官方镜像下载》介绍了如何通过DaoCloud提供Docker Hub Mirror服务进行镜像的加速下载。

例如使用ocker Hub Mirror服务下载一个 CentOS 操作系统的镜像:

1
dao pull centos

镜像的拉取过程如下图所示:

本地镜像

使用docker images显示本地已有镜像。

1
2
3
4
5
6
7
8
9
10
11
12
ymhou@ubuntu:~$ sudo docker images
[sudo] ymhou 的密码:
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnet-equip2 latest 7db79b00dfc6 13 hours ago 1.352 GB
aspnet-equip latest c43889d0c994 13 hours ago 828.2 MB
aspnet-hello-web latest 0caea7860935 13 hours ago 1.228 GB
ubuntu 14.04 c8ceaee85d23 5 days ago 188 MB
hello-world latest c54a2cc56cbb 3 weeks ago 1.848 kB
microsoft/aspnet latest 137814287352 5 weeks ago 815.2 MB
daocloud.io/daocloud/daocloud-toolset latest 1ab33797d8a1 3 months ago 150.2 MB
training/webapp latest 694deee4f65f 14 months ago 348.8 MB
training/postgres latest ed8be1ec6753 2 years ago 364.6 MB

其中包含了如下信息:仓库,标记,ID,创建时间,大小。

其中镜像的 ID 唯一标识了镜像;
TAG 信息用来标记来自同一个仓库的不同镜像。例如 ubuntu 仓库中有多个镜像,通过 TAG 信息来区分发行版本,例如 10.04、12.04、12.10、13.04、14.04 等。

搜索镜像

Docker的特点之一是人们创建了各种各样的docker镜像。而且这些镜像已经被上传到了Docker Hub。我们可以从Docker Hub网站来搜索镜像;同样的,之前我们提到的DaoCloud也提供了镜像搜索服务。
Docker Hub
DaoCloud

我们也可以使用docker search命令来搜索镜像:

1
sudo docker search [server/]registry[:tag]

当未指定server时,默认从官方仓库注册服务器搜索,当未指定tag时,默认为latest版本镜像。比如搜索mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ymhou@ubuntu:~$ sudo docker search mysql
[sudo] ymhou 的密码:
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relati... 2748 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Crea... 177 [OK]
centurylink/mysql Image containing mysql. Optimized to be li... 46 [OK]
sameersbn/mysql 36 [OK]
appcontainers/mysql Centos/Debian Based Customizable MySQL Con... 8 [OK]
marvambass/mysql MySQL Server based on Ubuntu 14.04 6 [OK]
alterway/mysql Docker Mysql 2 [OK]
drupaldocker/mysql MySQL for Drupal 2 [OK]
azukiapp/mysql Docker image to run MySQL by Azuki - http:... 2 [OK]
yfix/mysql Yfix docker built mysql 2 [OK]
...

我们看到了返回了大量的mysql镜像。我们看到列表中有镜像名称、描述、Stars(衡量镜像的流行程度-如果用户喜欢这个镜像他就会点击stars)和官方自动构建镜像状态。

创建镜像

如果在官方服务器上没有自己需要的镜像,我们可以自己创建一个新的镜像。创建镜像有三种方法。

修改已有镜像

首先利用已有镜像创建容器,然后在容器里面完成我们需要的操作,最后将新的容器使用dockercommit提交到本地镜像库。

1
sudo docker commit -m "commit information" -a "user information" Container_ID Image:Tag

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

例如:

1
2
sudo docker commit -m "add new file" -a "ymhou" 0b2616b0e5a8 mysql-db:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

利用Dockerfile创建镜像

首先生成一个创建镜像的Dockerfile文件,包含一些如何创建镜像的指令,然后运行docker build命令创建镜像。
比如下面的Dockerfile文件:

1
2
3
4
5
6
7
8
9
10
ymhou@ubuntu:~/equip$ vim Dockerfile 

From microsoft/aspnet

COPY . /app
WORKDIR /app
RUN ["dnu","restore"]

EXPOSE 5004
ENTRYPOINT ["dnx","-p","project.json","web"]

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

1
sudo docker build -t="aspnet-mvc:v2" .

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

从本地文件系统导入

如果为从容器生成的镜像则使用docker import导入,如果为从镜像导出的镜像,则使用docker load导入。

导出和载入镜像

导出镜像

如果要导出镜像到本地文件,可以使用 docker save 命令。

1
sudo docker save -o ubuntu14.04.tar ubuntu:14.04

载入镜像

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

1
sudo docker load --input ubuntu14.04.tar


1
sudo docker load < ubuntu14.04.tar

删除本地镜像

使用docker rmi命令删除本地镜像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ymhou@ubuntu:~/equip$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnet-equip2 latest 7db79b00dfc6 17 hours ago 1.352 GB
aspnet-equip latest c43889d0c994 18 hours ago 828.2 MB
aspnet-hello-web latest 0caea7860935 18 hours ago 1.228 GB
ubuntu 14.04 c8ceaee85d23 5 days ago 188 MB
hello-world latest c54a2cc56cbb 3 weeks ago 1.848 kB
microsoft/aspnet latest 137814287352 5 weeks ago 815.2 MB
daocloud.io/daocloud/daocloud-toolset latest 1ab33797d8a1 3 months ago 150.2 MB
training/webapp latest 694deee4f65f 14 months ago 348.8 MB
training/postgres latest ed8be1ec6753 2 years ago 364.6 MB
ymhou@ubuntu:~/equip$ sudo docker rmi aspnet-equip
Untagged: aspnet-equip:latest
Deleted: sha256:c43889d0c994d425a6cc4ec5333186c4aa771a7b82325a698254b95edc4ea1fa
Deleted: sha256:aee0abb3d94c523b30df01cbb4465b49d63cf2159696d6383bb2d079d6aa10e7
Deleted: sha256:411d2ea3ecbc324a13d1c72b6103e20a996d99954b15eb91b3130623323794d2
Deleted: sha256:d06161776c4b435c672fed1ee6ac54013781d253ba58581cb2cf4263aa4ca311
Deleted: sha256:5b601853e6b6ca283954848d460cecb1b385269dea98c19e59193e256e4124c9
Deleted: sha256:9409ca5cff2757904d32b3a887e171bc8ad2a0d537996d4f4da50adc491e20d4
Deleted: sha256:aa488445dd361a59d30361bd5849fc4b61763dd577436066945f67b74d5823cf

Reference

http://tech.365rili.com/?p=41
https://yeasy.gitbooks.io/docker_practice/content/index.html

坚持原创技术分享,您的支持将鼓励我继续创作!