[关闭]
@WillireamAngel 2018-08-06T23:55:02.000000Z 字数 3989 阅读 917

Docker

虚拟化


Docker:
容器:运行在操作系统内核之上的用户空间,多用户空间运行在同一台宿主机上。
得益于内核特性:控件组,命名空间,容器和宿主机之间的隔离更加彻底,容器有独立的网络和存储栈。
不需要模拟层和管理层,使用操作系统的调用接口,降低单容器开销。

Docker架构:Docker引擎(守护进程)+Docker镜像+Registry(镜像库)+Docker容器(镜像、操作、执行环境)
镜像:构建和打包;容器:启动或执行
优点及应用:
加快本地开发和构建流程,高效,轻量化;
让独立服务或应用程序运行在不同环境中,得到相同运行结果;
创建隔离测试环境,本机构建程序或架构测试;
高性能超大规模的宿主机部署。

Linux内核命名空间:
挂载名称空间(隔离文件系统挂载点)、UTS命名空间(系统标识符)、IPC命名空间(进程间通信资源)、PID名称空间(隔离进程ID空间)、网络命名空间(网络系统资源隔离)、用户命名空间(隔离用户和组ID号空间)

文件系统隔离、进程隔离、网络隔离、资源隔离和分组、写时复制、日志、交互式Shell
(Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略)

device-mapper:存储驱动

docker自动安装脚本
curl https://get.docker.com/ | sh

绑定守护进程到地址:
dockerd -H tcp://x.x.x.x:port -H unix://home/docker/docker.sock
调试:
dockerd -D
查看docker运行状态:
docker info
运行第一个容器:
docker run --name centos001 -i -t centos /bin/bash (-c " ")
-i 保证容器持久的标准输入(STDIN)
-t 为创建的容器分配一个伪tty
-d 后台运行守护式进程
-c 执行代码块
-p 公开端口给宿主机
-w 工作目录
-h 主机名
-e 临时环境变量定义
-v 将宿主机的目录作为卷,挂载到容器中
-P 公开在Dockerfile中通过EXPOSE指令公开的所有端口
--restart=always
--restart=on-failure:5 在退出代码为非0时,自动重启,最多5次。
--entrypoint 覆盖ENTRYPOINT指令
--build-arg 设置默认值
--net= 设置网络
centos 基础镜像(创建了一个网络、IP、桥接接口)
/bin/bash 交互式shell

进入容器:
sudo docker attach ID
创建一个新的bash会话:
sudo docker exec -it ID /bin/bash

docker-compose exec container_ID bash
2docker-compose run container_ID bash

显示容器:
docker ps
docker ps -a -q
-a 列出所有容器
-q 返回容器ID
docker rm ID/name 删除容器
docker rmi ID 删除镜像
docker start/restart/stop ID/Name
docker create 创建容器
docker attach ID 附着到容器
docker logs -ft(--tail n) Name 获取守护型容器日志(后台运行日志) -f 获取最后几条日志 -t时间戳
docker run --log-driver="syslog" --name Name -d centos /bin/sh -c " " 日志驱动,使用syslog驱动日志,所有日志定向到syslog
docker run --expose 80 指定对外公开端口
docker port ID port 查看端口映射情况

CPU、内存、网络I/O、存储I/O
docker top ID
docker stats ID

docker inspect --format ' ' ID 检查容器配置信息
--format ' ' 支持完整的go语言模块查询

所有配置文件:/var/lib/docker

容器的生命周期:
创建、管理、停止到最终删除

Docker镜像和仓库:
镜像栈、联合加载允许一次加载多镜像、镜像分层
Docker文件系统层:引导文件系统(内核 、容器组、命名空间、设备映射)、基础镜像、功能镜像
写时复制:每个只读镜像层都是只读的,并且以后都不会修改
docker images
docker pull centos:latest 拉取镜像
docker search
docker push willireamangel/net-tools 推送镜像

