容器:容器技术是一种虚拟化的方案 容器:docker , k8s docker:docker是能将开发的应用程序自动部署到容器的开源引擎。 Github地址:https://github.com/docker/docker docker官网:www.docker.com hub.docker.com 上传下载docker镜像的网站
docker的特别之处: docker在虚拟化的容器执行环境中,增长了一个应用程序部署引擎。 该引擎的目标: 提供一个轻量快速的环境,可以运行开发者的程序,便于方便高效的从开发者环境部署到测试环境,而后再部署到生产环境。
docker的优势: 一、提供简单轻量的建模方式,运行秒级 二、职责的逻辑分离。开发人员只须要关系容器中运行的程序,而运维人员只须要关心如何管理程序。docker设计的目的性就是增强开发人员写代码的开发环境与应用环境要部署的生产环境的一致性。 三、快速高效的开发生命周期。缩短代码从开发到测试,再到上线运行的生命周期。让应用和程序具有可移植性。在容器中开发,以容器的形式去交付。 四、鼓励使用面向服务的架构。docker推荐单个容器只运行一个程序或者一个进程。这样就造成了一个分布式的应用程序模型。 在这种模型下,应用程序或服务均可以表示为一系列内部互联的容器,从而使分布式互联的程序扩展或调试应用程序都变得很是简单。 这就是在开发中经常使用的思想:高内聚低耦合
docker的使用场景: 一、使用docker容器开发、测试、部署服务; 二、建立隔离的运行环境 三、搭建测试环境 四、构建多用户的平台即服务(PaaS)基础设施 五、提供软件即服务(SaaS)应用程序 六、高性能、超大规模的宿主机部署
三大核心理念: 构建 基于镜像构建容器 运输 传输到系统中 运行 运行于容器
安装docker容器: 注:centos虚拟机必需要联网,否则没法安装。 1.配置repo仓库 cd /etc/yum.repos.d/ vi docker.repo [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg yum clean all yum makecache 2.安装docker yum -y install docker cd 检查有木有安装方法: docker version 3.启动并设置开启自启动 systemctl start docker systemctl enable docker docker version 到此,docker容器安装完成,而且启动成功。
获取镜像的三种方式: 1)下载镜像(默认从Docker Hub下载) 2)把容器转换为镜像 3)制做镜像(经过dockerfile生成镜像) 查找镜像(默认从Docker Hub查询) docker search httpd //查找全部httpd相关的镜像 下载镜像(默认从Docker Hub查询) docker pull docker.io/httpd 查看本机镜像列表 docker images //查看全部镜像 (也能够单独查询 后面跟仓库名称和标签) docker inspect 2211e1f06c4e或docker.io/httpd //指定ID号查看 详细信息 REPOSITORY:表示镜像的仓库源docker.io TAG:表示镜像的标签 IMAGE ID:表示镜像的ID CREATED:表示镜像建立时间 SIZE:表示镜像大小 添加新名称 新标签 ,用于更名称 docker tag httpd httpd:centos 删除镜像 删除以前确保没有被容器使用,如有容器使用须要先删除容器。 docker rmi 镜像名称 或者镜像id 镜像没有使用才能删除成功,且只是删除名称 docker rmi -f 镜像ID //永久删除 docker rmi -f $(docker images | grep "<none>" | awk "{print \$3}") 删除全部没有使用的镜像 存出镜像和载入镜像 docker save -o httpd httpd //将本地镜像存为文件httpd,保存在当前所在的目录中 docker save -o 文件名 镜像名称 docker load < cobbler //将镜像文件导入到docker镜像中
镜像操做:
搜索 : docker search 关键字
下载 : docker pull 关键字
查看:docker images
查看镜像内容信息:docker inspect 镜像名(ID)
删除:docker rmi 镜像名(ID)
导出镜像:docker sava -o 保存的文件名 镜像名(ID)
导入镜像:docker load < 保存的文件
更改镜像名称及标签docker tag 镜像id 新的镜像名: 标签linux
docker容器操做 容器是镜像的一个运行实例。所不一样的是,镜像是静态的只读文件,而容器带有运行时须要的可写文件层。若是认为虚拟机是模拟运行的一整套操做系统(包括内核、应用运行态环境和其余系统环境)和跑在上面的应用,那么Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。 建立容器 对容器进行操做就跟直接操做应用同样简单、快速。Docker容器实在过轻量级了,用户能够随时建立或删除容器。 1.新建容器 可使用docker create命令新建一个容器,例如: docker create -it ubuntu:latest //基于镜像建立容器,默认是没有运行的 docker ps -a //查看全部容器 使用docker create命令新建的容器处于中止状态,可使用docker start命令来启动它。
create命令和后续的run命令支持的选项都十分复杂,主要包括以下几大类:与容器运行模式相关、与容器和环境配置相关、与容器资源限制和安全保护相关。 create命令与容器运行模式相关的选项: 选项 说明 -a,--attach=[] 是否绑定到标准输入、输出和错误 -d,--detach=true|false 是否在后台运行容器,默认为否 --detach-keys="" 从attach模式退出的快捷键 --expose=[] 指定容器会暴露出来的端口或端口范围 --group-add=[] 运行容器的用户组 -i,--interactive=true|false 保持标准输入打开,默认为false --ipc="" 容器IPC命名空间,能够为其它容器或主机 --isolation="default" 容器使用的隔离机制 --log-driver="json-file" 指定容器的日志驱动类型,能够为json-file,syslog,journald,gelf,fluentd,awslogs,splunk,etwlogs,gcplogs或none --log-opt=[] 传递给日志驱动的选项 --net="bridge" 指定容器网络模式,包括bridge,none,其它容器网络,host的网络或者某个现有网络 --net-alias=[] 容器在网络中的别名 -P,--publish-all=true|false 经过NAT机制将容器标记暴露的端口自动映射到本地主机的临时端口 -p,--publish=[] 指定如何映射到本地主机端口,例如-p 11234-12234:1234-2234 --pid=host 容器的PID命名空间 --userns="" 启用userns-remap时配置用户命名空间的模式 --uts=host 容器的PID命名空间 --restart="no" 容器的重启策略,包括no、on-failure[:max-retry]、always、unless-stopped等 --rm=true|false 容器退出后是否自动删除,不能跟-d同时使用 -t,--tty=true|false 容器运行时指定伪终端 --tmpfs=[] 挂载临时文件系统到容器 -v|--volume host-dir:container-dir 挂载主机上的文件卷到容器内 --volume-driver="" 挂载文件卷的驱动类型 --volumes-from=[] 从其余容器挂载卷 -w,--workdir="" 容器内的默认工做目录
create命令与容器环境和配置相关的选项:
选项 说明
--add-host=[ ] 在容器内添加一个主机名到IP地址的映射关系(经过/etc/hosts文件)
--device=[ ] 映射物理机上的设备到容器内
--dns-search=[ ] DNS搜索域
--dns-opt=[ ] 自定义的DNS选项
--dns=[ ] 自定义的DNS服务器
-e,--env=[ ] 指定容器内环境变量
--env-file=[ ] 从文件中读取环境变量到容器内
-h,--hostname="" 指定容器内的主机名
--ip=“” 指定容器的IPv4地址
--ip6="" 指定容器的IPv6地址
--link=[ <name or id>:alias] 链接到其它容器
--mac-address="" 指定容器的Mac地址
--name="" 指定容器的别名git
create命令与容器资源限制和安全保护相关的选项: 选项 说明 --blkio-weight=10~1000 容器读写块设备的I/O性能权重,默认为0 --blkio-weight-device=[device_name:weight] 指定各个块设备的I/O性能权重 --cpu-shares=0 容许容器使用CPU资源的相对权重,默认一个容器能用满一个核的CPU --cap-add=[ ] 增长容器的linux指定安全能力 --cap-drop=[ ] 移除容器的linux指定安全能力 --cgroup-parent="" 容器cgroups限制的建立路径 --cidfile="" 指定容器的进程ID号写到文件 --cpu-period=0 限制容器在CFS调度器下的CPU占用时间片 --cpuset-cpus="" 限制容器能使用哪些CPU核心 --cpuset-mems="" NUMA架构下使用哪些核心的内存 --device-read-bps=[ ] 挂载设备的读吞吐率(以bps为单位)限制 --device-write-bps=[ ] 挂载设备的写吞吐率(以bps为单位)限制 --device-read-iops=[ ] 挂载设备的读速率(以每秒i/o次数为单位)限制 --device-write-iops=[ ] 挂载设备的写速率(以每秒i/o次数为单位)限制 --kernel-memory="" 限制容器使用内核的内存大小,单位能够是b,k,m或g -m,--memory="" 限制容器内应用使用的内存,单位能够是b、k、m或g --memory-reservation="" 当系统中内存太低时,容器会被强制限制内存到给定值,默认状况下等于内存限制值 --memory-swap="LIMIT" 限制容器使用内存和交换区的总大小 --oom-kill-disable=true|false 内存耗尽(out-of-memory)时是否杀死容器 --oom-score-adj="" 调整容器的内存耗尽参数 --pids-limit="" 限制容器的pid个数 --privileged=true|false 是否给容器以高权限,这意味着容器内应用将不授权限下限制,通常不推荐 --read-only=true|false 是否让容器内的文件系统只读 --security-opt=[ ] 指定一些安全参数,包括权限、安全能力、apparmor等 --stop-signal=STGTERM 指定中止容器的系统信号 --shm-size="" /dev/shm的大小 --sig-proxy=true|false 是否代理收到的信号给应用,默认为true,不能代理SIGCHLD、SIGSTOP和SIGKILL信号 --memory-swappiness="0-100" 调整容器的内存交换区参数 -u,--user="" 指定在容器内执行命令的用户信息 --ulimit=[ ] 经过ulimit来限制最大文件数、最大进程数等 其余比较重要的选项还包括: ·-l,--label=[]:以键值对方式指定容器的标签信息; ·--label-file=[]:从文件中读取标签信息。
启动容器 使用docker start命令来启动一个已经建立的容器: docker start 容器ID //开启容器 docker stop 容器ID //关闭容器 docker容器的状态: up 开启状态 Exited 终止状态 Create 建立状态 (Paused) 暂停状态 状态没有 中止状态 docker pause/unpause centos/httpd //暂停docker容器 docker stop centos/httpd //中止指定docker容器
新建并启动容器 除了建立容器后经过start命令来启动,也能够直接新建并启动容器。所须要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。 docker run centos/lamp /bin/bash -c ls / //建立容器的同时启动并运行相关程序,命令完成容器就中止。 启动一个bash终端,容许用户进行交互: docker run -it ubuntu:14.04 /bin/bash root@af8bae53bdd3:/# 其中,-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。 更多的命令选项能够经过man docker-run命令来查看。在交互模式下,用户能够经过所建立的终端来输入命令。 守护态运行 更多的时候,须要让Docker容器在后台以守护态(Daemonized)形式运行。此时,能够经过添加-d参数来实现。 下面的命令会在后台运行容器: docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" 进入运行中的容器中,对容器作各类操做: docker exec -it 容器id /bin/bash 进入容器中 退出方法: 一、输入exit 二、Ctrl+p, Ctrl+q键返回主机控制台 链接到容器的会话 docker attach 容器id号 //将容器导出成文件 docker export 13198d132fbe > centoslamp 将指定容器导出成名为centoslamp的文件,该文件为docker镜像文件 //将容器文件生成镜像 docker import 文件名 镜像名:标签 //删除容器 docker rm d4e863a654aa 指定删除某个容器 docker rm -f d4e863a654aa 强制删除运行中的容器,不建议 docker container prune 删除全部中止的容器 docker rm $(docker ps -qf status=exited) 删除指定状态的容器
扩展: 硬件资源相关 一、 显示容器硬件资源使用状况 docker stats [选项] [0个或多个正在运行容器] docker stats 不指定容器时显示全部正在运行的容器 二、更新容器的硬件资源限制 docker update [选项] 有可能报错: vi /etc/default/grub GRUB_CMDLINE_LINUX="... cgroup_enable=memory swapaccount=1" 三、使用压力测试工具 stress 验证效果 使用已有的stress镜像 progrium/stress, 开两个终端, 在一个终端中执行下面命令 docker run -m 100m --rm -it progrium/stress --cpu 2 --io 1 --vm 10 --vm-bytes 9M 在另外一个终端执行 docker stats 进行监控 再开一个终端执行 9eb0为容器id开头, 请根据实际状况替换。内存限制只能调大不能调小 docker update -m 200m 9eb0
容器操做:
建立:docker create -it 镜像名(ID) /bin/bash
启动容器: docker start 容器名(ID)
中止容器:docker stop 容器名(ID)
暂停:docker pause 容器名(ID)
取消暂停:docker unpause 容器名(ID)
删除:docker rm -f 容器名(ID)
删除全部中止的容器:docker container prune
查看容器详细信息:docker inspect 容器id
查看容器列表:docker ps -a
建立并运行:docker run -itd 镜像id /bin/bash
将容器存入文件:docker export 容器id > 文件名
将容器文件导入镜像:docker import 文件名 镜像名: 标签github
docker 网络覆盖范围可分为:单个host上的容器网络和跨多个host的网络 docker 安装时会自动在host上建立三个网络,可使用docker network ls查看到 none 、host、bridge 此外还有另外两种方式
一、none网络 在这个网络下只有容器的lo网卡,在建立容器时可使用--network=none指定使用none网络 正常不指定网络的状况下: eth0 inet addr:172.17.0.7 指定网络为none的状况下: docker run -it --network=none --name network1 busybox 只有一个lo网卡 通常来说,这个封闭的网络有什么用处呢? 可用于一些安全性较高的而且不须要联网的应用可使用none网络,好比:某个容器惟一用途就是生成随机密码,就能够放到none网络中避免密码被窃取;可是大部分容器是须要网络的
二、host网络: 链接到host网络的容器共享docker host的网络栈,容器的网络配置与host彻底一致,能够经过--network=host指定host网络 docker run -it --network=host --name network2 busybox 在容器中能够看到真机的全部网卡,而且连hostname也是真机的 host网络的使用场景是什么呢? host网络的最大好处就是:性能; 若是容器对网络传输效率要求较高,则能够选择host网络。 可是host网络也有缺点:灵活性不高,好比:要考虑多口灵活性的问题,docker host上已经使用的端口容器就不能使用了 doker host另外一个用途就是:让容器能够直接配置host网络,好比:一些跨host的网络解决方案,自己也是以容器运行的,这些方案须要对网络进行配置,好比,iptables。
三、bridge网络: 容器默认使用的时bridge网络 docker安装时会建立一个 命令为docker0的linux bridge。若是不指定--network=,运行的容器会默认挂到docker0上 能够用“brctl show”命令查看桥接的网卡 容器中“eth0”——》真机的 veth9cfd9f7 ——桥接——》docker0 注:interface一列就是容器的虚拟网卡,若是容器都处于关闭的状态,会没有网卡信息 须要docker在开启状态下才能看到接口网卡 如:看到interfaces一列是veth48a8eca 进入容器中能够看一下网卡的信息eth0 其实:eth0和veth48a8eca是一对veth pair。veth pair是一种成对出现的特殊网络设备,能够把他想像成由一根虚拟网线连起来的一对网卡,网卡的一头叫作:eth0@if315,另外一头是veth48a8eca挂在了docker0上,其效果就是将eth0@if315挂在了docker0上 看到eth0@if315配置了172.17.0.2/16的ip,再运行一个容器,看看他的ip是否也是一样的 新运行的容器的IP由172.17.0.3顺延下去了,而不是一个独立的网段,并且都是172.17.0的网段的 为何都是这个网段上面的呢? 能够经过docker network inspect bridge 看到网卡的配置信息:subnet是172.17.0.0/16,gateway是172.17.0.1,这个网管来自哪呢? 能够看到host主机上面的docker0的ip就是172.17.0.1,因此这个网管就是docker0
四、自定义网络: 一般默认的状况下使用的是docker的bridge的网络,用户也能够根据本身的业务须要,建立user-defined docker 提供三种user-defined网络驱动:bridge,overlay,macvlan。 其中overlay和macvlan用于建立跨主机的网络 能够经过bridge驱动建立相似前面默认的bridge网络docker0 docker network create --driver bridge brnet1 经过brctl show看到咱们新建的网络 新增长了一个网桥br-32a5cb322311 ,这里的32a5cb322311正好是新建的brnet1的容器ID 经过docker network inspect brnet1查看 能够看到新建的brnet1的subnet是172.18.0.0/16,网关是172.18.0.1,这里的172.18.0.0/16网段是docker自动分配的网段 也能够本身指定网段和网关:--subent和--gateway docker network create --driver bridge --subnet 192.168.2.0/24 --gateway 192.168.2.1 brnet2 容器要使用新的网络,须要在新建运行(docker run)的时候,经过--network=去指定 指定一个静态ip地址 能够经过--ip指定 docker run -it --network=brnet2 --ip 192.168.2.222 busybox 注:只有经过--subnet建立的网络才能指定静态IP。 最好不要将容器设置成与host相同网段的,不然host的主机将被干扰,固然若是收到了干扰也不用怕,可使用docker network rm <本身设置的bridge的名称> 将这个bridge删除
使用指定网络建立容器:
docker run -it --network bridge 镜像id /bin/bash
docker网络查看:
docker network ls
建立docker网络:
docker network create --driver=bridge 自定义的网络名称
建立docker网络而且自定义可分配的网段和网关:
docker network create --driver=bridge --subnet 192.168.80.0/24 --gateway 192.168.80.1 自定义的网络名称
使用指定网络建立容器而且分配一个静态IP地址:
docker run -it --network 网络名称(自定义) --ip 192.168.80.100 镜像名 /bin/bash
注意:静态IP地址只要自定义网段而且使用“--subnet”指定网段才能分配
查看docker网络的详细信息:
docker network inspect 网络名称
删除docker网络:
docker network rm 网络名称web
一、容器访问外部网络 容器默认指定了网关为docker0网桥上的docker0内部接口。docker0内部接口同时也是宿主机的一个本地接口。所以,容器默认状况下是能够访问到宿主机本地的。更进一步,容器要想经过宿主机访问到外部网络,须要宿主机进行转发。 # sysctl net.ipv4.ip_forward 查看转发是否打开,1表明打开 net.ipv4.ip_forward = 1 若是为0,则没有开启转发,则须要手动打开: # sysctl -w net.ipv4.ip_forward=1 更简单的,在启动Docker服务的时候设定--ip-forward=true,Docker服务会自动打开宿主机系统的转发服务。
二、端口映射 容器中能够运行一些网络应用,要让外部也能够访问这些应用,能够经过 -P(大写) 或 -p (小写) 参数来指定端口映射。 一、当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口 二、-p(小写)则能够指定要映射的IP和端口,可是在一个指定端口上只能够绑定一个容器。 支持的格式有 :真机Port:容器Port hostPort:containerPort(映射全部接口地址) 将本地的 5000 端口映射到容器的 5000 端口: docker run -d -p 5000:5000 training/webapp /bin/bash 此时默认会绑定本地全部接口上的全部地址。 ip:hostPort:containerPort (映射指定地址的指定端口) 指定映射使用一个特定地址,好比 localhost 地址 127.0.0.1 docker run -d -p 127.0.0.1:5000:5000 training/webapp /bin/bash ip::containerPort (映射指定地址的任意端口) 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。 docker run -d -p 127.0.0.1::5000 training/webapp /bin/bash 还可使用 udp 标记来指定 udp 端口 docker run -d -p 127.0.0.1:5000:5000/udp training/webapp /bin/bash 查看映射端口配置 使用 docker port 来查看当前映射的端口配置,也能够查看到绑定的地址 docker ps -a 端口——>端口 注: 容器有本身的内部网络和 ip 地址(使用 docker inspect 能够获取全部的变量,Docker 还能够有一个可变的网络配置。) -p 标记能够屡次使用来绑定多个端口 例如: docker run -d -p 5000:5000 -p 3000:80 training/webapp /bin/bash
一、必须两个容器处于同一网段,同时制定统一网络 二、DNS:只用自定义的网络而且自定义的网段才能使用dns
1.增长路由: 若是host上对每一个网络都有一个路由,同时操做系统上打开了ip forwarding,host就成了一个路由,挂在不一样的网桥上的网络就可以互相ping通 能够看一下host上是否知足这个条件 ip r查看host上的路由表 打开路由转发功能 centos7版本: vi /etc/sysctl.conf net.ipv4.ip_forward = 1 centos 6版本: echo 1 > /proc/sys/net/ipv4/ip_forward sysctl -p cat /proc/sys/net/ipv4/ip_forward 看是否是1 可是iptables DROP 掉了网桥 docker0 与 br-5d863e9f78b6 之间双向的流量。 从规则的命名 DOCKER-ISOLATION 可知 docker 在设计上就是要隔离不一样的 netwrok。
二、经过docker另外的增长网卡的办法来解决: 使用docker network connect给容器增长一块新的网卡 docker network connect brnet2 --ip 192.168.2.22 容器ID 经过docker network connect 这个命令给容器添加网卡eth1,并让这个网卡使用另外的bridge,如今不一样bridge之间的容器建能够进行通讯