当运行容器时,使用的镜像如果在本地中不存在,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 5000
(yum 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 标签