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 镜像可以 ...
随机推荐
- Docker容器命令
★根本前提:本地主机有镜像才能创建容器 ⒈docker run [Options] 镜像名称或镜像ID [Command] [Arg...] 用途:利用镜像创建容器实例 Options说明(常用):注 ...
- Python select IO多路复用
一.select介绍 Python的select()函数是底层操作系统实现的直接接口.它监视套接字,打开文件和管道(任何带有返回有效文件描述符的fileno()方法),直到它们变得可读或可写,或者发生 ...
- Qt5 json 数据处理
QT4中使用第三方库QJson解析JSON文件. QT5新增加了处理JSON的类,类均以QJson开头,包含在QtCore模块中. 用到的头文件 #include <QJsonArray> ...
- JDK1.5引入的concurrent包
并发是伴随着多核处理器的诞生而产生的,为了充分利用硬件资源,诞生了多线程技术.但是多线程又存在资源竞争的问题,引发了同步和互斥,并带来线程安全的问题.于是,从jdk1.5开始,引入了concurren ...
- Python-HTML CSS 练习
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- PYTHON-基本数据类型-数字类型,字符串类型,列表类型-练习
# 字符串练习# 写代码,有如下变量,请按照要求实现每个功能 (共6分,每小题各0.5分)# name = " aleX"# # 1) 移除 name 变量对应的值两边的空格,并输 ...
- CPU密集型 VS IO密集型
CPU密集型 CPU密集型也叫计算密集型,指的是系统的硬盘.内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的 ...
- LeetCode(50):Pow(x, n)
Medium! 题目描述: 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, ...
- 【python】中文提取,判断,分词
参考: http://www.cnblogs.com/kaituorensheng/p/3595879.html https://github.com/fxsjy/jieba 判断是否包含中文 def ...
- 绝对定位后,position:absolute;不能使用margin: 0 auto;实现居中;
声明: web小白的笔记,欢迎大神指点!联系QQ:1522025433. 我们都知道margin: 0 auto:可也实现块状元素的水平居中:但是对于绝对顶为的元素就会失效: 请看实例: <!d ...