司开星的博客

Docker 入门笔记

概念

Docker是什么

Docker 类似于轻量的虚拟机,但与虚拟机模拟出一个完整操作系统不同,Docker 主要关注点是提供应用运行所需的最小环境。两者的结构区别如下:

虚拟机:

即虚拟机控制器在宿主机操作系统上虚拟出一套硬件并在其上建立完整的 Guest OS以及一些依赖库。如果你只想在一个独立环境中运行一个程序,用虚拟机的代价比较高。

Docker:

Docker 的结构中没有 Guest OS 一层,仅提供软件运行的必需库,磁盘占用比虚拟机少,新建速度也快。

Docker没有Guest OS却能提供类似虚拟机的独立且不同的运行环境,主要有两方面原因:1. 共享宿主机Linux kernel( Windows 和 macOS 环境的 Docker 使用虚拟机的方式运行 Linux kernel);2. 使用 Linux kernel 提供的几种隔离机制。具体细节本文不讨论,有兴趣的可以查阅相关资料。

Docker 基本概念

容器 container

在 docker 中运行的独立环境。

镜像 image

容器运行所需的文件实体,里面包含了程序,库,配置等内容。

仓库 Registry

统一放镜像的地方。默认使用官方提供的仓库。

使用

安装

直接根据官方教程安装即可。

运行

终端下输入:

docker

会显示docker的简要帮助。运行容器的命令为docker run,尝试运行ubuntu容器下的ps -ef命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>>docker run ubuntu ps -ef
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
latest: Pulling from library/ubuntu
660c48dd555d: Pull complete
4c7380416e78: Pull complete
421e436b5f80: Pull complete
e4ce6c3651b3: Pull complete
be588e74bd34: Pull complete
Digest: sha256:7c67a2206d3c04703e5c23518707bdd4916c057562dd51c74b99b2ba26af0f79
Status: Downloaded newer image for ubuntu:latest
UID PID PPID C STIME TTY TIME CMD
root 1 0 6 10:15 ? 00:00:00 ps -ef

运行容器需要先指定镜像,此处ubuntu就是我们指定的镜像名,由于本地没有这个镜像,docker 默认从官方源下载了lastest版本的ubuntu镜像。下载完成后直接执行后面的ps -ef命令。

可以通过docker images命令查看本地已有的镜像。

要单独安装镜像可使用以下命令:

docker pull ubuntu

如果想进入容器中的交互环境可以加上 -it 参数:

docker run -it ubuntu bash

定制镜像

前面安装的都是官方镜像,且容器运行结束后就会自动删除,不会保留修改。如果要将当前容器中的修改保存到镜像中可以通过docker commit命令,但这种方式可能会附带很多垃圾文件,一般用Dockerfile定制镜像。Dockerfile是一个脚本文件,里面记录了你需要在基础镜像上做的修改操作。

此处直接使用参考资料中的示例,构建一个带redisdebian镜像。新建一个目录debianredis,里面新增文件Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
FROM debian:jessie

RUN buildDeps='gcc libc6-dev make' \

&& apt-get update \

&& apt-get install -y $buildDeps \

&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \

&& mkdir -p /usr/src/redis \

&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \

&& make -C /usr/src/redis \

&& make -C /usr/src/redis install \

&& rm -rf /var/lib/apt/lists/* \

&& rm redis.tar.gz \

&& rm -r /usr/src/redis \

&& apt-get purge -y --auto-remove $buildDeps

其中FROM指定了基础镜像,RUN表明需运行的命令。RUN中使用&&符号连接多条bash命令是为了减少构建层,多条rm命令则是清理垃圾文件以减少镜像体积。

用以下命令构建镜像:

docker build -t debianredis .

docker会直接使用指定环境(此处为. 即当前目录)下的Dockerfile构建镜像。

以下命令可以将镜像打包为tar方便传输:

docker save debianredis | gzip > debianredis-latest.tar.gz

将打包好的tar文件传输到其他机器,再使用以下命令载入:

docker load -i debianredis

即可看到刚刚构建的镜像。

参考资料:

  1. Docker —— 从入门到实践
  2. 一篇不一样的docker原理解析