004.Docker镜像管理
一 镜像基本操作
1.1 搜索镜像
1 root@docker:~# docker search centos #查询centos共享镜像

1.2 下载(拉取)镜像
1 root@docker:~# docker pull centos:7 #使用pull下载镜像

1.3 列出(查看)本地镜像
1 root@docker:~# docker images <特定标签> #查看本地下载的镜像

- REPOSTITORY:表示镜像的仓库源,有以下类型:
- [namespace/centos]:由命名空间和实际的仓库名称组成。
- [centos]:只有仓库名。属于顶级命名空间,只用于官方镜像。
- [dl.dockerpool.com:5000\centos:7]:指定URL路径的方式。
- TAG:镜像的标签
- 未指定镜像tag时,默认为latest,但latest没有任何特殊含义,人为的将latest作为最新稳定版本的别名;
- 一个repository可以有多个tag,而多个tag也可能对应同一个镜像。
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
1.4 推送镜像
1 root@docker:~# docker push registry.cn-hangzhou.aliyuncs.com/xhy-study-01/xhy-images-01:centos-7-xhy

1.5 导出镜像
1 root@docker:~# docker save -o centos-7.tar centos:7
1.6 导入镜像
1 root@docker:~# docker load -i centos-7.tar
1.7 删除镜像
1 root@docker:/study# docker rmi httpd
1.8 设置镜像标签
1 root@docker:~# docker tag 6de222aa7640 xhy/centos7:v3
2 root@docker:~# docker images

二 docker文件系统
2.1 Linux文件系统简介
2.2 docker文件系统
2.3 docker镜像原理



三 镜像结构
3.1 image结构

1 root@docker:/study# tar -xf centos-7.tar

1 root@docker:/study# tree

1 root@docker:/study# cat repositories
2 {"centos":{"7":"d1ed0d8ec4ec460641430566e9a8cece698e60d4ad4afcf48759ad157d340064"}}
1 root@docker:/study# cat d1ed0d8ec4ec460641430566e9a8cece698e60d4ad4afcf48759ad157d340064/json | jq .

1 root@docker:/study# tar -tf d1ed0d8ec4ec460641430566e9a8cece698e60d4ad4afcf48759ad157d340064/layer.tar

四 Dockerfile、Docker镜像和Docker容器
4.1 关系


五 docker存储驱动
5.1 底层技术
- 写时复制(CoW)
- 用时分配(allocate-on-demand)
5.2 AUFS

5.3 OverlayFS

5.4 Device mapper

5.5 Btrfs

5.6 ZFS


5.7 存储驱动的对比及适应场景
|
特点
|
优点
|
缺点
|
使用场景
|
|
|
AUFS
|
联合文件系统
未并入内核主线
文件级存储
|
作为docker的第一个存储驱动,相对稳定,且在大量的生产中实践,有较强的社区支持。
|
有多层,在做写时复制操作时,如果文件较大且存在比较低的层,可能会慢一些。
|
大并发但少IO的场景。
|
|
OverlayFS
|
联合文件系统
并入内核主线
文件级存储
|
只有两层
|
不管修改的内容大小都会复制整个文件,对大文件进行修改显示要比小文件消耗更多的时间。
|
大并发但少IO的场景。
|
|
Device mapper
|
并入内核主线
块级存储
|
块级无论是大文件还是小文件都只复制需要修改的块,并不是整个文件。
|
不支持共享存储,即有多个容器读同一个文件时,需要生产多个副本,在多容器启停的情况下可能会导致磁盘溢出。
|
适合IO密集的场景。
|
|
Btrfs
|
并入内核主线
文件级存储
|
可如Device mapper直接操作底层设备,支持动态添加设备。
|
不支持共享存储,即有多个容器读同一个文件时,需要生产多个副本,在多容器启停的情况下可能会导致磁盘溢出。
|
不适合在高密度容器的PaaS平台上使用。
|
|
ZFS
|
把所有设备密集到一个存储池进行管理。
|
支持多个容器共享一个缓存块,适合内存大的环境。
|
COW使碎片化问题更加严重,文件在硬盘上的物理地址会变得不再连续,顺序读会变得性能比较差。
|
适合PaaS和高密度的场景。
|
5.8 修改docker存储驱动类型
1 root@docker:~# vi /etc/docker/daemon.json
2 {
3 "storage-driver": "overlay2"
4 }
六 创建镜像
- 从已经创建的容器中更新镜像,并且提交这个镜像
- 使用 Dockerfile 指令来创建一个新的镜像
6.1 更新镜像并提交
- 运行容器
- 修改容器
- 将容器保存为新的镜像
1 root@docker:~# docker run --name centos-7-01 -it centos:7 /bin/bash #创建容器
2 [root@01b2b251e216 /]# yum -y install net-tools vim openssh-clients wget ntp bash-completion #安装软件
3 [root@01b2b251e216 /]# exit
4 root@docker:~# docker commit -m="has modify" -a="xhy" 01b2b251e216 centos-7-01
5 root@docker:~# docker images

