资源控制
资源打包,
资源管理(限制你使用多少)
目录
什么是容器?
• 容器技术已经成为应用程序封装和交付的核心技术
• 容器技术的核心有以下几个内核技术组成:
– Cgroups(Control Groups)-资源管理
– NameSpace-进程隔离
– SELinux安全
• 由于是在物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速
• Docker是完整的一套容器管理系统
• Docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术
优点:
• 相比于传统的虚拟化技术,容器更加简洁高效
• 传统虚拟机需要给每个VM安装操作系统
• 容器使用的共享公共库和程序
VM(需装操作系统) -------> Docker(无需装操作系统)
Docker缺点
• 容器的隔离性没有虚拟化强
• 共用Linux内核,安全性有先天缺陷
• SELinux难以驾驭
• 监控容器和容器排错是挑战(难搞)
第一 命令空间 主机名
第二 ip(网络)
第三 磁盘
第四 进程
第五 ipc(信号比如kill)
第六 用户名
部署Docker
新建2台虚拟机
192.168.5.30/24 4G内存 2CPU 20G磁盘
192.168.5.31/24 4G内存 2CPU 20G磁盘
下面以192.168.5.30为例(2台都有配置):
# virsh edit 虚拟机名 直接修改内存;
vim /etc/sysconfig/network-scripts/ifcfg-eth0
# Generated by dracut initrd
DEVICE="eth0"
ONBOOT="yes"
NM_CONTROLLED="no"
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="192.168.5.30"
NETMASK="255.255.255.0"
GATEWAY="192.168.5.254"
vim /etc/resolv.conf ----> nameserver 192.168.5.254
]#poweroff --->然后开机 加载配置
需要64位操作系统, RHEL7版本,防火墙关闭(熟悉Docker了就不用关)
配置yum源
vim /etc/yum.repos.d/local.repo
[local_repo]
name=CentOS-$releasever - Base
baseurl="ftp://192.168.5.254/centos-1804"
enabled=1
gpgcheck=1
[0_repo]
name=docker0
baseurl="ftp://192.168.5.254/extras" #Docker的包仓库源,不在本地yum里
enabled=1
gpgcheck=0
yum repolist
yum -y install docker
ifconfig #查看时没有docker0
systemctl restart docker
systemctl enable docker
ifconfig #查看时有docker0
镜像
• 在Docker中容器是基于镜像启动的
• 镜像是启动容器的核心
• 镜像采用分层设计
• 使用快照的COW技术,确保底层数据不丢失
docker search busybox #搜索相关镜像
docker search centos
docker search nginx
docker help pull / push #查看下载/上传帮助
docker pull docker.io/busybox # 下载镜像
docker images #查看本地镜像列表
REPOSITORY TAG IMAGE ID CREATED SIZE
名称 标签 ID 创建时间 大小
docker push docker.io/busybox #上传镜像
docker save docker.io/busybox:latest -o busybox.tar #导出本地镜像为tar文件
ls
真机传相关的tar镜像文件
scp 'docker_images.zip' root@192.168.5.31:/root
yum -y install unzip
unzip docker_images.zip
cd docker_images/
ls ----> centos.tar nginx.tar redis.tar registry.tar ubuntu.tar
for i in *.tar; do docker load -i $i ; done #导入镜像
docker load -i 镜像文件.tar #使用tar包导入镜像
docker images #查看镜像列表
启容器格式: docker 命令 参数 镜像名称:标签 启动命令
docker run -it docker.io/centos:latest /bin/bash(容器内的命令,不加则用默认的) #运行容器
进去配置yum和本机的一致,安装相关命令的包,查看ip/主机名/磁盘/进程/用户名/ipc(如kill信号)
yum provides 命令 #查找该命令相关的软件包
docker run --help
docker run -it docker.io/busybox:latest /bin/bash()
docker run -it docker.io/redis:latest
docker run -it docker.io/nginx:latest /bin/bash
docker run -it docker.io/ubuntu:latest
docker port 名字 端口 #快捷地查看端口的绑定情况。
docker ps [-qa] #查看容器信息
参数解析:
-t: 在新容器内指定一个伪终端或终端。
-i: 允许你对容器内的标准输入 (STDIN) 进行交互。
-d: 让容器在后台运行
-P: 容器内部端口随机映射到主机的高端口。
-p: 容器内部端口绑定到指定的主机端口。(如果要绑定 UDP 端口,可以在端口后面加上 /udp。
如 127.0.0.1:5000:5000/udp)
输出状态:
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
https://opsx.alibaba.com/mirror 镜像下载地址
docker logs -f ID/名字 #查看容器内部的标准输出 (= tail -f)
docker history docker.io/centos #查看镜像制作历史
docker inspect docker.io/busybox #查看镜像详细(底层)信息, ENV, Cmd
docker tag docker.io/busybox:latest aaa:latest #修改镜像名称和标签(硬链接)
docker tag docker.io/busybox:latest aaa:123
docker images
docker rmi aaa:123 #删除本地镜像,注:启动容器时删除会提示error
docker rmi aaa:latest
docker rmi docker.io/busybox #前面已启用过,无法删除全部硬链接,会保留一个
docker ps -a
docker restart 4f39084d3910 #重启,只对正在运行的容器
docker stop 4dd07b9d1d42 #关闭容器,后面跟ID
docker start 4dd07b9d1d42 #开启容器,后面跟ID
docker inspect 4dd07b9d1d42 | grep IP #查看镜像详细信息
docker top 4d #查看容器进程列表,后面跟ID,可简写前面几位,要唯一性
docker top 4dd07b9d1d42
docker rm 4d #删除停止状态的容器
docker rm $(docker ps -qa)
docker ps -aq
docker run -it docker.io/centos:latest EXIT退出后
docker ps -a
进入容器:
docker attach d0aaa18486f8 Ctrl + p + q 后台运行 #会接替上帝进入容器, exit退出就会自杀进程关闭容器
docker exec -it d0aaa18486f8 /bin/bash #exit退出都不会关闭容器 ,以其他进程进入容器
docker top d0aaa18486f8 #查看容器进程列表,后面跟ID
docker stop $(docker ps -qa)
docker rm $(docker ps -qa) #删除全部容器(除了在运行的)
redhat Ubuntu rpm = dpkg (dpkg -l 软件名 查看版本; dpkg -L 软件=rpm -ql 软件) yum = apt-get [update 更新源] yum -y install httpd = apt-get install apache2 |
自定义镜像
docker images
先启动容器
[root@docker01 ~]# docker run -it docker.io/centos:latest /bin/bash
改yum源
[root@1a82d9c0cd2a /]# cd /etc/yum.repos.d/
[root@1a82d9c0cd2a yum.repos.d]# rm -rf *
[root@1a82d9c0cd2a yum.repos.d]# cat > loca.repo <<EE
> [local_repo]
> name=CentOS-$releasever - Base
> baseurl="ftp://192.168.5.254/centos-1804"
> enabled=1
> gpgcheck=0
> EE
[root@1a82d9c0cd2a yum.repos.d]# yum repolist
装包 net-tools vim psmisc tree lftp iproute
清空yum仓库 [root@1a82d9c0cd2a yum.repos.d]# yum clean all
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a82d9c0cd2a docker.io/centos:latest "/bin/bash" 7 minutes ago Exited (0) 14 seconds ago high_easley
[root@docker01 ~]# docker commit 1a82d9c0cd2a myos:latest #另存为一个新镜像
sha256:205563548eca0462301e0067eb9db38e967c827a95b2596678ebbb43ae8bcd54
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myos latest 205563548eca 35 seconds ago 285.2 MB
docker.io/centos latest 76d6bc25b8a5 8 months ago 199.7 MB
[root@docker01 ~]# docker run -it myos:latest /bin/bash ---->测试ifcongif pstree vim等命令,然后exit
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b29c6c90d8b myos:latest "/bin/bash" About a minute ago Exited (0) 19 seconds ago cocky_noether
[root@docker01 ~]# docker history myos:latest
IMAGE CREATED CREATED BY SIZE COMMENT
205563548eca 4 minutes ago /bin/bash 85.49 MB
76d6bc25b8a5 8 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 8 months ago /bin/sh -c #(nop) LABEL org.label-schema.sch 0 B
<missing> 8 months ago /bin/sh -c #(nop) ADD file:8f4b3be0c1427b158f 199.7 MB
Dockerfile (封装服务)
• 语法格式
– FROM:基础镜像
– MAINTAINER:镜像创建者信息
– COPY <src>目录或文件 <dest>不存在则自动创建
–VOLUME 用于在image中创建一个挂载点目录,以挂载docker host 上的卷或其他容器上的卷(注:如果挂载点目录路径下此前在文件存在,docker run命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中)
– HEALTHCHECK [OPTION] CMD command(通过在容器内运行命令来检查容器运行状况)健康检查HEALTHCHECK NONE(禁用从基础映像继承的任何运行状况检查)
OPTION选项:--interval=DURATION(default:30s):每隔多长时间探测一次,默认30秒
--timeout=DURATION(default:30s):服务响应超时时长,默认30秒
--start-period=DURATION(default:0s):服务启动多久后开始探测,默认0秒
--retries=N(default:3):认为检测失败几次为宕机,默认3次
返回值:0容器成功是健康的,随时可以使用,1不健康的容器无法正常工作,2保留不使用此退出代码
– EXPOSE <port>/tcp或udp ,用于为容器打开指定要监听的端口以实现与外部通信
– ENV 用于镜像定义所需的环境设置变量,并可被DockerFile文件中位于其后的其他指令(ENV,ADD,COPY)
– ADD:复制文件到镜像,支持使用tar文件和URL路径
– RUN:制作镜像时执行的命令,可以有多个;也可以是json格式数组RUN [
"<executable>"
,
"<param1>"
,
"<param2>"
]
– WORKDIR:定义容器默认工作目录 (解决cd问题),可以出现多次,其路径可以为相对路径,相对此前一个WORKDIR指定的路径
– CMD:容器启动时执行的命令,仅可以有一条CMD
– ONBUILD 用于DockerFile中定义一个触发器,dockerfile用于build映像文件,此映像文件亦可作为base image被另一个DockerFile用作FROM指令的参数,并以之构建新的映像文件,
– USER 用于指定运行image时的或运行DockerFile中任何RUN,CMD或EntRyPoInT指令指定的程序时的用户名或UID,默认情况下,container的运行身份为root用户– ARG类似ENV,定义一个变量,区别于ENV:用户可以在构建时docker build --build-arg <varname> = <value> 进行对变量的修改;ENV不可以
– SHELL 允许覆盖shell命令形式的默认shell,必须JSON格式写入
– STOPSIGNAL 设置将发送到容器出口的系统调用信号,此信号可以是与内核的系统调用表中的位置匹配的有效无符号数,例如9,或者SIGNAME格式的信号名,例如SIGKILL
注:如果你不知道思路怎么写,就运行一个容器进入把你要做的事情手工做一遍
docker build [-t打标签, -cCPU份额(相对权重),-m内存限制,-build-arg设置构建变量,就是构建的时候修改ARG指令的参数] PATH | URL | -
[root@docker01 ~]# mkdir aa
[root@docker01 ~]# cd aa
[root@docker01 aa]# ls
[root@docker01 aa]# vim Dockerfile
FROM docker.io/centos:latest
RUN rm -rf /etc/yum.repos.d/*.repo
ADD docker.repo /etc/yum.repos.d/docker.repo
RUN yum -y install net-tools vim psmisc tree iproute iftp
RUN yum clean all
[root@docker01 aa]# vim docker.repo
[local_repo]
name=CentOS-$releasever - Base
baseurl="ftp://192.168.5.254/centos-1804"
enabled=1
gpgcheck=0
[root@docker01 aa]# docker build -t myos:test .(点表示当前目录)
[root@docker01 aa]# docker run -it myos:test /bin/bash ---> 进入测试ifconfig pstree vim yum源
[root@docker01 ~]# mkdir bb
[root@docker01 ~]# cd bb
[root@docker01 bb]# vim Dockerfile
FROM myos:latest
CMD ["/usr/bin/python"]
[root@docker01 bb]# docker build -t myos:python .
[root@docker01 bb]# docker images
[root@docker01 bb]# docker run -it myos:latest #默认/bin/bash启动命令
[root@abf329e6aecf /]# exit
exit
[root@docker01 bb]# docker run -it myos:python #配置Python启动;命令
Python 2.7.5 (default, Apr 11 2018, 07:36:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> # Ctrl +d 退出
[root@docker01 bb]# cd
[root@docker01 ~]# mkdir cc
[root@docker01 ~]# cd cc
[root@docker01 cc]# vim Dockerfile
FROM myos:latest
RUN yum -y install openssh-server initscripts
RUN sshd-keygen
RUN echo "b" | passwd --stdin root
ENV EnvironmentFile=/etc/sysconfig/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]
[root@docker01 cc]# docker build -t myos:sshd
[root@docker01 cc]# docker run -itd myos:sshd #后台运行
988caf3683b96e492d43d870942ecf2948f3cea67a1473499f9a79a4ee4a574e
[root@docker01 cc]# docker inspect 988caf | grep IP
[root@docker01 cc]# ssh 172.17.0.2
自定义镜像仓库
• 安装私有仓库(服务端)
– yum install docker-distribution
• 启动私有仓库,并设置开机自启动
– systemctl start docker-distribution
– systemctl enable docker-distribution
ss -nutlp | grep 5000
[root@docker01 ~]# curl http://192.168.5.30:5000/v2/
{}[root@docker01 ~]#
• 仓库配置文件及数据存储路径
– /etc/docker-distribution/registry/config.yml
– /var/lib/registry
[root@docker01 ~]# vim /etc/sysconfig/docker
13 ADD_REGISTRY='--add-registry docker01:5000'
24 INSECURE_REGISTRY='--insecure-registry docker01:5000'
[root@docker01 ~]# systemctl stop docker
[root@docker01 ~]# systemctl start docker
[root@docker01 ~]# rsync -av /etc/sysconfig/docker 192.168.5.31:/etc/sysconfig/ 传给docker02
[root@docker01 ~]# vim /etc/hosts
192.168.5.31 docker02
192.168.5.30 docker01
[root@docker01 ~]# rsync /etc/hosts docker02:/etc/hosts
[root@docker01 ~]# docker tag docker.io/centos:latest docker01:5000/centos:latest
[root@docker01 ~]# docker push docker01:5000/centos:latest
docker tag test:python docker01:5000/myos:python ; docker push docker01:5000/myos:python
docker tag htpd:latest docker01:5000/myos:http ; docker push docker01:5000/myos:http
docker tag myos:test docker01:5000/myos:test ; docker push docker01:5000/myos:test
[root@docker02 ~]# systemctl restart docker #配置文件上面已经同步过来了,重启即可
[root@docker02 ~]# systemctl restart docker #远程启动镜像
[root@docker01 v2]# curl http://192.168.5.30:5000/v2/_catalog 查看镜像名称
{"repositories":["centos","myos"]}
[root@docker01 v2]# curl http://192.168.5.30:5000/v2/centos/tags/list #查看某一仓库的标签
[root@docker01 v2]# curl http://192.168.5.30:5000/v2/myos/tags/list
Docker网络拓扑
封装应用环境
docker-machine
Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。
Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。
Docker Machine 管理的虚拟主机可以是机上的,也可以是云供应商,如阿里云,腾讯云,AWS,或 DigitalOcean。
使用 docker-machine 命令,您可以启动,检查,停止和重新启动托管主机,也可以升级 Docker 客户端和守护程序,以及配置 Docker 客户端与您的主机进行通信。
linux安装:
$ base=https://github.com/docker/machine/releases/download/v0.16.0 && curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine && sudo mv /tmp/docker-machine /usr/local/bin/docker-machine && chmod +x /usr/local/bin/docker-machine
$ docker-machine ls
--driver:指定用来创建机器的驱动类型,这里是 virtualbox。
- config:查看当前激活状态 Docker 主机的连接信息。
- creat:创建 Docker 主机
- env:显示连接到某个主机需要的环境变量
- inspect: 以 json 格式输出指定Docker的详细信息
- ip: 获取指定 Docker 主机的地址
- kill: 直接杀死指定的 Docker 主机
- ls: 列出所有的管理主机
- provision: 重新配置指定主机
- regenerate-certs: 为某个主机重新生成 TLS 信息
- restart: 重启指定的主机
- rm: 删除某台 Docker 主机,对应的虚拟机也会被删除
- ssh: 通过 SSH 连接到主机上,执行命令
- scp: 在 Docker 主机之间以及 Docker 主机和本地主机之间通过 scp 远程复制数据
- mount: 使用 SSHFS 从计算机装载或卸载目录
- start: 启动一个指定的 Docker 主机,如果对象是个虚拟机,该虚拟机将被启动
- status: 获取指定 Docker 主机的状态(包括:Running、Paused、Saved、Stopped、Stopping、Starting、Error)等
- stop: 停止一个指定的 Docker 主机
- upgrade: 将一个指定主机的 Docker 版本更新为最新
- url: 获取指定 Docker 主机的监听 URL
- version: 显示 Docker Machine 的版本或者主机 Docker 版本
- help: 显示帮助信息
Swarm集群管理
docker的集群管理工具
它将docker主机池转变为单个虚拟docker主机。
docker swarm提供标准的docker API,所有任何已经与docker守护程序通信的工具都可以使用swarm轻松扩展到多个主机
原理
swarm集群由管理节点(manager)和工作节点(work node)构成
swarm manager:复制整个集群的管理工作包括集群配置,服务管理等所有根集群有关的工作
work node:主要负责运行相应的服务来执行任务(task)
集群部署请自行百度啦啦小编就不贴出来了
docker-compose
compose是一个用于定义和运行多个容器docker应用程序的工具
- 定义你的应用程序环境,DockerFile以便可以在任何地方进行复制。
- 定义构成应用程序的服务,docker-compose.yml以便他们可以在隔离环境中一起运行。
- 最后运行docker-compose up和compose将启动并运行整个应用程序。
docker-compose.yml配置文件详解
version: '2' redis: lb: networks: |
--version 定义版本信息
--services 标签下第二级标签为自定义,服务名称 (类似于docekr container create)
--networks 定义网络信息 (docker network create)
--volumes 定义卷信息 (docker volume create)
--image 指定服务的镜像或者镜像ID,如果不在本地则尝试拉取这个镜像
--build 指定DockerFile所在的文件夹路径,compose会利用它自动构建镜像并使用
相对路径: build: ./dir
设定上下文根目录,然后以改目录为指定的DockerFile
build:
context: ../
dockerfile: path/of/DockerFile
args:
- buildno=1
- password=secret # 第一种写法
group: abc #第二种写法
- user #空值
如果同时指定image和build那么会构建镜像并且命名为image后面的那个名字
args 在构建过程中指定环境变量,但是在构建成功后取消,前面的"-"不加也是支持的,与ENV不同的是它允许空值
YAML的布尔值(true,false,yes,no,on,off)必须使用引号引起来,否则会当成字符串解析。
--command 覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
也可以写成类似DockerFlie中的格式:command: [bundle, exec, thin, -p, 3000]
--container_name 容器的命名
--depends_on 解决容器的依赖,启动先后的问题。先启动标签内的服务后启<服务名称>
--dns
dns: 8.8.8.8
dns: #也可以是一个列表
- 8.8.8.8
- 9.9.9.9
--dns_search的配置语法同上有2中写法,配置DNS搜索域
dns_search: example.com
--tmpfs 挂载临时目录到容器内部,与run的参数一样效果
--entrypoint 指定接入点,在docker-compose.yml定义接入点,覆盖DockerFile中的定义
1)entrypoint: /code/entrypoint.sh
2)entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php.....
--end_file 从.env文件中获取环境变量,可以为单独的文件路径或列表
--environment 和arg类似,设置镜像变量,可以保存变量到镜像里面,启动容器也会包含这些变量设置
--expose 与DockerFile的EXPOSE一样,指定暴露端口,但不映射宿主机,只被连接的服务访问,实际上端口映射还得ports来
--ports 宿主端口:容器端口(HOST:CONTARNER)或仅仅指定容器的端口,宿主将会随机选择端口
--external_links 让compose项目里的容器连接到项目配置外部的容器(前提外部容器至少有一个是连接到与项目内部服务的同一个网络里面)
--labels 可以添加容器辅助说明
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com.startupteam.release: "rc3 for v1.0"
--extra_hosts 指定额外的host名称映射信息
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
启动后在服务容器中/etc/hosts文件添加以下条目
8.8.8.8 googledns
52.1.157.61 dockerhub
--alias 网络上此服务的别名(备用主机名)。同一网络上的其他容器可以使用服务名称或此别名连接到其中一个服务的容器
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
--healthcheck 通过命令检查容器是否健康运行
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
--logging 配置日志选项
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
driver支持三种日志驱动类型:"json-file", "syslog", "none"
options配置日志驱动的参数: max-size: "200k" , max-file: "10"
--volumes 数据卷所挂载路径设置,可以设置宿主机路径或加上访问模式
--volumes_from 从另一个服务或者容器挂载它的所以卷
- service_name
- container_name
--sysctls 配置容器内核参数
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
--ulimits 指定容器的ulimits限制值
--extends 基于已有的服务进行扩展,
原有服务webapp,common.yml模板文件如下 webapp: build: ./webapp environment: - DEBUG=false - SEND_EMAILS=false | 编写一个新的development.yml,进行扩展 web: extends: file: common.yml service: webapp ports: - "8000:8000" links: - db image: postgres 后者会自动继承common.yml中的webapp服务相关环节变量 |
--net 设置网络模式(使用和docker client 的--net的参数一样) net: "bridge", "none" , "container:[name or id]", "host".
--pid 跟主机系统共享进程命名空间,打开该选项的容器可以相互通过进程ID来访问和操作
--cap_add,cap_drop 添加或放弃容器的linux能力
cap_add:
– ALL
cap_drop:
– NET_ADMIN
– SYS_ADMIN