您的位置:首页 > 运维架构 > Docker

docker学习之docker镜像

2017-03-13 22:07 375 查看
一、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
<none>                                  <none>              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创建镜像。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: