Docker架构
1、什么是docker
是一个平台,是构建、测试、部署和发布容器化应用的平台。Docker 是一个开 源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的 容器中,然后发布到任何流行的linux机器或Windows 机器上,也可以实现虚拟 化,容器是完全使用沙箱机制,相互之间不会有任何接口
2、基本概念
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。Docker 镜像是用于创建 Docker 容器的模板
容器(Container):容器是独立运行的一个或一组应用,是镜像运行时的实体
仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
docker客户端:Docker 客户端通过命令行或者其他工具使用 Docker SDK 与 Docker 的守护进程通信
docker namespace:docker通过命名空间实现资源容器与容器,与宿主机间的隔离。
-
网络:docker 提供四种不同的网络模式,Host、Container、None 和 Bridge
-
默认网络设置Bridge.在这种模式下,除了分配隔离的网络命名空间之外,Docker 还会为所有的容器设置 IP 地址。当 Docker 服务器在主机上启动之后会创建新的虚拟网桥 docker0,随后在该主机上启动的全部服务在默认情况下都与该网桥相连。在默认情况下,每一个容器在创建时都会创建一对虚拟网卡,两个虚拟网卡组成了数据的通道,其中一个会放在创建的容器中,会加入到名为 docker0 网桥中。查看brctl show
image.png
-
- 挂载点
3、docker工作原理
docker使软件开发者无需担心配置和依赖性,在任何地方打包,发送和运行他们的应用程序。
- image.png
Cgroups(Control Groups): 实现资源限制
工作原理简单来说就是它的架构形式,client -- dockerhost -- docker daemon - registry
4、docker架构
- Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器
- Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信
- docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
- image.png
docker与VMware对比
- image.png
-
VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;
Container(Docker容器),在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。
Docker在宿主机器的操作系统上创建Docker引擎,直接在宿主主机的操作系统上调用硬件资源,而不是虚拟化操作系统和硬件资源
docker常用命令
命令 | 描述 | 语法 | 常用选项 |
---|---|---|---|
docker run | 创建一个新的容器并运行一个命令 | docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
-d: 后台运行容器,并返回容器ID; -i: 以交互模式运行容器,通常与 -t 同时使用,-t: 为容器重新分配一个伪输入终端; -P:随机端口映射,容器内部端口随机映射到主机的高端口 -p: 指定端口映射,格式为:主机(宿主)端口:容器端口 --name="nginx-lb": 为容器指定一个名称; 更多选项参考:https://www.runoob.com/docker/docker-run-command.html |
docker start /stop /restart |
启动/停止/重启一个容器 | docker start/ stop/restart [OPTIONS] CONTAINER [CONTAINER...] |
|
docker kill | 杀掉一个运行中的容器 | docker kill [OPTIONS] CONTAINER [CONTAINER...] | -s :向容器发送一个信号 |
docker rm | 删除一个或多个容器 | docker rm [OPTIONS] CONTAINER [CONTAINER...] |
-f :通过 SIGKILL 信号强制删除一个运行中的容器。 -v :删除与容器关联的卷 |
docker pause/uppause | 暂停或恢复容器中所有的进程 | ||
docker create | 创建一个新的容器但不启动它 | docker create [OPTIONS] IMAGE [COMMAND] [ARG...] | 用法同docker run |
docker exec | 在运行的容器中执行命令 | docker exec [OPTIONS] CONTAINER COMMAND [ARG...] |
-i :即使没有附加也保持STDIN 打开 -t :分配一个伪终端 eg :docker exec -i -t mynginx /bin/bash |
docker ps | 列出容器 | docker ps [OPTIONS] |
-a :显示所有的容器,包括未运行的。 -q :静默模式,只显示容器编号。 -n :列出最近创建的n个容器。 -l :显示最近创建的容器。 |
docker inspect | 获取容器/镜像的元数据。 | docker inspect [OPTIONS] NAME|ID [NAME|ID...] | |
docker top | 查看容器中运行的进程信息,支持 ps 命令参数 | docker top [OPTIONS] CONTAINER [ps OPTIONS] | |
docker attach | 连接到正在运行中的容器 | docker attach [OPTIONS] CONTAINER | |
docker events | 从服务器获取实时事件 | docker events [OPTIONS] | |
docekr logs | 获取容器的日志 | docker logs [OPTIONS] CONTAINER |
-f : 跟踪日志输出 --since :显示某个开始时间的所有日志 -t : 显示时间戳 --tail :仅列出最新N条容器日志 eg: docker logs --since="2016-07-01" --tail=10 mynginx |
docker export | 将文件系统作为一个tar归档文件导出到STDOUT | docker export [OPTIONS] CONTAINER | -o :将输入内容写到文件 |
docker port | 列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口 | docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]] | |
docker commit | 从容器创建一个新的镜像 | docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] | |
docker cp | 用于容器与主机之间的数据拷贝 | docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH |
-L :保持源目标中的链接 |
docker diff | 检查容器里文件结构的更改 | ||
docker login/logout | 登陆到一个Docker镜像仓库 | ||
docker pull/push/search | |||
docker images | 列出本地镜像 | docker images [OPTIONS] [REPOSITORY[:TAG]] |
-a :列出本地所有的镜像 -f :显示满足条件的镜像 -q :只显示镜像ID。 |
docker rmi | 删除本地一个或多少镜像 | docker rmi [OPTIONS] IMAGE [IMAGE...] | -f :强制删除; |
docker tag | 标记本地镜像,将其归入某一仓库 | ocker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] | |
docker build | 命令用于使用 Dockerfile 创建镜像 | docker build [OPTIONS] PATH | URL | - |
-f :指定要使用的Dockerfile路径 --tag, -t: 镜像的名字及标签 其他限制选项参考:https://www.runoob.com/docker/docker-build-command.html |
docker history | 查看指定镜像的创建历史 | ||
docker save | 将指定镜像保存成 tar 归档文件 | ||
docker load | 导入使用docker save 命令导出的镜像 | docker load [OPTIONS] | -i : 指定导入的文件 |
docker import | 从归档文件中创建镜像 | docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] |
-c :应用docker 指令创建镜像; -m :提交时的说明文字; |
docker info | 显示 Docker 系统信息,包括镜像和容器数 | ||
docker version | 显示 Docker 版本信息 |
Dockerfile
1、什么是dockerfile
- Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取
Dockerfile
中的指令自动生成映像。 - Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
2、Dockerfile 常用语法
语法 | 描述 |
---|---|
FROM <IMAGE> | 镜像制作的基镜像,必须为第一个命令 |
MAINTAINER | 维护者信息 |
RUN <SHELL COMMAND> | 用于在镜像容器中执行命令 |
ADD <src> <dest> | 将本地文件添加到容器中,tar类型文件会自动压,可访问网络文件,不能用于多阶段构建中 |
COPY <src> <dest> | 将本地文件添加到容器中,但不会自动解压文件,也不能访问网络文件,能用于多阶段构建中mutli-stage |
CMD ["","",...] | 容器运行时运行的命令 |
ENV<key>=<value> ... | 给容器设置环境变量 |
EXPOSE <PORT> | 指定于外界交互的端口 |
VOLUME <Directory> | 用于指定持久化目录 |
user <USER>:<GROUP> | 指定运行容器时的用户,组 |
docker-compos
1、docker-compos是什么
docker compose 是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。
#linux安装docker-compos
* curl -L https://github.com/docker/compose/releases/download/1.20.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
* chmod +x /usr/local/bin/docker-compose
2、docker-compose与k8s, swarm容器编排工具
swarm
swarm 是Docker公司自行研发的一款用来管理多主机上的Docker容器的工具,可以负责启动容器,监控容器状态,也 提供服务之间的负载均衡。
特点: 更快速的运行速度 快速简单的配置 容器间低耦合 版本控制与组件重用
缺点: 跨平台支持效果差 不提供存储选项 监控信息不足
#kubernetes
kubernetes Google 开元容器编排引擎,支持自动化部署,大规模可伸缩,应用容器化管理,能做到零停机的情况下进行更新。
优点:运行速度快 遵循不可变基础架构的原则(利于回滚) 提供声明式配置 大规模部署和更新软件 处理应用程序的可用性 提供存储卷管理
缺点: 进程初始化时间较长 迁移到无状态需要很多工作
#docker-compose
基于Docker的单主机容器编排工具。
3、docker-compose语法
(1)语法格式: yaml 文件
使用compose 3个步骤
- 使用Dockerfile 定义应用程序环境,以便在任何地方重现该环境
- 在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离环境中一起运行
- 运行docker-compose up命令,启动运行整个应用程序。
(2)docker-compose.yml结构:services、networks、volumes
-
services主要用来定义各个容器
version: '3' services: #services模块 euraka: #指明服务名称 build: . #指明Dockerfile所在路径 ports: #指明映射的端口 - "8761:8761"
services模块下其他命令,与build同级
- command:覆盖容器启动后默认执行的命令(Dockerfile定义的CMD)。
- dns
- dns_search
- environment:环境变量设置,可使用属组或字典两种方式。定义的变量会覆盖.env文件中定义的重名环境变量
- entrypoint:可以覆盖Dockerfile中定义的entrypoint命令
- env_file:从文件中获取环境变量,可指定一个文件或多个文件路径列表。
- expose:暴露端口,只将端口暴露给连接的服务器。而不是暴露给宿主机
- external_links:连接到docker-compose.yml外部的容器
- iamges:指定运行容器使用的镜像
- links:连接到其他服务的容器 SERVICES:ALIAS
-
networks定义需要使用到的network ,与services平级
- 默认情况下,compose为应用创建一个网络,服务的每个容器都会加入该网络中。这样,容器就可被该网络中的其他容器访问,该容器还能以服务名称作为hostname被其他容器访问。
- networks模块自定义网络
- 详细可参考《spring cloud 与docker》一书 p286-p289
-
volumes定义services使用到的volume,与services平级
volumes:卷挂载路径设置(HOST:CONTAINER 或HOST:CONTAINER:ro)
docker 与微服务 --待学习整理
1、什么叫微服务
...