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

传送门:
Docker学习笔记(1)--Docker安装(Ubuntu 16.04)
Docker学习笔记(2)--使用Docker Hub Mirror加速Docker官方镜像下载
Docker学习笔记(3)--什么是Docker镜像、容器和仓库?
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学习笔记(4)--镜像篇_第1张图片

获取镜像

从Docker Hub仓库获取

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

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

sudo docker pull ubuntu:12.04S

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

从Docker Hub Mirror获取

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

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

dao pull centos

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


Docker学习笔记(4)--镜像篇_第2张图片

本地镜像

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

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学习笔记(4)--镜像篇_第3张图片
Docker Hub

Docker学习笔记(4)--镜像篇_第4张图片
DaoCloud

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

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

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

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提交到本地镜像库。

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

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

例如:

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

利用Dockerfile创建镜像

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

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 来生成镜像。

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

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

从本地文件系统导入

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

导出和载入镜像

导出镜像

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

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

载入镜像

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

sudo docker load --input ubuntu14.04.tar

sudo docker load < ubuntu14.04.tar

删除本地镜像

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

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

https://yeasy.gitbooks.io/docker_practice/content/index.html

你可能感兴趣的:(Docker学习笔记(4)--镜像篇)