0%

《第一本Docker书》读书笔记 第4章 使用Docker镜像和仓库

什么是Docker镜像

Docker镜像是由文件系统叠加而成。

列出镜像

1
2
docker images
docker images ubuntu

拉取镜像

1
docker pull fedora:20

如果本地说主机上还没有ubuntu:lastest镜像,docker run会先拉取镜像

1
docker run -it --name xx ubuntu /bin/bash

查找镜像

1
docker search puppet

构建镜像

构建Docker镜像有两种方法:

  • 使用docker commit命令
  • 使用docker build名利给和Dockerfile文件

创建Docker Hub账号

为了共享和发布镜像,可以将镜像推送到Docker Hub或用户自己的私有Registry。为了完成这项工作,需要先在Docker Hub上创建一个账号。

然后可以使用docker login登录到Docker Hub

1
2
3
4
5
$ docker login
Username: xxx
Password:
Email: xx@xx.com
Login Successed

可以使用docker logout命令从一个Registry服务器退出。

用Docker的commit命令创建镜像

创建一个容器

1
docker run -it ubuntu /bin/bash

安装Apache软件包

1
2
apt-get -yqq update
apt-get -y install apache2

先用exit命令从容器中退出,再运行docker commit命令

1
docker commit 4aab3ce3cd76 mofei/apache2

查看新创建的镜像

1
docker images mofei/apache2

用Dockerfile构建镜像

Dockerfile使用基本的基于DSL(Domain Specific Language)语法的指令来构建一个Docker镜像,这种方式构建镜像比docker commit方式更具备可重复性,透明性以及幂等性。

创建一个目录并在里面创建初始的Dockerfile

1
2
3
mkdir static_web
cd static_web
touch Dockerfile

static_web目录是构建环境,Docker称此环境为上下文或者构建上下文。

然后在Dockerfile中写入以下内容:

1
2
3
4
5
FROM ubuntu:14.04
MAINTAINER mofei mofei@xx.com
RUN apt-get update && apt-get install -y nginx
RUN echo 'hi, i am in your container' > /usr/share/nginx/html/index.html
EXPOSE 80

Dockerfile由一系列指令组成,每条指定会创建一个新的镜像层并对镜像镜像提交。

Docker大体上按照如下流程执行Dockerfile中的指令:

  • Docker从基础镜像运行一个容器
  • 执行一条指令,对容器做出修改
  • 执行类似docker commit的操作,提交一个新的镜像层
  • Docker再基于刚提交的镜像运行一个新容器
  • 执行Docker中的下一条指令,直到所有指令都执行完毕

从上面可以看出,如果Dockerfile由于某些原因没有正常结束,那么用户将得到一个可以使用的镜像。这对调试非常有帮助。可以基于该镜像运行一个具备交互功能的容器,然后对失败的指令镜像调试。

基于Dockerfile构建新镜像

1
docker build -t="mofei/static_web" .

也可以在构建镜像时为镜像指定一个标签(不指定的话,默认为lastest标签)

1
docker build -t="mofei/static_web:v1" .

从镜像仓库构建Docker镜像

1
docker build -t="mofei/static_web:v1" git@github.com:mofei/docker-static_web