- 容器与管理程序虚拟化(hypervisor virtualization HV)
- HV通过中间层运行独立虚拟机器于硬件之上
- 容器则是直接运行在操作系统内核之上的用户空间,由于客居于操作系统,只能运行与底层宿主机相似的操作系统。
- 权限隔离监牢(chrooot jail)
- 容器有独立的网络和存储栈,还拥有自己的资源管理能力
- 需要的开销有限,不需要模拟层和管理层,而是使用操作系统的系统调用接口,降低了运行各个容器所需的开销。
- Docker是一个能够把开发的应用程序自动部署到容器的开源引擎,帮助用户构建和部署容器。
- 所需的全部环境,仅仅是一台安装了兼容版本的Linux内核和二进制最小限的宿主机
- 提供
- 简单,轻量的建模方式
- 只需几分钟,就可以把自己的程序Dockerize,依赖写时复制模型,达到随心所至,代码即改。
- 去除管理程序的开销,拥有很高的性能
- 职责的逻辑分离
- 开发人员只需关心容器中运行的程序,运维只需关心如何管理容器。
- 快速,高效的开发生命周期
- 鼓励使用面向服务的架构
- 推荐单个容器只运行一个应用程序。
- 简单,轻量的建模方式
- Docker组件
- 客户端与服务器(c/s)
- Docker守护线程也称为Docker引擎,通过客户端(docker命令行工具或RESTAPI)
-
- 镜像(构建或打包阶段)
- Registry(Docker Hub)
- 容器(基于镜像,启动或执行阶段)
- 客户端与服务器(c/s)
- 安装
- 只支持64位的CPU架构计算机
- docker info
- 3种方式可以唯一指定容器
- 短UUID
- 长UUID
- 名称
- docker run
- 使用镜像创建并运行新容器
- 容器拥有自己的网络,以及一个用来和宿主机通信的桥接网络接口
- -i -t
- --name [a-zA-Z0-9_.-], 否则为随机名称
- -d 守护式容器(detached)
- --restart(2.0+),自动重启容器 e.g. --restart=always/on-failure/on-failure:5(最多重启5次)
- -p
- 在宿主机随机选择32768-61000映射, e.g. run -p 80
- 指定端口映射 e.g. -d 32798:80/ -d 127.0.01:[8080]:80
- -P,对外公布Dockerfile中EXPOSE公开的所有端口
- -e ENV
- -w WORKDIR
- -v 可以绕过分层联合文件系统,提供持久化或共享数据, 目录后可加:rw/ro,标明读写状态
- --net=[network name] 指定新容器将会在哪个网络中运行
- --link [container name] : [alias],可访问容器公开端口,只有链接到这个容器的容器,才能连接到这个端口
- -h 指定容器名
- --add-host 添加/etc/hosts解析,e.g. =docker:10.0.0.1
- --privileged 特权模式,容器对宿主机拥有root权限
- --cidfile=,将container ID存至文件
- --volumes-from [container name] 把指定容器里所有的卷(容器中的卷),都加入这个新建的容器里
- --rm 对于只用一次的容器,自动删除。
- docker ps -a
- -l, 最后一个运行的容器,无论是否还在运行
- -p,只返回容器ID
- docker start name/id
- docker restart
- docker create
- docker attach name/id
- 重新附着到容器会话上,沿用run命令时指定的参数
- docker logs name/id
- -f
- docker log --tail 0 -f
- 获取容器内日志
- 日志驱动(1.6+)
- --log-driver, json-file/syslog/none
- docker top name/id
- docker stats (1.5+)
- docker exec (1.3+)
- 额外启动新线程(后台任务 -d、交互式任务 -it)
- docker stop name/id
- 发送SIGTERM信号
- docker kill
- 发送SIGKILL,立即停止
- docker inspect
- 深入容器信息
- -f支持Go语言模板
- docker rm
- 删除容器
- -f(1.6.2) 删除运行中的容器
- docker rm `sudo docker ps -a -q
- 镜像
- 由文件系统叠加而成
- 最低端是一个引导文件系统,bootfs
- 当一个容器启动后,被移到内存,bootfs被卸载
- 第二层是root文件系统,rootfs(一种或多种操作系统)
- 始终为只读状态,传统的Linux引导过程,以只读方式加载,完成完整性检查后,被切换为读写模式
- docker利用联合加载,又在rootfs上加载更多只读文件系统(镜像)
- 顶层为镜像启动容器时,加载的可写的文件系统
- 镜像栈
- 写时复制(copy on write),当第一次启动容器,初始读写层为空,文件系统发生更改,从下层的只读层复制到该读写层,用副本隐藏只读版本。
- ubuntu只是一个裁剪版,包含最低限度的支持系统运行组件。
- docker pull
- 仓库
- 用户仓库(user repository)
- 顶层仓库(top-level repository)
- 镜像签名
- docker search
- docker login/logout
- docker cp
- 构建镜像
- docker commit -m '' containerId 目标镜像仓库/镜像名
- 只提交与创建容器的镜像差异部分,非常轻量
- docker inspect
- docker build/ Dockerfile文件
- dockerfile使用DSL语法,构建镜像更具备可重复性,透明性,幂等性
- Dockerfile所在目录为构建环境/构建上下文, 在构建镜像时,将目录中的文件上传到Docker守护进程,这样就能直接访问用户想在镜像中存储得数据。
- 指令:必须为大写字母,从上到下顺序执行
- 每条指令都会创建一个新的镜像层并对镜像进行提交,每次都运行一个新容器。
- 构建的每一步及其对应指令,都会独立运行,并逐步提交。
- 第一条指令必须是FROM,基础镜像
- MAINTAINER
- RUN(使用命令包装器 /bin/sh -c,可能导致意料外行为)/exec格式[]
- EXPORT
- docker build -t "仓库名/ 镜像名" .(Dockerfile所在目录)
- 1.5+,build可以使用-f,定义文件名可不为dockerfile
- .dockerignore
- 错误调试,可run最后成功创建的容器。
- 构建缓存??
- docker history ,查看镜像如何构建出来
- docker port containerID/name 内部端口, 映射到宿主机端口
- 推荐使用数组语法,设置要执行的命令 e.g. CMD ["/bin/bash", "-l"]
- Dockerfile指令
- CMD,指定多条CMD指令,也只有最后一条会被使用,run可以覆盖
- ENTRYPOINT,不会被run覆盖,如果需要使用run --entrypoint覆盖
- WORKDIR,在容器内部设置一个工作目录
- ENV
- USER
- VOLUME
- 用来向基于镜像创建的容器添加卷
- 存放在宿主机 的/var/lib/docker/volumes
- ADD
- 将构建环境下的文件和目录复复制到镜像中
- 通过判断目的地址末尾是否/,确定是否为文件
- 自动解压归档文件,不会覆盖
- 使构建缓存变无效
- COPY
- 不进行提取或解压
- 不能复制构建目录之外的任何文件
- LABEL
- 1.6+, 添加元数据,通过docker inspect查看信息
- STOPSIGNAL
- 1.9+,设置停止容器时,发生什么系统调用信号给容器
- ARG
- build --build-arg
- ONBUILD
- 为镜像添加触发器,当作为基础镜像。
- 只被继承一次,在子镜像中FROM后被执行
- docker push
- docker rmi
- docker rmi `docker images -a -q` 删除所有镜像
- dockerfile使用DSL语法,构建镜像更具备可重复性,透明性,幂等性
- 使用volume构建测试环境
- 容器间通信
- 1. 内部连网
- 每个容器都在docker0(宿主机网关)这个新网络接口,分配到一个ip(veth)
- 同一宿主机上,不同容器可不一定通过映射后端口通信,可使用原始端口。
- 由于ip动态变化,不是一个好方案
- 2. Docker networking
- 1.9+,创建自己的网络,可跨越不同宿主机。
- docker network create app //创建新的桥接网络
- docker network inspect app
- docker network ls
- 容器在指定网络中启动,docker会感知到所有在这个网络中运行的容器,通过每个容器中的/etc/hosts维护DNS信息
- 其他容器的ip、和主机名
- 任何容器重启,其他容器/etc/hosts都会重新更新
- docker network connect app db //已有容器添加到网络中
- docker network disconnect app db
- 3. 通过docker链接
- 容器名是唯一的,只有链接到这个容器的容器,才能连接到这个端口。
- 是个安全模型
- 通过container name或alias进行简陋的服务发现
- 1.3+,被连接的容器重启,hosts文件会用新的ip更新
- Docker中递归使用Docker,必须骗过docker,存储容器的目录/var/lib/docker必须是真实文件系统,必须使用挂载宿主文件系统。
- 1. 内部连网
- docker wait,一直阻塞,直到容器 命令执行完成,返回容器退出时的返回码。
- Docker toolbox
- screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty, vm真实执行环境
- docker run -it --rm --volumes-from redis_primary ubuntu cat /var/log/redis/redis-server.log, 查看文件日志
- docker commit -m '' containerId 目标镜像仓库/镜像名
- docker编排和服务发现
- orchestration,自动配置、协作和管理服务的过程。
- docker compose
- 使用YAML定义一组要启动的容器以及运行时的属性
- docker-compose up
- -d
- docker-compose ps
- stop/kill/start/rm
- docker compose
- orchestration,自动配置、协作和管理服务的过程。
《Docker Book》-笔记
最新推荐文章于 2024-01-20 22:05:10 发布