容器

什么是 Docker ?

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroupnamespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。

Docker 架构图

虚拟机 vs 容器

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

基本概念

镜像

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像文件可以看作是容器的模板,只有通过这个文件,才能生成 Docker 容器。

容器

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 实例 一样,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间

仓库

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

一个 Docker Registry 中可以包含多个 仓库Repository);每个仓库可以包含多个 标签Tag);每个标签对应一个镜像,我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。

Docker 官方仓库,由于某些原因,在国内访问这些服务可能会比较慢,国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器,例如 阿里云加速器。国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓库网易云镜像服务DaoCloud 镜像市场阿里云镜像库 等。

Dockerfile

Docker 根据该文件生成二进制的镜像文件。

1
2
3
FROM java:8
ADD /mall-admin-1.0-SNAPSHOT.jar //
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod","/mall-admin-1.0-SNAPSHOT.jar"]

常用命令

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
26
27
28
29
30
31
32
33
34
$ systemctl start docker  // 启动docker
$ systemctl stop docker // 关闭docker
$ docker restart xx // 重启一个容器
$ docker stop xx // 停止一个容器
$ docker rm xx // 删除一个容器
$ docker rm -f xx // 强制删除一个容器
$ docker log xx // 查看容器日志

# 镜像相关
docker images:列出已经下载的镜像
docker rmi java:删除本地镜像
docker build:构建镜像
docker search java:在Docker Hub(或阿里镜像)仓库中搜索关键字(如java)的镜像
docker pull java:8:从仓库中下载镜像,若要指定版本,则要在冒号后指定

# 容器相关
docker ps:列出运行中的容器
docker ps -a :列出所有的容器
docker stop 容器id:停止容器
docker kill 容器id:强制停止容器
docker start 容器id:启动已停止的容器
docker inspect 容器id:查看容器的所有信息
docker container logs 容器id:查看容器日志
docker top 容器id:查看容器里的进程
docker exec -it 容器id /bin/bash:进入容器
exit:退出容器
docker rm 容器id:删除已停止的容器
docker rm -f 容器id:删除正在运行的容器

docker run -d -p 91:80 nginx :在后台运行nginx,若没有镜像则先下载,并将容器的80端口映射为宿主机的91端口。
-d:后台运行
-P:随机端口映射
-p:指定端口映射
-net:网络模式

学习资源

深入剖析 Kubernetes

Docker 从入门到实践