Docker笔记

Catalogue   
  • 容器生态系统:
    • 容器核心技术:
      • 容器规范:
        • OCI(Open Container Initiative):
          • runtime spec
          • image format spec
      • 容器runtime:
        • lxc:Linux上老牌的容器runtime,Docker最初也是用lxc作为runtime
        • runc:Docker自己开发的容器runtime,符合oci规范,也是现在Docker默认的runtime
        • rkt:CoreOS开发的容器runtime
      • 容器管理工具:
        • lxd:lxc对应的管理工具
        • runc:docker engine,包含后台deamon和cli两部分。
        • rkt cli:rkt对应的管理工具
      • 容器定义工具:允许用户定义容器的内容和属性,这样容器就能够被保存、共享和重建
        • docker image:Docker容器的模板,runtime依据docker image创建容器。
        • dockerfile:包含若干命令的文本文件,可以通过这些命令创建出docker image。
        • ACI(App Container Image):CoreOS开发的rkt容器的image格式。
      • Registries:存放image的仓库
        • Docker Registry:企业可以用Docker Registry构建私有的Registry
        • Docker Hub:Docker为公众提供的托管Registry
        • Quay.io
      • 容器OS:专门运行容器的操作系统,与常规OS相比,容器OS体积更小,启动更快。
        • coreos
        • atomic
        • ubuntu core
    • 容器平台技术:
      • 容器编排引擎:
        • docker swarm:Docker开发的容器编排引擎。
        • kubernetes:Google领导开发的,同时支持Docker和CoreOS容器。
        • mesos+marathon:通用的集群资源调度平台,mesos与marathon一起提供容器编排引擎。
      • 容器管理平台:在容器编排引擎之上的一个更为通用的平台。
        • Rancher
        • ContainerShip
      • 基于容器的Paas:
        • Deis
        • Flynn
        • Dokku
    • 容器支持技术:
      • 容器网络:
        • docker network:
          • none
          • host
          • bridge
          • joined container
          • overlay
          • macvian
        • flannel
        • weave
        • calico
      • 服务发现:
        • etcd
        • consul
        • zookeeper
      • 监控:
        • docker ps/top/stats:Docker原生命令行监控工具
        • docker stats API
        • sysdig
        • cAvisor/Heapster
        • Weave Scope
      • 数据管理:
        • Rex-Ray
      • 日志管理:
        • docker logs
        • logspout
      • 安全性:
        • OpenSCAP
特性 集装箱 Docker
打包对象 几乎任何物品 任何软件及其依赖
标准形状和接口允许集装箱被卸载到 各种交通工具,整个运输过程无需打开 容器无需修改便可运行在几乎所有的平台
隔离性 可以重叠起来一起运输 资源、网络、库都是隔离的,不会出现依赖问题
自动化 标准接口使集装箱很容易自动装卸和移动 提供run、start、stop等标准化操作
高效性 无须开箱 轻量级
职责分工 货主只需要考虑把什么放到集装箱 开发人员只需要考虑怎么写代码,运维只需关心如何配置基础环境

Docker核心组件

  • Docker客户端:Client
  • Docker服务器:Docker daemon,负责创建、运行、监控容器,构建、存储镜像。
  • Docker镜像:Image
  • Registry:镜像仓库
  • Docker容器:Container

镜像(Image)

一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后不会改变。

常用镜像

1
2
3
4

Docker 图形管理工具
docker run -d -p 9001:9000 -v "/var/run/docker.sock:/var/run/docker.sock" portainer/portainer

容器(Container)

镜像和容器的关系,就像是面对对象程序设计中的类和实例一一样,镜像是静态的定义,容器是镜像运行的实体。容器可以被创建、启动、停止、删除、暂停等。 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。

基本用法

1
2
3
4
5
6
7
8
9
10

拉取最小的镜像
docker pull hello-world

查看镜像
docker image ls

运行镜像
docker run hello-world

hello-world镜像的内容

1
2
3
FROM scratch  # 从0开始构建
COPY hello /
CMD ["/hello"]

base镜像:提供一个基本的操作系统环境,用户可以根据需要安装和配置软件。

  1. 不依赖其他镜像,从scratch构建;
  2. 其他镜像可以以之为基础进行扩展。

能称为base镜像的通常是各种Linux发行版的Docker镜像,比如Ubuntu、Debian、CentOS等。

构建镜像:

docker commit包含三个步骤:

  1. 运行容器
  2. 修改容器
  3. 将容器保存为新的镜像

Dockerfile构建镜像的步骤:

  1. 从base镜像运行一个容器
  2. 执行一条指令,对容器做修改
  3. 执行类似docker commit的操作,生成一个新的镜像层
  4. Docker再基于刚刚提交的镜像运行一个新容器
  5. 重复2-4步,直到Dockerfile中的所有指令执行完毕。

Dockerfile实例

