Docker架构分为:
- docker host:运行docker daemon的主机
- docker client:对容器进行create…
一个host可以启动多个容器,基于镜像可在容器中启动不同的应用。如果本地无此镜像,docker可自动连接到docker registry上下载镜像,存储到本地/文件系统(overlay2)中。
镜像本身是只读的,仓库名就是应用程序名。而仓库内是同一应用程序的不同版本,使用标签来识别之后。
Docker是码头工人的意思,而镜像可形象理解为应用程序的集装箱,码头工人docker负责装卸集装箱(image/application)。
Docker镜像
比如,在底层纯净的发行版之上,添加一个emacs层,这是一个独立的层,如果需要额外的工具则需要在上面执行安装操作比如安装vim,安装后可理解为附加了一层vim的层级,该层级仅仅包含了vim。然后可再添加一个独立的层级如apache。当启动apache时,从下往上挂载叠加,并且三层都是只读的。如果需要读写操作,则在最上层容器的自有层次(container)进行,而其他层次是共享的。
一旦启动完成,最底下的层(kernel)也将被移除。如果删除容器,则容器自有的可写层也被删除。
镜像的分成构建和联合挂载,依赖专有的文件系统支撑。
其中overlay2是二层抽象文件系统,需要底层文件系统支持(XFS)
Docker registry
镜像的统一存储位置。构建镜像时,需要一个统一存储的位置。当启动镜像时,docker daemon先从本地获取镜像,如果本地不存在镜像则到registry中下载镜像并保存到本地。如果没有指定镜像地址,则到docker hub中获取。
一般而言,需要二次定制镜像以符合自身业务需求。
Registry的组成部分:repository(一大堆仓库) index(一个索引)
运维人员可将镜像pull到特定的环境部署,比如UAT (用户验收测试)环境,Promote环境,Production环境。
第三方镜像仓库
镜像制作
获取flannel镜像,默认通过443端口拉取:
方法:启动一个容器,在容器之上做好自己需要的配置,然后通过docker commit制作镜像。
如:将busybox 加上html目录和index.html,将此结果做成镜像。日后每次启动有会存在此文件。
1.安装docker服务,并启动:
yum install docker –y
systemctl start docker
2.拉取busybox镜像:
docker pull busybox
3.启动容器:
4.提交
5.打上标签
6.可以为一个镜像打上多个标签:
7.删除一个镜像,仅删除了指定标签的镜像:
8.也能在做镜像的同时,打上标签
9.docker inspect busy 查看镜像在启动时,默认执行的命令,比如
- 10.在创建镜像时,改变原来镜像默认运行的命令,修改原有镜像的基础命令,修改其中的cmd指令:
docker commit -a "jaywin.com" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 jaywin/httpd:v0.2
- 运行0.2镜像:
- 验证:
docker container inspect t2
镜像推送
- 登录到服务器上
- 本地镜像的名字,必须和docker hub中保持一致
国内访问比较快的镜像地址,是阿里云
登录自己的账号,获得自己专用的加速地址,写入到daemon.json中,重启docker后生效。
可以根据操作指南,将镜像托管到阿里云:
- docker login --username=15088132158 registry.cn-hangzhou.aliyuncs.com
- docker tag 9bc68d7b4d76 registry.cn-hangzhou.aliyuncs.com/jaywinz/httpd:v0.1-1
- docker push registry.cn-hangzhou.aliyuncs.com/jaywinz/httpd
推送镜像时,如果不是dockerhub,则必须加上服务器地址,名称空间和标签
镜像的导入和导出
在已有镜像的基础上,打包镜像。然后在另外的机上解压直接使用。
比如:
- docker save -o myimages.gz jaywin/httpd:v0.1-1 jaywinz/httpd:v0.2-1
- docker load -i myimages.gz