Docker 镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引 导系统,即 bootfs,这很像典型的 Linux/Unix 的引导文件系统。Docker 用户几乎永远不会和 引导系统有什么交互。实际上,当一个容器启动后,它将会被移动到内存中,而引导文件系 统则会被卸载,以留出更多的内存供磁盘镜像使用。Docker 容器启动是需要一些文件的, 而这些文件就可以称为 Docker 镜像。
如何得到镜像:
我们下载的时候一层一层的就是这个 UnionFS ( 联合文件系统) UnionFS (联合文件系统) : Union文件系统( UnionFS)是-种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来-层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union 文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像) , 可以制作各种具体的应用镜像。
特性: 一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
docker的镜像实际_上由一层一层的文件系统组成,这种层级的文件系统UnionFS.
平时我们安装进虚拟机的CentOS都是好几个G ,为什么Docker这里才200M ? 对于一个精简的OS , rootfs 可以很小,只需要包含最基本的命令, 只具有程序库就可以了,因为底层直接用Host的kernel ,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别,因此不同的发行版可以公用bootfs。
1、基于Dockerfile(最常用)创建
2、基于已有的镜像容器进行创建镜像
3、基于本地模板进行构建
Dockerfile是由一组指令组成的文件
Dockerfile结构分成四个部分:
使用Dockerfile创建一个httpd镜像并运行 1、编写Dockerfile文件
[root@docker ~]# mkdir apache
[root@docker ~]# cd apache/
[root@docker apache]# vim Dockerfile
##基于的基础镜像
FROM centos
##维护镜像的用户信息
MAINTAINER The porject <CN-TangZheng>
##镜像操作指令安装Apache软件
RUN yum -y update
##安装Apache服务
RUN yum -y install httpd
##开启80端口
EXPOSE 80
##复制网址首页文件
ADD index.html /var/www/html/index.html '//此命令可以结合上图理解'
##将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
##启动容器时执行脚本
CMD ["/run.sh"]
2、编写执行脚本与首页内容
[root@docker apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/* '//清除缓存'
exec /usr/sbin/apachectl -D FOREGROUND '//启动apache'
[root@docker apache]# echo "this is test web" > index.html
3、生成镜像
[root@docker apache]# ls
Dockerfile index.html run.sh
[root@docker apache]# docker build -t httpd:centos . '//最后的一个"."要注意,-t:镜像的名字:标签'
'//每一个缓存层都会生成一个临时容器来执行命令,然后删除'
[root@docker apache]# docker images '//查看镜像,已经生成了两个'
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos d2010670b33a 19 seconds ago 434MB
centos latest 470671670cac 3 months ago 237MB
4、新镜像运行容器
[root@docker apache]# docker run -d -p 1111:80 httpd:centos '//-p 指定端口号,-P 随机端口号'
04b0f0f1bda36a4857f8d48e044cd17f442be19f4d32dee4cf3183827b451b55
[root@docker apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04b0f0f1bda3 httpd:centos "/run.sh" 4 seconds ago
创建容器
[root@docker apache]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos d2010670b33a 23 minutes ago 434MB
centos latest 470671670cac 3 months ago 237MB '//使用此镜像创建容器'
[root@docker apache]# docker create -it centos /bin/bash
[root@docker apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
325c28cc9349 centos "/bin/bash" 42 seconds ago Created infallible_poitras
04b0f0f1bda3 httpd:centos "/run.sh" 21 minutes ago Up 21 minutes 0.0.0.0:1111->80/tcp nostalgic_greider
创建镜像
[root@docker apache]# docker commit -m "ceshi" -a "tang" 325c28cc9349 tang:centos '//-m:说明文字,-a:提交的作者'
sha256:a49089651887dee9c9168532466542ca7ea0c9113da078230694ac30aebe064c
[root@docker apache]# docker images '//镜像创建成功'
REPOSITORY TAG IMAGE ID CREATED SIZE
tang centos a49089651887 14 seconds ago 237MB
httpd centos d2010670b33a 30 minutes ago 434MB
centos latest 470671670cac 3 months ago 237MB
下载本地模板 通过导入系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载 地址为:https://wiki.openvz.org/Download/template/precreated 或者使用wget下载:wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz 模板下载后直接导入即可
[root@docker opt]# ls
debian-7.0-x86-minimal.tar.gz
[root@docker opt]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new
[root@docker opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
daoke new 487145d2411f 8 seconds ago 215MB
Docker Registry工具目前最新为2.0系列版本,这一版本与一些类库、工具一起被打包为负责容器内容分发的工具集:Docker Distribution。目前其核心的功能组件仍为负责镜像仓库的管理。新版本的Registry基于Golang进行了重构,提供更好的性能和扩展性,并且支持Docker 1.6+的API,非常适合用来构建私有的镜像注册服务器。官方仓库中也提供了Registry的镜像,因此用户可以通过容器运行和源码安装两种方式来使用Registry。
1、下载registry镜像 2、客户端设置daemon.json文件,指定私有仓库位置 3、生成registry容器,开放5000端口 4、镜像打标签 5、上传镜像,docker push 6、下载镜像,docker pull
[root@docker apache]# docker pull registry
[root@docker apache]# vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.233.133:5000"], '//添加此段'
"registry-mirrors": ["https://yu1vx79j.mirror.aliyuncs.com"]
}
[root@docker apache]# systemctl restart docker
registry必须要是up状态才能提供服务
[root@docker apache]# docker create -it registry /bin/bash
87db162017924493a4dadefd1f58ff2fdf5a62921a9f4233c84143340e36e1e5
[root@docker apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87db16201792 registry "/entrypoint.sh /bin…" 12 seconds ago Created agitated_darwin
[root@docker apache]# docker start 87db16201792
[root@docker apache]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry '共享目录 宿主机的data共享到docker的tmp下'
60e04d648d5116ceb369eee810e8ed85f2043aa2f573b0ebf1e1233e8e13e2f6
[root@docker apache]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tang centos a49089651887 38 minutes ago 237MB
httpd centos d2010670b33a About an hour ago 434MB
registry latest 708bc6af7e5e 2 months ago 25.8MB
centos latest 470671670cac 3 months ago 237MB
[root@docker apache]# docker tag tang:centos 192.168.233.133:5000/httpd '要打上镜像仓库ip地址端口的tag'
[root@docker apache]# docker push 192.168.233.133:5000/httpd
The push refers to repository [192.168.233.133:5000/httpd]
0683de282177: Pushed
latest: digest: sha256:7a6f34c22ab081c96ee0b676244300691d7a2f63fe4aedd22f150f17fe4aa5a9 size: 529
curl 查看镜像目录
[root@docker apache]# curl -XGET http://192.168.233.133:5000/v2/_catalog
{"repositories":["httpd"]}
[root@docker apache]# docker pull 192.168.233.133:5000/httpd '从本地下载镜像'