一、docker镜像和仓库简介
镜像是docker世界的基石,docker镜像是由文件系统叠加而成,如下图所示:
最底端是一个引导文件系统即bootfs,docker用户几乎永远不会和引导文件系统有什么交互,docker镜像的第二层是root文件系统rootfs,它位于引导文件系统之上。rootfs可以是一种或多种操作系统(如debian或ubuntu文件系统)。docker将这样的文件系统称为镜像。一个镜像可以放到另一个镜像顶部,位于下面的镜像称为父镜像。最底部的镜像称为基础镜像。当启动一个容器时,docker会在该镜像的最顶层,加载一个读写文件系统,我们想在docker中运行的程序就是在这个读写层执行的。
使用docker images命令可以查看docker主机上可用的镜像。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
daocloud.io/library/ubuntu latest f49eec89601e 6 weeks ago 129 MB
daocloud.io/library/ubuntu 13.04 a58cd502f927 2 years ago 169 MB
这两个镜像都来自一个名为daocloud.io/library/ubuntu的远程仓库,这些镜像是从远程仓库下载下来的,镜像保存在仓库中,而仓库存在于Registry中,默认的Registry是由docker公司运营的公共Registry服务,即docker hub,为了区分同一个仓库中的不同镜像,docker为每个镜像打了一个标签tag,用于标识同一仓库中的不同镜像。我们可以用仓库名:tag来指定该仓库的某一镜像。
$ docker run -it --name ubuntu daocloud.io/library/ubuntu:latest /bin/bash
仓库的镜像都是由docker用户创建的,而顶层仓库则是由docker
公司和特定厂商管理。用户仓库的命名有一定的规则:仓库命名由用户名和仓库名两部分组成,如 daocloud.io/library/ubuntu
daocloud.io为用户名library/ubuntu为仓库名,而顶层仓库只包含仓库名部分如ubuntu仓库,顶层仓库由docker公司和由特定的能提供基础镜像的厂商管理,顶层仓库中的镜像是架构良好、安全且最新的。而用户仓库中的镜像并没有经过docker公司的审核,在使用这些镜像时需要用户自己承担相应的风险。
二、管理镜像的相关docker命令
1.查找镜像
使用docker search命令可以查找所有docker hub公共的可用镜像。
$ docker search puppet
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
devopsil/puppet Dockerfile for a container with puppet ins... 22 [OK]
macadmins/munki-puppet Basic munki nginx image with Puppet used f... 7 [OK]
devopsil/puppet-yum 5 [OK]
vladgh/puppet Ubuntu 16.04 LTS Base image with Puppet 2 [OK]
......
命令返回了如下信息:仓库名,镜像描述,用户评价、是否官方,自动构建(表示这个镜像是由docker hub的自动构建流程创建的),然后就可以通过docker pull命令将镜像下载到本地。
2.下载(拉取)镜像
使用docker run命令从镜像启动一个容器时,如果该镜像不在本地,docker会先从安装时指定下载镜像,如果没有指定具体的镜像tag,那么docker会自动下载latest标签的镜像。
$ docker run -it --name new_container ubuntu /bin/bash
执行上述命令后,如果本地主机上没有ubuntu:latest镜像,docker
会从docker hub中将其下载下来。我们也可以事先使用docker pull命令预先将镜像下载到本地,这样能够大大节约docker run所耗费的时间。
$ docker pull ubuntu
13.04: Pulling from library/ubuntu
a3ed95caeb02: Pull complete
727520c5e30b: Pull complete
2e8f7add78f9: Pull complete
4600be257a84: Pull complete
89d0f0874176: Pull complete
Digest: sha256:dfbeee3e3faf84f9c9fa599dadb7eaa39ae21a9342fa1b757ee7f609d77281f1
Status: Downloaded newer image for daocloud.io/library/ubuntu:13.04
三、构建镜像
之前一直使用别人制作好的镜像,我们也可以自己构建镜像,构建镜像中很重要的一步就是如何共享和发布镜像,我们可以将构建好的镜像推送到docker hub或企业内部私有Register中,为了完成共享和发布镜像,需要一个docker hub账号。
注册docker hub账号的步骤如下:
浏览器登陆:https://hub.docker.com/
填写好注册信息后,点击注册,之后要通过邮件激活。激活后登陆docker hub界面如下:
在命令行可以通过docker login命令登陆到docker hub。
$ sudo 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: 6858e8e
Password:
Login Succeeded
之后我们就可以开始构建自己的镜像了,构建docker镜像有两种方法:
a.使用docker commit命令
b.使用Dockerfile文件和docker build命令。
官方并不推荐docker commit命令,与docker commit相比,Dockerfile更加灵活、强大。不过既然是学习,最好两种方法都要知道,但是会将学习重点放在docker build命令和Dockerfile文件上。(注意:我们现在的介绍的构建镜像只是入门,不是真正的从零开始构建一个镜像,而是基于一个已有的镜像如ubuntu等)。
使用docker commit命令,与git提交代码相似,我们先创建一个容器,并在容器中做出修改,然后提交修改为一个新镜像。
注意:docker commit提交的只是创建容器的镜像和容器当前状态之间有差异的部分,这使得docker commit的提交非常轻量。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a44acfc76b70 daocloud.io/library/ubuntu "/bin/bash" 18 seconds ago Up 2 seconds ubuntu
037ed58149fc daocloud.io/jie_fly/2048:master-a2c564e "/bin/sh -c 'sed -..." 25 hours ago Up 10 minutes 0.0.0.0:32771->80/tcp, 0.0.0.0:32770->443/tcp dao_2048_1
5517741cfb2c f49eec89601e "/bin/bash -c 'whi..." 13 days ago Up 10 minutes daemon_ubuntu
$ docker exec -it ubuntu bash
root@a44acfc76b70:/#
接下来我们在容器中安装了vim编辑器。
root@a44acfc76b70:/# apt-get -y update && apt-get install vim
Get:1 http://mirrors.163.com/ubuntu xenial InRelease [247 kB]
Get:2 http://mirrors.163.com/ubuntu xenial-updates InRelease [102 kB]
.......
root@a44acfc76b70:/# vi 1.txt
root@a44acfc76b70:/# cat 1.txt
hello world!
如果我们该容器当前的状态保存为一个新镜像,这样以后就不必每次创建容器都重新安装vim了。
root@4abc3ce4ca79:/# exit
$ docker commit ubuntu jix/ubuntu
sha256:4821aa25ff0960cb9c5795526a974da2d67683f01fd96ddbfa43b7a15c892638
root$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jix/ubuntu latest 4821aa25ff09 6 seconds ago 227 MB
daocloud.io/jie_fly/2048 master-a2c564e bb8b9e037c33 26 hours ago 54.9 MB
c240abe2124c 13 days ago 123 MB
daocloud.io/library/ubuntu latest f49eec89601e 7 weeks ago 129 MB
daocloud.io/daocloud/daocloud-toolset latest 1ab33797d8a1 10 months ago 150 MB
daocloud.io/library/ubuntu 13.04 a58cd502f927 2 years ago 169 MB
可以通过 docker commit 容器名/容器id 仓库名/镜像名:标签(默认为latest),完成构建镜像。这样我们就构建出了自己的一个镜像,同样可以使用docker run命令用这个镜像创建一个容器。
$ docker images jix/ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
jix/ubuntu latest 4821aa25ff09 7 minutes ago 227 MB
$ docker run -it -d --name ubuntu_from_my_image jix/ubuntu /bin/bash
d5c60350572a254e4448316f88b1366226cad6288fe05a73125b4a571951d03c
$ docker attach ubuntu_from_my_image
root@d5c60350572a:/#
root@d5c60350572a:/# ls
1 boot etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
root@d5c60350572a:/# cat 1
hello world!
可以看到这个容器完全就是容器ubuntu的完美copy。今天就到这里,下一篇接着学习使用Dockerfile创建镜像。