1
2
FROM ubuntu
RUN apt-get update && apt-get install -y vim

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
指定base镜像
FROM


设置镜像的作者
MAINTSINER


从src目录复制文件到容器的dest,其中src可以是Dockerfile所在目录的相对路径,也可以是一个URL。如果src是归档文件,文件会被自动解压到dest
ADD <src>... <dest>

设置构建时的环境变量,在容器运行时是不会存在这些变量的。
ARG <name>[=<default value>]

CMD指令指定容器启动运行指定的命令,
* 如果docker run指定了其他命令,CMD指定的默认命令将被忽略。
* 每个Dockerfile可以有多个CMD,但只有最后一个生效。
CMD ["nginx", "-g", "daemon off"]

复制文件
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

设置容器启动时运行的命令,可以有多个ENTRYPOINT指令,但只有最后一个生效。CMD或docker run之后的参数会被当做参数传递给ENTRYPOINT。
ENTRYPOINT

设置环境变量
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

声明在运行时容器提供服务的端口
EXPOSE <port> [<port>...]


LABEL 为镜像添加元数据
LABEL version="1.0"

运行指定的命令,并创建新的镜像层,经常用于安装软件包。
RUN <command>
RUN ["executable", "param1", "param2"]

USER设置用户

VOLUME指定挂载点

指定工作目录
WORKDIR

容器暴露端口
EXPOSE

常用命令

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104

* attach:依附到一个正在运行的容器中;
* build:从一个 Dockerfile 创建一个镜像;
* commit:从一个容器的修改中创建一个新的镜像;
* cp:在容器和本地宿主系统之间复制文件中;
* create:创建一个新容器,但并不运行它;
* diff:检查一个容器内文件系统的修改,包括修改和增加;
* events:从服务端获取实时的事件;
* exec:在运行的容器内执行命令;
* export:导出容器内容为一个 tar 包;
* history:显示一个镜像的历史信息;
* images:列出存在的镜像;
* import:导入一个文件(典型为 tar 包)路径或目录来创建一个本地镜像;
* info:显示一些相关的系统信息;
* inspect:显示一个容器的具体配置信息;
* kill:关闭一个运行中的容器 (包括进程和所有相关资源);
* load:从一个 tar 包中加载一个镜像;
* login:注册或登录到一个 Docker 的仓库服务器;
* logout:从 Docker 的仓库服务器登出;
* logs:获取容器的 log 信息;
* network:管理 Docker 的网络,包括查看、创建、删除、挂载、卸载等;
* node:管理 swarm 集群中的节点,包括查看、更新、删除、提升/取消管理节点等;
* pause:暂停一个容器中的所有进程;
* port:查找一个 nat 到一个私有网口的公共口;
* ps:列出主机上的容器;
* pull:从一个Docker的仓库服务器下拉一个镜像或仓库;
* push:将一个镜像或者仓库推送到一个 Docker 的注册服务器;
* rename:重命名一个容器;
* restart:重启一个运行中的容器;
* rm:删除给定的若干个容器;
* rmi:删除给定的若干个镜像;
* run:创建一个新容器,并在其中运行给定命令;
* save:保存一个镜像为 tar 包文件;
* search:在 Docker index 中搜索一个镜像;
* service:管理 Docker 所启动的应用服务,包括创建、更新、删除等;
* start:启动一个容器;
* stats:输出(一个或多个)容器的资源使用统计信息;
* stop:终止一个运行中的容器;
* swarm:管理 Docker swarm 集群,包括创建、加入、退出、更新等;
* tag:为一个镜像打标签;
* top:查看一个容器中的正在运行的进程信息;
* unpause:将一个容器内所有的进程从暂停状态中恢复;
* update:更新指定的若干容器的配置信息;
* version:输出 Docker 的版本信息;
* volume:管理 Docker volume,包括查看、创建、删除等;
* wait:阻塞直到一个容器终止,然后输出它的退出符。


进入容器的方式:
docker attach:

直接进入容器启动命令的终端,不会启动新的进程。
docker exec -it <container> bash|sh


docker run

参数:
-d:后台运行
-P:随机端口映射
-p:指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
-network:指定网络模式,有以下可选参数:
-network=brigde 默认选项,表示连接默认的网桥。
-network=host 容器使用宿主主机的网络
-network=container:NAME_or_ID 告诉DOcker让新建的容器使用以有容器的网络配置
-network=none 不配置该容器的网络,用户可自定义网络配置



查看运行的容器
docker ps

停止容器
docker stop

强制停止容器
docker kill

进入容器
docker attach

进入启动的容器交互界面
docker exec -it container-id bash

删除容器
docker rm

导出容器
docker export red_panda > lastest.tar

导入容器
docker import nignx2.tar nginx


docker rm $(docker ps -q -f status=exited)
docker rmi $(docker images -q -f dangling=true)

进入正在运行的容器,39表示容器id前面几位
docker exec -it 39 /bin/bash