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 镜像可以 ...
随机推荐
- $Miller Rabin$总结
\(Miller Rabin\)总结: 这是一个很高效的判断质数的方法,可以在用\(O(logn)\) 的复杂度快速判断一个数是否是质数.它运用了费马小定理和二次探测定理这两个筛质数效率极高的方法. ...
- mysql 显示表字段及mysql系统信息
参考链接: http://www.cnblogs.com/zhwl/archive/2012/08/28/2660532.html SHOW DATABASES ...
- 20165227《网络对抗技术》Exp0 Kali安装 Week1
2018-2019-2 <网络对抗技术>Exp0 Kali安装 Week1 kali下载:镜像文件通过同学获得 kali具体安装步骤: 打开VMware,点击新建虚拟机,进行创建 创建完成 ...
- Three.js基础探寻二——正交投影照相机
本篇主要介绍照相机中的正交投影照相机. 第一篇传送门:Three.js基础探寻一 1.照相机 图形学中的照相机定义了三维空间到二维屏幕的投影方式. 针对投影方式照相机分为正交投影照相机和透视投影照相机 ...
- unbuntu 16.04.2 安装 Eclipse C++开发环境
1.安装JAVA (1)首先添加源: sudo gedit /etc/apt/sources.list 在打开的文件中添加如下内容并保存: deb http://ppa.launchpad.net/w ...
- centos 编译安装PHP5.4
2013年12月29日 19:52:30 已经安装好Apache 2.4 php版本 5.4 ./configure --prefix=/usr/local/lamp/php --with-apxs2 ...
- Thymeleaf:访问Spring中的bean
项目做了动静分离,即静态文件全部放在nginx中,动态文件在tomcat中,如何引用静态文件,我是这么做的,见下: 运行结果:
- IntelliJ IDEA 12:
启动参数-server -Xms1024m -Xmx1024m -XX:NewSize=128m -XX:MaxNewSize=128m -XX:PermSize=128m -XX:MaxPermSi ...
- bert中的分词
直接把自己的工作文档导入的,由于是在外企工作,所以都是英文写的 chinese and english tokens result input: "我爱中国",tokens:[&q ...
- Java char
Java char字符判断和操作方法类似C的ctype库 //: object/Shifting.java package object; import static net.util.Print. ...