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 镜像可以 ...
随机推荐
- Difference between plt.draw() and plt.show() in matplotlib
Difference between plt.draw() and plt.show() in matplotlib down voteaccepted plt.show() will display ...
- 网络常用的linux系统调用
网络之常用的Linux系统调用 下面一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数将在前面标上“*”号以示区别. 一.进程控制 fo ...
- KVM -> 虚拟机磁盘管理_03
1.KVM磁盘管理 1.KVM qcow2.raw.vmdk等镜像格式说明:http://blog.csdn.net/zhengmx100/article/details/53887162 raw: ...
- XPATH语法(二)
节点(node) 在 XPath 中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档(根)节点.XML 文档是被作为节点树来对待的.树的根被称为文档节点或者根节点. 以下面这xm ...
- Z-index研究 opacity和z-index一起使用
Z-index研究 opacity和z-index一起使用 关于z-index的真正问题是,很少有人理解它到底是怎么用.其实它并不复杂,但是如果你从来没有花一定时间去看具体的z-index相关文档 ...
- LeetCode(58): 最后一个单词的长度
Easy! 题目描述: 给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. ...
- cf Queries on a String
#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define ...
- SPOJ - MATSUM 二维树状数组单点更新
忘记了单点更新时要在树状数组中减去原值..wa了一发 /* 矩形求和,单点更改 */ #include<iostream> #include<cstring> #include ...
- python + selenium 模块封装及参数化
模块封装 示例代码: baidu.py from time import sleep from selenium import webdriver driver = webdriver.Chrome( ...
- java web项目为什么我们要放弃jsp?
前戏: 以前的项目大多数都是java程序猿又当爹又当妈,又搞前端(ajax/jquery/js/html/css等等),又搞后端(java/mysql/Oracle等等). 随着时代的发展,渐渐的许多 ...