Docker官网

什么是docker

Docker是一个应用容器引擎,开发者可以将应用程序以及其依赖放到一个容器中,该容器可以移植到任何linux操作系统上。

Docker解决了应用程序移植困难的问题,传统的应用从一个系统搬到另一个系统往往需要考虑编译器的版本问题以及其他依赖库的问题,这些问题比较繁琐而且影响开发效率。Docker就提供了避免移植问题出现的解决方案,一处部署,到处运行。Docker在linux操作系统之上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。

Docker实现的原理是linux内核的资源分离机制,例如cgroups以及namespace等,来创建独立的容器。

Docker基本命令

查找镜像:docker search [filename]

从docker索引中心下载:docker pull [filename]

查看本地镜像:docker images

查看所有容器:docker ps -a(包含已停止的容器)

查看容器标准输出:docker logs [continerID]

停止容器:docker stop [continerID]

查看容器底层信息:docker inspect [containerID]

提交修改:docker commit

删除镜像:docker rmi [img name:tag]

通过Dockerfile创建镜像:docker build -t [img name:tag] [dockerfile path]

Docker的简单使用场景

从docker索引中心下载Ubuntu并运行

下载镜像

1
$docker pull ubuntu:14.04

查看已下载的镜像

1
$docker images

创建一个容器

1
$docker run -i -t ubuntu /bin/bash

上面命令运行成功后即进入了ubuntu镜像系统的bash,在新系统的shell中执行exit命令即可退出。

在宿主机的另一个终端上执行以下命令可查看当前运行的容器:

1
$docker ps

构建自己的Docker镜像

镜像的官网解释如下:An image is an executable package that includes everything needed to run an application–the code, a runtime, libraries, environment variables, and configuration files.

Docker镜像有两种构建方法,一种是在一个docker镜像基础上修改和commit,生成新的镜像,另一种是通过Dockerfile创建。这里实验使用Dockerfile通过空白镜像构建一个简单的helloworld的docker镜像。

首先使用ldd命令查看hello程序所需的运行库:

1
2
3
4
5
$ldd hello

​ linux-vdso.so.1 (0x00007ffc171f4000)
​ libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f197b10a000)
​ /lib64/ld-linux-x86-64.so.2 (0x00007f197b4f0000)

接着创建一个目录,在该目录下建立运行环境目录,并拷贝这些库和hello程序以及bash环境到相应目录。然后在该目录下构建一个Dockerfile文件,完成这些操作后的整个目录结构使用tree命令查看如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$tree . -F

.
├── Dockerfile
├── bin/
│ ├── bash*
│ └── sh*
├── lib/
│ └── x86_64-linux-gnu/
│ ├── libc.so.6*
│ ├── libdl.so.2
│ └── libtinfo.so.5
├── lib64/
│ └── ld-linux-x86-64.so.2*
└── usr/
└── bin/
└── hello*

6 directories, 8 files

Dockfile文件的内容如下:

1
2
3
4
#Hello-Dockerfile注释用#开头  
FROM scratch
COPY . /
ENTRYPOINT /usr/bin/hello

Dockerfile的一些简单语法说明如下:

FROM表示从哪个镜像开始创建,基于哪个镜像创建新镜像。

MAINTAINER表示作者信息。

ADD表示添加文件,将hello添加到容器的/路径下。

CMD表示容器启动的时候执行的命令。

COPY . /表示将当前目录拷贝到镜像的/路径下

ENTRYPOINT /usr/bin/hello表示该镜像创建容器时执行的程序

使用以下命令创建镜像,‘.’表示Dockerfile所在路径为当前路径

1
$docker build -t hello:0.1 .

查看是否创建成功

1
$docker images

创建hello的容器,即可看到hello的执行结果。

1
$docker run hello:0.1

Docker镜像打包和还原

有时候我们希望从本地移动docker镜像而不是通过pull来拉取,这时候我们可能需要打包本地镜像,然后以普通文件的方式拷贝或上传/下载该镜像到其他docker主机,并在其他主机还原该镜像。

使用以下命令打包一个本地的Ubuntu:14.04镜像为ubuntu14.tar:

1
$docker save -o ubuntu14.tar ubuntu:14.04

在其他主机可以用以下命令还原该Ubuntu镜像:

1
$docker load < ubuntu14.tar

还原后可通过docker images命令查看是否成功。