构建镜像:
docker login登录
docker commit构建Docker镜像(不推荐)
Dockerfile(基于DSL语法) docker build
目录为构建环境,称为上下文或者构建上下文,Docker在构建镜像时将构建上下文和上下文中的文件和目录上传到Docker守护进程。
数组语法设置执行指令:RUN ["/bin/bash", "-l"]
RUN
CMD
ENTRYPOINT
WOEKDIR 切换工作目录
ENV 设置环境变量
USER 指定用户
VOLUME 容器添加卷(卷修改实时生效、目录绕过联合文件系统,提供数据共享或持久化功能,设置一个默认挂载点)
ADD file1 path1 构建环境下的目录和文件复制到镜像中(/../目录,/..文件)(支持gzip,bzip2,xz等源文件解压)
ADD 命令使构建缓存无效
COPY 只关心复制
LABEL 为镜像添加元数据(键值对形式)
STOPSIGNAL 设置停止容器的系统调用信号
ARG 传递构建运行时的变量
ONBUILD 触发器(添加源代码或构建脚本时执行)

自动构建:
linked Github/Bitbucket

Registry:
构建私有Registry,大量公有云托管容器
docker run -d -p 5000:5000 --name registry registry
打标签:
docker tag imagesID pathtag 使用新Registry为镜像打上标签
推送:
docker push pathtag

Docker容器连接:
docker networking
docker link
docker每创建一个容器就会创建一组互联的网络接口,而docker0则创建一个网桥。

Docker网络
Docker内部网路:docker0虚拟网桥,用于连接容器和本地宿主网络。iptables配置防火墙规则和NAT。应用程序需要对容器的IP地址做硬编码,docker重启容器后会改变容器的IP地址。
Docker链接:
Docker Networking:用户管理自创建网络、容器跨主机通信(overlay网络跨宿主机通信)、网络配置灵活定制、支持插拔和网络驱动兼容。
docker network create ID 创建Docker网络
docker network ls
docker network connect ID containerid #docker切换容器网络
docker network disconnect ID containerid

Docker Networking v.s Docker链接:
Docker networking可将容器连接到不同宿主机的容器;
Docker networking连接的容器无需更新的情况下,停止、启动、或者重启容器;Docker链接需要更新一些配置,或者重启相应的容器来维护Docker容器的链接;
Docker Networking不必事先创建容器再去连接它,也不必关心容器的运行顺序,可通过内部网络进行容器名解析和发现。

Docker链接:
docker run -p port --name containername --link redis:db -t -i -v $PWD:/opt/webapp repository/images /bin/bash
-p 开放port
--name 命名
--link 两个容器间的互联,一个为要链接的容器的名字,一个是容器的别名
-v 卷挂载
通过容器链接,可以让客户容器访问服务容器的任意公开端口,只有使用--link标志链接的容器才能连接到这个端口。
--icc=false 强制只允许有链接的容器之间互相通信。
容器链接只能工作在同一台Docker宿主机,不能链接位于不同Docker宿主机的容器。多宿主机环境,使用Docker Networking或者Docker Swarm。
--add-host=host:ip 在/etc/hosts添加主机名和ip到文件中
--dns为容器单独配置DNS

env 查看环境变量
环境变量信息:
子容器的名字,运行服务的协议、ip和端口号,Docker设置的环境变量(Dockerflie中的ENV和EXPOSE指定的内容)

Docker持续集成:
Jenkins、Strider和Drone.io
--privileged 启动Docker的特权模式(对宿主机有root权限),可进行内核和设备访问修改

docker kill -s

Docker编配和服务:
容器编配:Docker Compose

分布式服务发现:Consul

Docker的编配和集群:Swarm
过滤器和策略决定容器在哪个节点运行
过滤器:约束过滤器、亲和过滤器、依赖过滤器、端口过滤器、健康过滤器
策略:平铺策略、紧凑策略、随机策略

其它编配工具和组件:
Fleet和etcd
KUbernetes
Apache Mesos
Helios
Centurion

TProv:命令行中使用docker

Docker API:
Registry API:提供与来存储Docker镜像的Docker Registry继承的功能
Docker Hub API:提供与Docker Hub集成的API
Docker Remote API:提供与Docker守护进程进行集成的功能。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注