- -m:提交的描述信息
- -a:指定镜像作者
- 01b2b251e216 :容器ID
- centos-7-01:指定要创建的目标镜像名
1 root@docker:~# docker images #查看镜像
- 手动创建,容易出错,效率低及可重复性弱
- 使用者并不知道镜像是如何创建出来的,里面是否有恶意程序,可能存在案例隐患
6.2 Dockerfile构建镜像举例
1 root@docker:~# mkdir /dockerfiles
2 root@docker:~# cd /dockerfiles/
3 root@docker:/dockerfiles# vi Dockerfile
4 FROM centos:7
5 MAINTAINER Fisher "xhy@imxhy.cn"
6
7 RUN /bin/echo 'root:x123456' |chpasswd
8 RUN useradd xhy
9 RUN /bin/echo 'xhy:x123456' |chpasswd
10 RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
11 EXPOSE 22
12 EXPOSE 80
13 CMD /usr/sbin/sshd -D
1 root@docker:/dockerfiles# docker build -t xhy/centos7 /dockerfiles/
- -t :指定要创建的目标镜像名
- /dockerfiles/:Dockerfile 文件所在目录
1 root@docker:~# docker images #查看镜像

1 root@docker:/dockerfiles# docker run -t -i xhy/centos7 /bin/bash #创建容器

