- 容器生态系统:
- 容器核心技术:
- 容器规范:
- 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一起提供容器编排引擎。
- 容器管理平台:在容器编排引擎之上的一个更为通用的平台。
- 基于容器的Paas:
- 容器支持技术:
- 容器网络:
- docker network:
- none
- host
- bridge
- joined container
- overlay
- macvian
- flannel
- weave
- calico
- 服务发现:
- 监控:
- docker ps/top/stats:Docker原生命令行监控工具
- docker stats API
- sysdig
- cAvisor/Heapster
- Weave Scope
- 数据管理:
- 日志管理:
- 安全性:
特性 |
集装箱 |
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镜像:提供一个基本的操作系统环境,用户可以根据需要安装和配置软件。
- 不依赖其他镜像,从scratch构建;
- 其他镜像可以以之为基础进行扩展。
能称为base镜像的通常是各种Linux发行版的Docker镜像,比如Ubuntu、Debian、CentOS等。
构建镜像:
docker commit包含三个步骤:
- 运行容器
- 修改容器
- 将容器保存为新的镜像
Dockerfile构建镜像的步骤:
- 从base镜像运行一个容器
- 执行一条指令,对容器做修改
- 执行类似docker commit的操作,生成一个新的镜像层
- Docker再基于刚刚提交的镜像运行一个新容器
- 重复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
|