docker:镜像image的使用

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

什么是镜像Image

  • 文件和 meta data 的集合(root filesystem)
  • 分层的,每一层都可以添加、修改、删除文件,成为一个新的 image
  • 不同的 image 可以共享相同的 layer
  • image 本身是只读的

对于 linux 来讲分为内核空间(bootfs)和用户空间(rootfs)
在这里插入图片描述
这些 base image 只包含 rootfs,共享了主机的 bootfs 空间,基于 base image,我们可以增加删除文件,比如图,在 ubuntu 之上安装了 mysql,变为了 image1

不同的 image 可以共享相同的 layer,比如image2安装了mysql,image4在image2之上又安装了nginx,共享了分层

列出镜像

# 列出本机所有的镜像
docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               90d5884b1ee0        5 days ago          188 MB
php                 5.6                 f40e9e0f10c8        9 days ago          444.8 MB
nginx               latest              6f8d099c3adc        12 days ago         182.7 MB
mysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MB
httpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MB
ubuntu              15.10               4e3b13c8a266        4 weeks ago         136.3 MB

这里比如 ubuntu 的 tag 有两个不一样的,所以运行的话用 : 区分
docker run -t -i ubuntu:15.10 /bin/bash

查找镜像

方法一:
Docker Hub 网址为: https://hub.docker.com/
方法二:

docker search httpd

获取镜像

# 获取镜像
docker pull ubuntu:13.10

获取完就可以 docker run 这个镜像啦

删除镜像

docker rmi hello-world

创建镜像

方式一:从已经创建的容器中更新镜像,并且提交这个镜像
方式二:使用 Dockerfile 指令来创建一个新的镜像

方式一

首先使用 docker run 运行一个容器,然后更改这个容器,比如 nginx 容器更改一下配置。然后通过命令 docker commit 来提交容器副本

docker commit -m="has update" -a="runoob" e218edb10161 zy/nginx:v2
  • -m: 提交的描述信息
  • -a: 指定镜像作者
  • e218edb10161:容器 ID
  • zy/nginx:v2: 指定要创建的目标镜像名

使用 docker images 命令来查看我们的新镜像,查到就可以 docker run 运行啦。

不推荐此方式,因为不知道我们镜像的来源,不安全也不清晰,推荐使用方式二

方式二

使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
例如:某个 Dockerfile 文件

FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

docker build -t runoob/centos:6.7 .
  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

使用docker images 查看创建的镜像已经在列表中存在

思考:image是只读的,那我们如果在Dockerfile中yum install xx,这样岂不是往里面写东西?
其实在安装的过程中会创建一个临时的容器来安装,待安装完成又会删除这个临时的容器

提交镜像

提交镜像最佳的方式是将 docker hub 和 github 做关联,这样你就只需要在 github 上维护你的 Dockerfile 文件,push 上去后 docker hub 会自动帮你构建
在这里插入图片描述

为什么这么做呢?
你要是直接 push 上去,没有 Dockerfile,别人不知道你的 docker 是否安全,会不会给镜像里面加病毒啊之类的,所以这样就比较公开。

如果你公司想要搭建一个私有的 docker hub,可以使用 registry
在这里插入图片描述
1、在机器A上 docker run -d -p 5000:5000 --restart always --name registry registry:2
2、在机器A上 docker ps 查看是否已经启动了这个容器,5000端口
3、在机器B上看看是否能访问到机器A的5000端口:telnet A的ip 5000yum install telnet
4、docker build -L 10.75.44.222:5000/hello-world .,完事查看 docker image ls
5、docker push 10.75.44.222:5000/hello-world 现在是不成功的,需要配置
6、sudo more /etc/docker/daemon.json { "insecure-registries": ["10.75.44.222:5000"] }
7、sudo vim /lib/systemd/system/docker.service EnvironmentFile=-/etc/docker/daemon.json
8、sudo service docker restart
9、docker push 10.75.44.222:5000/hello-world 现在是成功的
10、验证是否push成功,https://docs.docker.com/registry/

镜像加标签

docker tag 860c279d2fec zy/centos:dev

使用 docker images 可以看到多了个 dev 标签

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lvan的前端笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值