传送门:
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 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 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 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