七 Dockerfile详解
7.1 Dockerfile典型结构
1 From ubutu #第一行必须指令基于的基础镜像
2 MAINTAINER docker_user docker_user@mail.com #维护者信息
3 apt/sourcelist.list #镜像的操作指令
4 RUN apt-get update && apt-get install -y ngnix #镜像的操作指令
5 RUN echo "\ndaemon off;">>/etc/ngnix/nignix.conf #镜像的操作指令
6 CMD /usr/sbin/ngnix #容器启动时执行指令
7.2 Dockerfile相关指令
- 指令:From
1 FROM <image>
2 FROM <image>:<tag>
3 FROM <image>:<digest>
- FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。
- 如果有需求在一个 Dockerfile 中创建多个镜像,则FROM可以在一个 Dockerfile 中出现多次。
- 如果FROM语句没有指定镜像标签,则默认使用latest标签。
- 指令:MAINTAINER
1 MAINTAINER <name>
1 MAINTAINER xhy
- 指令:RUN
1 RUN <commands>
2 RUN "executable", "param1", "param2"
1 RUN echo 'Hello, Docker!'
2 RUN ["/bin/bash", "-c","echo hello"]
- 指令:CMD
1 CMD "executable","param1","param2"
2 CMD "param1","param2"
3 CMD command param1 param2 (shell form)
- 指令:ENTRYPOINT
1 ENTRYPOINT "executable", "param1", "param2"
2 ENTRYPOINT command param1 param2 (shell form)
1 ENTRYPOINT ["nginx"]
2 CMD ["-g","daemon off;"]
- 指令:ADD
1 ADD <src>... <dest>
1 ADD http://mirrors.163.com/.help/CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo
- 指令:COPY
1 COPY <src>... <dest>
1 COPY package.json /usr/src/app/
- 指令:EXPOSE
1 EXPOSE <port> [<port>...]
1 EXPOSE 22 80 8443
- 指令:ENV
1 ENV <key> <value> # 只能设置一个变量
2 ENV <key>=<value> ... # 允许一次设置多个变量
1 ENV myName="John Doe" myDog=Rex myCat=fluffy
2 ENV PG_MAJOR 9.3
3 ENV PG_VERSION 9.3.4
- 指令:VOLUME
1 VOLUME ["<路径1>", "<路径2>"...]
2 VOLUME <路径>
1 VOLUME ["/data","/opt"]
- 指令:WORKDIR
1 WORKDIR <path>
1 WORKDIR /app
- 指令:USER
1 USER <user>[:<group>]
2 USER <UID>[:<GID>]
1 RUN groupadd -r redis && useradd -r -g redis redis
2 USER redis
3 RUN [ "redis-server" ]
- 指令:ONBUILD
1 ONBUILD [INSTRUCTION]
1 [...]
2 ONBUILD ADD . /app/src
3 ONBUILD RUN /usr/local/bin/python-build --dir /app/src
4 [...]
1 FROM image-A
1 ADD . /app/src
2 RUN /usr/local/bin/python-build --dir /app/src
- 指令:HEALTHCHECK
1 HEALTHCHECK [选项] CMD <命令> :设置检查容器健康状况的命令
2 HEALTHCHECK NONE :如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
- interval=<间隔> :两次健康检查的间隔,默认为 30 秒;
- timeout=<时长> :健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
- retries=<次数> :当连续失败指定次数后,则将容器状态视为 unhealthy ,默认 3 次。
1 FROM nginx
2 RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
3 HEALTHCHECK --interval=5s --timeout=3s \
4 CMD curl -fs http://localhost/ || exit 1
7.3 dockerfile最佳实践
- 使用.dockerignore文件
- 避免安装不必要的软件包
- 每个容器都跑一个进程
- 最小化层
- 多行参数排序
1 RUN apt-get update && apt-get install -y \
2 bzr \
3 cvs \
4 git \
5 mercurial \
6 subversion
- 尽可能清理不必要的文件
004.Docker镜像管理的更多相关文章
- Docker镜像管理基础篇
Docker镜像管理基础篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker Images Docker镜像还有启动容器所需要的文件系统及其内容,因此,其用于创建并启 ...
- Devops(四):Docker 镜像管理
参考 <Docker中上传镜像到docker hub中> <Docker 镜像管理> <通过容器提交镜像(docker commit)以及推送镜像(docker push ...
- 2、docker镜像管理
Docker镜像管理 镜像是Docker容器的基础,想运行一个Docker容器就需要有镜像.我们上面已经学会了使用search搜索镜像.那么这个镜像是怎么创建的呢? 创建镜像 镜像的创建有以下几种方法 ...
- Docker学习第一天(Docker入门&&Docker镜像管理)
简介 今天小区的超市买零食老板给我说再过几天可能就卖完了我有点诧异,老板又说厂家不生产了emmm 今天总算开始docker了! 1.Docker? 1.什么是Docker Docker 是一个开源的应 ...
- 三、docker镜像管理
一.docker镜像管理 1.1.镜像搜索-search 从docker镜像仓库模糊搜索镜像 用法: docker search 镜像关键字 [root@zutuanxue ~]# docker se ...
- paas架构之docker——镜像管理
1. 镜像管理 1.1. 列出镜像 Sudo docker images 1.2. 查看镜像 Sudo docker images xxxx 1.3. 拉取镜像 Sudo docker pull ub ...
- Docker镜像管理
镜像是docker的三大核心概念之一.可以用来创建容器. Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统被称为UnionFS.镜像可以基于Dockerfile构建,Dockerf ...
- docker镜像管理(二)
docker镜像 docker镜像含有启动容器所需要的文件系统和内容,因此,其用于创建并启动docker容器 docker镜像采用分层构建机制,最底层为bootfs,其之为rootfs bootfs: ...
- Docker 学习3 Docker镜像管理基础
一.docker 常用操作及原理 1.docker 常用操作 2.docker 机制 1.docker client端是通过http或者https与server端通信的.个 2.docker 镜像可以 ...
随机推荐
- Python实现图片压缩
项目中大量用到图片加载,由于图片太大,加载速度很忙,因此需要对文件进行统一压缩 一:导入包 from PIL import Image import os 二:获取图片文件的大小 def get_si ...
- Mybatis进阶学习笔记——动态代理方式开发Dao接口、Dao层(推荐第二种)
1.原始方法开发Dao Dao接口 package cn.sm1234.dao; import java.util.List; import cn.sm1234.domain.Customer; pu ...
- 如何调整cell的大小
一般情况下,我们使用tableview的时候从来没有设置过cell的大小(w,h).位置(x,y)等,而是系统直接给我们自动生成,但是有的时候我们可能会改动cell的大小及位置,比如:在适配ios6跟 ...
- OGG实现两台Oracle数据库的同步
今天通过最简单的一个例子,给大家讲解下 goldengate 实现两台Oracle数据库的同步.内容如下:1.配置数据库信息.2.安装golden gate.3.配置golden gate.4.测试同 ...
- python2和3使用pip时的问题
win10,电脑之前装有Anaconda,python2.因为需要用到python3,所以直接下载安装了python3.python3默认路径在c盘.我将其移到D盘并修改了两个环境变量.这时电脑的默认 ...
- 四、Logisitic Regssion练习(转载)
转载:http://www.cnblogs.com/tornadomeet/archive/2013/03/16/2963919.html 牛顿法:http://blog.csdn.net/xp215 ...
- ubuntu cron 及 crontab 自动执行任务
Add the below line (with tweaks) to the end of /etc/crontab: 30 23 * * * root shutdown -h now At 23: ...
- Paramiko 操作远端时无法切换目录的问题
最近在用Paramiko 开发一款远程测试调试框架,结果发现目录怎么都无法切换,查了下原因,在http://bbs.chinaunix.net/thread-1675446-1-1.html看到了 P ...
- Python select IO多路复用
一.select介绍 Python的select()函数是底层操作系统实现的直接接口.它监视套接字,打开文件和管道(任何带有返回有效文件描述符的fileno()方法),直到它们变得可读或可写,或者发生 ...
- (并发编程)进程IPC,生产者消费者模型,守护进程补充
一.IPC(进程间通信)机制进程之间通信必须找到一种介质,该介质必须满足1.是所有进程共享的2.必须是内存空间附加:帮我们自动处理好锁的问题 a.from multiprocessing import ...