Docker 读书笔记(一) 镜像

  • 一个没有任何父镜像镜像,称之为基础镜像
  • 镜像ID
所有镜像都是通过一个64位十六进制字符串来标识的,为简化使用,前12个字符可以组成一个短id,可以在命令行中使用。
  • 获取镜像
可以使用docker pull命令从仓库获取所需要的镜像

docker pull ubuntu:12.04

该命令实际相当于 docker pull registry.hub.docker.com/ubuntu:12.04

即从注册服务器registry.hub.docker.com中的ubuntu仓库下载标记为12.04的镜像
获取镜像后,可随时使用该镜像,例如创建一个容器,并在其中运行bash

docker run -t -i ubuntu:12.04 /bin/bash
root@fe7fc4bd8fc9:/#
  • 列出本地镜像
docker images

REPOSITORY       TAG      IMAGE ID      CREATED      VIRTUAL SIZE  
ubuntu           12.04    74fe38d11401  4 weeks ago  209.6 MB 
ubuntu           precise  74fe38d11401  4 weeks ago  209.6 MB 
ubuntu           14.04    99ec81b80c55  4 weeks ago  266 MB 
ubuntu           latest   99ec81b80c55  4 weeks ago  266 MB 
ubuntu           trusty   99ec81b80c55  4 weeks ago  266 MB 
... 

信息字段含义:

  • 来自于哪个仓库,比如ubuntu
  • 镜像的标记,比如14.04
  • 它的ID号(唯一)
  • 创建时间
  • 镜像大小

PS:如果镜像ID一致,则说明它们实际上是同一镜像,比如14.04,lastest,trusty是同一个镜像

TAG信息用来标记来自同一个仓库的不同镜像。例如ubuntu仓库中有多个镜像,通过TAG来区分发行版本,如10.04,12.04,12.10等。如果要使用ubuntu14.04来启启动容器

  • 使用镜像启动容器
docker run -it ubuntu:14.04 /bin/bash
  • 创建镜像
    1. 可以从Docker Hub获取已有镜像并更新
    2. 可以利用本地文件系统创建一个
  • 修改已有镜像
docker run -it training/sinatra /bin/bash
root@0b2616b0e5a8:/

0b2616b0e5a8 为容器ID

root@0b2616b0e5a8:/#gem install json //安装json

docker commit 命令提交更新后的副本

docker commit -m "Added json" -a "Docker Newbee" 0b2616b0e5a8 outuser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c (新的镜像id)


-m 用来指定提交说明信息, 类似git commit -m
-a 指定更新的用户信息;之后是用来创建镜像的容器ID
最后指定目标镜像的仓库名(outuser)和tag(sinatra:v2)信息。创建成功后会返回这个镜像ID信息
  • 利用Dockerfile创建镜像

使用docker commit 来扩展一个镜像比较简单,但是不方便一个团队分享。可以使用docker build 来创建一个新的镜像。为此,首先需要创建一个Dockerfile,包含一些如何创建镜像的指令。

  • 1. 新建一个目录和一个Dockfile
mkdir sinatra
cd sinatra
touch Dockfile
  • 2. Dockerfile中每一条指令都创建镜像的一层,例如:
From ubuntu:14.04
MAINTAINER Docker Newbee <newbee@docker.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra
Dockerfile基本的语法是

1.使用#来注释
2.FROM 指令告诉Docker使用哪个镜像作为基础
3.接着是维护者的信息
4.RUN开关的指令会在创建中运行,比如安装一个软件包,在这里使用apt-get来安装一些软件
  • 3. 编写Dockerfile后可以使用docker build 来生成镜像
docker build -t="ouruser/sinatra:v2"

-t 标记来添加tag,指定新的镜像的用户信息。
“.” 是Dockerfile所在的路径(当前目录),也可以替换为一个具体的Dockerfile的路径。

docker build 进程在执行操作,它要做的第一件事就是上传这个Dockerfile内容,因为所有的操作都要依据Dockerfile来进行。然后,Dockerfile中指令被一条一条的执行。每一步都创建了一个新容器,在容器中执行指令并提交修改(就跟之前介绍过的docker commit一样)。当所有的指令都执行完毕之后,返回了最终的镜像id。所有的中间步骤所产生的容器都被删除和清理了。

PS: 注意一个镜像不能超过127层

Dockerfile 命令说明:
1. ADD 命令复制本地文件到镜像;
2. 用EXPOSE命令来向外开放端口;
3. 用CMD命令来描述容器启动后运行的程序等。

  • docker tag 命令来修改镜像的标签
  • 上传镜像
docker push ouruser/sinatra  把自己创建的镜像上传到仓库中来共享
  • docker save 导出镜像到本地文件
  • 载入镜像 docker load 从导出的本地文件中再导入到本地镜像库
  • 移出本地镜像 docker rmi
  • 镜像的实现原理
每个docker镜像都由很多层构成,Docker使用Union FS将这些不同的层结合到一个镜像中去

通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID将多个 disk 挂到同一个目录下,另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起,Live CD 正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作。 Docker 在 AUFS 上构建的容器也是利用了类似的原理
  • 镜像仓库地址设置
国内访问 Docker 的官方仓库很慢,还经常断线,所以要把仓库网址改成国内的镜像站。这里推荐使用官方镜像 registry.docker-cn.com

Docker中国官方镜像加速
--registry-mirror=https://registry.docker-cn.com
网易163镜像加速
--registry-mirror=http://hub-mirror.c.163.com
中科大镜像加速
--registry-mirror=https://docker.mirrors.ustc.edu.cn
阿里云镜像加速
--registry-mirror=https://{your_id}.mirror.aliyuncs.com
daocloud镜像加速
--registry-mirror=http://{your_id}.m.daocloud.io 

1.创建目录 mkdir -p /etc/docker
2.编辑/etc/docker/daemon.json文件,并输入国内镜像源地址
eg:

{
    "registry-mirrors": ["https://registry.docker-cn.com"]
}