[云原生]Docker - 镜像
参考:
Docker镜像
在之前的介绍中,我们知道镜像是Docker的三大组件之一。
Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会从镜像仓库下载(默认是Docker Hub公共注册服务器中的仓库)。
本文将介绍关于镜像的内容,包括:
- 从仓库获取镜像
- 管理本地主机上的镜像
- 介绍镜像实现的基本原理
获取镜像
可以使用docker pull命令来从仓库获取所需要的镜像。
举例:从Docker Hub仓库下载一个Ubuntu操作系统的镜像。
[root@localhost /]# docker pull ubuntu:latest
latest: Pulling from library/ubuntu
7b1a6ab2e44d: Pull complete
Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
下载过程中,会输出获取镜像的每一层的信息。
该命令等价于docker pull registry.hub.docker.com/ubuntu:latest命令,即从注册服务器registry.hub.docker.com中的ubuntu仓库来下载latest的镜像。
有时候官方仓库注册服务器下载比较慢,可以从其他仓库中下载。以阿里云镜像加速为例,配置流程:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://<个人的地址号>.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
*注意:容器镜像服务 (aliyun.com),登陆阿里云账号,可查看自己的镜像加速器地址。

配置完之后可以通过docker info查看

列出本地镜像
使用docker images显示本地已有的镜像。
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ba6acccedd29 7 weeks ago 72.8MB
ubuntu test ba6acccedd29 7 weeks ago 72.8MB
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
在列出的信息中,可以看到几个字段
- REPOSITORY:来源于哪个仓库,比如ubuntu
- TAG:镜像的标签,比如latest
- IMAGE ID:镜像ID(唯一)
- CREATED:创建时间
- SIZE:镜像大小
其中镜像的IMAGE ID唯一标识了镜像,上面ubuntu:latest和ubuntu:test具有相同的镜像IMAGE ID,说明它们实际上是同一镜像。
TAG信息用来标记来自同一个仓库的不同镜像。例如ubuntu仓库中有多个镜像,通过TAG信息来区分发行版本,例如10.04、12.04、14.04等,而latest标识最新的版本。
下面的命令指定使用镜像ubuntu:latest来启动一个容器。
sudo docker run -it ubuntu:latest /bin/bash
如果不指定具体的标记,则默认使用latest标记信息。
其中-it的含义:
| 选项 | 简写 | 说明 |
|---|---|---|
| -detach | -d | 在后台运行容器,并且打印容器ID。 |
| -interactive | -i | 即使没有连接,也要保持标准输入保持打开状态,一般与-t连用。 |
| -tty | -t | 分配一个伪tty,一般与-i连用。 |
创建镜像
创建镜像有很多方法,用户可以从Docker Hub获取已有镜像并更新,也可以利用本地文件系统创建一个。
方法一:修改已有镜像
通过修改原有的镜像,来定制创建镜像,以上面的ubuntu镜像为例子。
- 启动镜像,写入一些文件或者更新软件。
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ba6acccedd29 7 weeks ago 72.8MB
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
[root@localhost /]#
[root@localhost /]# docker run -it ubuntu:latest /bin/bash
root@ad84bf1eb7d8:/#
root@ad84bf1eb7d8:/# cd ~
root@ad84bf1eb7d8:~# echo "Modify test" >> test.txt
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad84bf1eb7d8 ba6acccedd29 "/bin/bash" 27 seconds ago Up 26 seconds
- 提交镜像更改(将容器转为镜像)
[root@localhost ~]# docker commit -m="Ubuntu image commit test" -a="Skybiubiu" ad84bf1eb7d8 ubuntu2:test
sha256:5299c83968a8ef1a44308d851593f74620945ccda08a6ea516fd0ad9055dc019
[root@localhost ~]#
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu2 test 5299c83968a8 4 seconds ago 72.8MB
ubuntu latest ba6acccedd29 7 weeks ago 72.8MB
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-m:提交的描述信息
-a:指定镜像作者
方法二:通过Dockerfile构建镜像
使用docker commit来扩展一个镜像比较简单,但是不方便在一个团队中分享。
我们可以使用docker build来创建一个新的镜像。为此,首先需要创建一个Dockerfile,包含一些如何创建镜像的指令。
新建一个目录和一个Dockerfile。
cd ~
mkdir Dockerfile_dir
cd Dockerfile_dir
touch Dockerfile
Dockerfile中每一条指令都创建镜像的一层(并非绝对),以构建一个Nginx镜像为例子
[root@localhost Dockerfile_dir]# vim Dockerfile
FROM nginx
MAINTAINER SkyBiuBiu
RUN echo "It 's a Nginx image,created by skybiubiu." > /usr/share/nginx/html/index.html
Dockerfile基本的语法是
- 使用
#来注释。 FROM关键字告诉Docker使用哪个镜像作为基础。- 接着
MAINTAINER是维护者信息。 RUN开头的指令会在创建中运行,比如安装一个软件包。
编写完成的Dockerfile可以通过docker build命令来生成镜像。
docker build -t="skybiubiu/nginx:v1" .
格式:
-t:打标签.:表示当前文件夹下


*注意:更多写法,在后面Dockerfile章节补充。
方法三:从本地文件系统导入
通过docker import命令从本地文件系统导入镜像。
将一个本地文件夹导入转化成一个镜像。
上传镜像
首先,得通过docker login命令登陆Docker Hub。
[root@localhost ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: skybiubiu
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
然后通过docker push命令上传镜像。
格式docker push 仓库ID/镜像名:Tag
[root@localhost ~]# docker push skybiubiu/nginx:v1
The push refers to repository [docker.io/skybiubiu/nginx]
42bab3f962bd: Pushed
2bed47a66c07: Mounted from library/nginx
82caad489ad7: Mounted from library/nginx
d3e1dca44e82: Mounted from library/nginx
c9fcd9c6ced8: Mounted from library/nginx
0664b7821b60: Mounted from library/nginx
9321ff862abb: Mounted from library/nginx
v1: digest: sha256:57227eb210f8abbeacd1f54f3334300636968371adfbe7a9a3a94f00931444d8 size: 1777
保存和载入镜像
镜像列表如下
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
skybiubiu/nginx v1 c841f47ef705 3 hours ago 141MB
ubuntu2 test 5299c83968a8 3 hours ago 72.8MB
nginx latest f652ca386ed1 6 days ago 141MB
ubuntu latest ba6acccedd29 7 weeks ago 72.8MB
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
将ubuntu2:test导出到本地,-o表示output。
[root@localhost ~]# docker save -o ubuntu2.tar ubuntu2:test
[root@localhost ~]# ls | grep ubuntu2.tar
ubuntu2.tar
将本地ubuntu2.tar导入为镜像,-i表示input。
[root@localhost ~]# docker load -i ubuntu2.tar
Loaded image: ubuntu2:test
移除本地镜像
通过docker rmi命令可以删除镜像。
通过命令删除skybiubiu/nginx:v1的镜像。
[root@localhost ~]# docker rmi skybiubiu/nginx:v1
Untagged: skybiubiu/nginx:v1
Untagged: skybiubiu/nginx@sha256:57227eb210f8abbeacd1f54f3334300636968371adfbe7a9a3a94f00931444d8
Deleted: sha256:c841f47ef70593e223dfd75f23df2c21dbe7e75cd1a63eea9dd454bf0f6f0d99
Deleted: sha256:79ff50c01b6592d364734334d08ea63d7bd7a00646d710c8e1a4927666271544
Deleted: sha256:e94202cb0e93a88978d0bacfd032e2158fb68b4803d900868595b351a7801fb3
*注意:docker rm命令删除的是容器
有一个删除所有镜像的小技巧,如下。
docker rmi -f $(docker images -q)
上面命令中,docker images -q输出的是镜像ID,将镜像ID作为变量传入docker rmi -f中,删除所有镜像。
镜像的实现原理
Docker 镜像是怎么实现增量的修改和维护的? 每个镜像都由很多层次构成,Docker 使用 Union FS 将这 些不同的层结合到一个镜像中去。
通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下,另一个更 常用的就是将一个只读的分支和一个可写的分支联合在一起,Live CD 正是基于此方法可以允许在镜像不 变的基础上允许用户在其上进行一些写操作。 Docker 在 AUFS 上构建的容器也是利用了类似的原理。
*注意:关于Docker镜像实现原理,后面专门写一篇博客来研究。
[云原生]Docker - 镜像的更多相关文章
- 使用阿里云加速docker镜像的安装
刚接触docker,尝试安装node镜像.docker运行在win7中,安装完Docker Toolbox之后简单敲了docker pull node命令,然后就是漫长的等待了… 等待的结果就是nod ...
- [云原生]Docker - 简介
目录 什么是Docker? 为什么使用Docker? 对比传统虚拟机总结 什么是Docker? Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业务项目.它基于Go ...
- [云原生]Docker - 安装&卸载
目录 系统要求 卸载旧版本 安装Docker 方法一:通过repo安装 设置Repository 安装Docker Engine 升级Docker Engine 方法二:通过package安装 方法三 ...
- [云原生]Docker - 容器
目录 Docker容器 启动容器 新建并启动 启动已终止容器 守护态运行容器 终止容器 进入容器 attach命令 exec命令 导出和导入容器 导出容器 导入容器 删除容器 Docker容器 容器是 ...
- 5大最新云原生镜像构建工具全解析,3个来自Google,你了解几个?
1云原生大背景下的镜像构建在分享开始,我想先跟大家简单聊一下云原生,可能不会详细展开,而是带领大家了解一下云原生对镜像构建方面的影响.第一,在接触云原生相关的技术时,无论是要解决开发.测试环境的问题, ...
- 4. docker镜像的概念、管理(查看、下载、删除)
镜像的概念 镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上.镜像是容器运行的基石. 下图展示的是Docker镜像的系统结构. ...
- 8.云原生之Docker容器镜像构建最佳实践浅析
转载自:https://www.bilibili.com/read/cv15220861/?from=readlist 本章目录 0x02 Docker 镜像构建最佳实践浅析 1.Dockerfile ...
- 7.云原生之Docker容器Dockerfile镜像构建浅析与实践
转载自:https://www.bilibili.com/read/cv15220707/?from=readlist Dockerfile 镜像构建浅析与实践 描述:Dockerfile是一个文本格 ...
- Docker Data Center系列(一)- 快速搭建云原生架构的实践环境
本系列文章演示如何快速搭建一个简单的云原生架构的实践环境. 基于这个基础架构,可以持续部署微服务架构的应用栈,演练敏捷开发过程,提升DevOps实践能力. 1 整体规划 1.1 拓扑架构 1.2 基础 ...
随机推荐
- DP秒思维
DP算法对于大部分题有着良好的能力,但有些题目我们要转换思维,不能直接的设具体的转态.... 最近做了两道秒题,在这里分享一下: https://ac.nowcoder.com/acm/contest ...
- hdu 3038 How Many Answers Are Wrong(并查集)
题意: N和M.有N个数. M个回答:ai, bi, si.代表:sum(ai...bi)=si.如果这个回答和之前的冲突,则这个回答是假的. 问:M个回答中有几个是错误的. 思路: 如果知道sum( ...
- redis 的主从模式哨兵模式
原理理解 1,哨兵的作用就是检测redis主服务的状态,如果主服务器挂了,从服务就自动切换为主服务器,变为master.哨兵是一个独立的进程,作为进程,它会独立运行.其原理是哨兵通过发送命令,等待Re ...
- 一、安装zabbix监控(源码编方式)
首先介绍一下zabbix的运行原理和运行条件. Zabbix监控原理 Zabbix 通过C/S 模式采集数据,通过B/S模式在web 端展示和配置. 被监控端:主机通过安装agent 方式采集数据, ...
- 单自由度系统中质量、阻尼和刚度变化对频率响应函数(FRF)影响图的绘制
作者:赵兵 日期:2020-02-17 目录 单自由度系统中质量.阻尼和刚度变化对频率响应函数(FRF)影响图的绘制 1. 背景 2. VISIO绘制 3. Matlab绘制 ...
- k8s入坑之路(11)kubernetes服务发现
kubernetes访问场景 1.集群内部访问 2.集群内部访问外部 3.集群外部访问内部 1.集群内部访问 1.pod之间直接ip通讯(利用calico通过路由表经过三层将ip流量转发)由于容器之间 ...
- MyBatis-Plus 快速入门
1.简介 MyBatis-Plus (简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 1.1.特性 无侵入:只做增强不做改变, ...
- Linux内核内存检测工具KASAN
KASAN 是 Kernel Address Sanitizer 的缩写,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题.KASAN 集成在 Linux 内核中,随 ...
- CentOS7 hadoop3.3.1安装(单机分布式、伪分布式、分布式)
@ 目录 前言 预先设置 修改主机名 关闭防火墙 创建hadoop用户 SSH安装免密登陆 单机免密登陆--linux配置ssh免密登录 linux环境配置Java变量 配置Java环境变量 安装Ha ...
- Part 30 AngularJS routeparams example
Here is what we want to do : When we navigate to /students, the list of student names must be displa ...