docker技术入门与实战 第三版
docker技术入门与实战 第三版
第一章 初识Docker与容器
Docker的优势:
更快的交付和部署:通过镜像快速构建开发环境。测试和运维人员可以将其快速部署。
更高效的资源利用:作为内核级别的虚拟化,资源需求更低。
更轻松的迁移和扩展:可以在几乎任何平台运行。
更简单的更新管理:通过Dockerfile只需要小的配置修改,修改以增量的方式进行分发和更新。
Docker与虚拟机比较:
Docker容器启动和停止更快。
Docker容器对系统资源需求更少。
Docker通过类似git理念方便用户获取、分发和更新镜像,存储复用,增量更新。
Docker通过Dockerfile支持灵活的自动化创建和部署机制。
第二章 核心概念与安装配置
Docker镜像:类似虚拟机镜像,作为只读的模板。(可以只包含某个操作系统和某个应用)
Docker容器:类似轻量级的沙盒,Docker利用容器来运行和隔离应用。
镜像自身是只读的。容器从镜像启动时,会在最上层创建一个可写层。
Docker仓库:类似于代码仓库,集中存放镜像文件的地方。
仓库注册服务器(Registry)是存放仓库的地方。如图2-1,内部放了Ubuntu仓库和CentOs仓库,Ubuntu仓库放了多个镜像版本。
2. 添加gpg密钥
3. 确认导入的指纹
sudo apt-key fingerprint 0EBFCD88
4. 获取当前操作系统代号 (16.04 LTS代号:xenial,18.04 LTS代号:bionic)
配置Docker服务
1. 为了避免每次使用Docker命令都切换到特权身份,将当前用户加入docker用户组
第三章 使用Docker镜像
获取镜像:docker [image] pull NAME[:TAG]
NAME为镜像仓库名称,TAG为镜像标签(版本)。不指定TAG默认下载最新版本
例如:docker pull ubuntu:18.04
pull子命令:
-a,-all-tags=true|false 是否获取所有镜像,默认否
不同镜像仓库服务器可能出现镜像重名,严格将需要添加仓库地址(registry,注册服务器)作为前缀。
因此补全命令为:docker pull registry.hub.docker.com/ubuntu:18.04
使用镜像:docker run -it ubuntu:18.04 bash
查看镜像信息:docker images 或者 docker image ls
信息包括:属于哪个仓库、标签信息、镜像的ID、创建时间、镜像大小。
images子命令 | 默认 | 作用 |
-a, -all=true|false | 否 | 列出所有镜像文件 |
--digests=true|false | 否 | 列出镜像的数字摘要值 |
-f, --filter=[] | 过滤列出镜像 | |
--formate="TEMPLATE" | 控制输出格式 | |
--no-trunc=true|false | 是 |
结果太长部分是否截断 |
-q, --quiet=true|false | 否 | 仅输出ID |
tag命令增加镜像标签:docker tag ubuntu:latest myubuntu:latest
docker inspect ubuntu:18.04 可以看到镜像的详细信息,各层次的数字摘要
docker history ubuntu:18.04 可以看到镜像创建的过程
搜寻镜像:docker search [option] keyword
-f, --filter : 过滤内容
--format :格式化输出
--limit int :限制输出个数
--no-trunc :不截断
删除和清理镜像:
1. 使用标签删除:docker rmi或者docker image rm可以删除镜像。
-f, -force:强制删除,即使有容器依赖他
-no-prune:不清理未带标签的父镜像
如:docker rmi myubuntu:latest
2. 使用镜像ID删除:docker rmi ID 会先删除所有指向该镜像的标签,然后删除镜像本身。
当存在容器使用时(即使已经结束),也无法删除,但可以采用-f强制删除。一般做法为先删除依赖的容器,在删除镜像。
docker rm 容器ID
3. 清理镜像:对于遗留的镜像文件 使用docker image prune可以进行清理。
创建镜像:
1. 基于已有容器创建(commit)
docker [container] commit命令格式为:docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
选项 | 默认 | 作用 |
-a, --auther="" | 作者信息 | |
-c, --change=[] |
执行Dockerfile文件 CMD | ENTRYPOINT | ENV | EXPOSE | LABEL | ONBUILD | USER | VOLUME | WORKDIR |
|
-m, --message="" | 提交信息 | |
-p, --pause=true | 提交时暂停容器运行 |
如图,通过ubuntu镜像建立容器,进行改变。将改变后的容器建立镜像。
docker [container] commit -m "Add test file" -a "LMH" 4bb9667e7949 test:0.1
2. 基于本地模板导入(import)
docker [container] import,基于docker [image] import [OPTIONS] file|URL| -[REPOSITORY[:TAG] ]
3. 基于Dockerfile导入(build)
Dockerfile作为文本文件,描述了基于父镜像创建新镜像的过程。
通过docker [image] build基于Dockerfile创建镜像。
例如:docker build -t python:3 创建出一个python:3的镜像
存出和载入镜像
1.存储镜像
docker [image] save命令, 支持-o, -output string
例如:docker save -o ubuntu_18.04.tar ubuntu:18.04
2.载入镜像
例如:docker load -i ubuntu_18.04.tar
上传镜像
docker [image] push 命令上传镜像到仓库。补全为docker [image] push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
例如:docker push user/test:latest
第四章 操作Docker容器
创建容器:create,start,run,wait,logs子命令
1. 新建容器
docker [container] create 创建一个容器
例如:docker create -it ubuntu:latest
docker ps -a 用于 查询容器状态
2. 启动容器
docker [container] start 命令用于启动
例如:docker start NAME
3. 新建并启动容器
docker [container] run 等价于先create再start
例如:docker run ubuntu /bin/echo 'Hello world'
执行run创建并启动容器时,会依次执行:
(1 检测是否存在指定镜像,不存在则从公有仓库下载
(2 利用镜像创建一个容器,并启动该容器
(3 分配一个文件系统给容器,并在只读的镜像层外挂载一层可读写层
(4 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中
(5 配置一个IP给容器
(6 执行用户指定的应用程序
(7 执行完毕后容器被终止
例如:docker run -it ubuntu:18.04 /bin/bash 启动一个bash终端
当run执行时出错,可能导致容器直接退出:
(125:Docker daemon执行出差,如执行了不支持的Docker命令参数
(126:命令无法执行,如权限出错
(127:容器内命令找不到
4. 守护态运行
有时需要Docker容器在后台以守护态运行,可以通过-d实现。
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
5. 查看容器输出
docker logs NAME
停止容器:pause/unpause, stop, prune
1. 暂停容器
docker [container] pause CONTAINER 来暂停容器
例如:docker run --name test --rm -it ubuntu bash
docker pause test
处于pause状态的容器可以通过docker [container] unpause CONTAINER恢复到运行状态
例如:docker unpause test
2. 终止容器
docker [container] stop 来终止一个容器
例如:docker stop test
docker start test 可以重新启动
docker restart test 会关闭再启动
若此时执行docker container prune命令,会自动清理所有处于终止状态的容器
3. 进入容器
若使用-d,容器会自动进入后台,无法查看容器信息,也无法操作。
(1. attach命令
docker [container] attach [--detach-keys=[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
--detach-keys:用于指定退出attach的快捷键,默认CTRL-P CTRL-Q
--no-stdin:是否关闭标准输入,默认开启
--sig-proxy:是否代理收到系统信号给应用
如:docker run -itd ubuntu
docker attach NAME
attch命令会使得所有attach到同一个容器的窗口,同步显示内容。
(2. exec命令
docker [container] exec CONTAINER COMMAND
例如:docker exec -it DOCKER_ID /bin/bash
4. 删除容器
docker [container] rm CONTAINER用来删除终止或退出状态的容器
5. 导入和导出容器
(1 导出容器
docker [container] export [-o|--output[=""]] CONTAINER
例如:docker export -o test_for_run.tar test
(2. 导入容器
docker [container] import 变成镜像
例如:docker import test_for_run.tar - test/ubuntu:v1.0
6. 查看容器
(1.查看容器详情
docker container inspect [OPTIONS] CONTAINER
例如:docker container inspect test
(2.查看容器内进程
docker [container] top [OPTIONS] CONTAINER
例如:docker top test
(3. 查看统计信息
docker [container] stats [OPTIONS] [CONTAIENR] 显示CPU,内存,存储,网络等
7. 其他容器命令
(1. 复制文件
docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
例如(本地路径data复制到test容器的/tmp下):docker [container] cp data test:/tmp/
(2. 查看变更
container diff查看容器内文件系统的变更
例如:docker container diff test
(3. 查看端口映射
container port
例如:docker container port test
(4. 更新配置
container update
第五章 访问Docker仓库
对于仓库(Repository)是集中存放镜像的地方,又分公共仓库和私有仓库
对于注册服务器是存放仓库的具体服务器。
例如:private-docker.com/ubuntu来说,private-docker.com是注册服务器地址,ubuntu是仓库名
1. Docker Hub公共镜像市场
https://hub.docker.com
(1. 登录
docker login完成注册和登录
注册登录后可以将个人镜像上传
(2. 基本操作
无需登录可以执行:
docker search命令可以寻找官方仓库的镜像
docker pull命令进行下载
(3. 自动创建
自动跟随代码的变更而重新构建镜像
2. 第三方镜像仓库
(1. 查看镜像
去(阿里云、腾讯云、网易云)网站查看即可
(2. 下载镜像
仍然为 docker pull
3. 搭建本地私有仓库
(1. 使用registry镜像创建私有仓库
docker run -d -p 5000:5000 registry:2
(2. 管理私有仓库
对于一个镜像,通过tag改名
docker tag ubuntu:18.04 IP:端口号/镜像名
通过push上传
docker push IP:端口号/镜像名
通过curl查询
curl http://IP:端口号/v2/search
通过重启以便下载
sudo service docker restart
docker pull IP:端口号/镜像名
第六章 Docker数据管理
6.1. 数据卷:可以在容器之间共享和重用,容器间传递数据变得高效与方便
数据卷内数据修改会立即生效,无论容器还是本地操作
数据卷的更新不会影响镜像,解耦开应用和数据
卷会一直存在,直到没有容器使用,可以安全的卸载
1. 创建数据卷
docker volume create -d local test
在/var/lib/docker/volume下,可以看到数据卷的位置
2. 绑定数据卷
除了volume可以在创建容器时,挂载主机本地任意路径到容器内作为数据卷
docker run时可以用 -mount使用数据卷。分为volume(普通数据卷,在/var/lib/docker/volume目录),bind(绑定数据卷,在指定目录),tmpfs(临时数据卷,在内存)
使用training/webapp镜像创建一个Web容器,并挂载到容器/opt/webapp目录
docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp training/webapp python app.py
等同于使用-v
docker run -d -P --name web -v /webapp:/opt/webapp training/webapp python app.py
默认权限是(rw),可以由此改成只读(ro)
docker run -d -P --name web -v /webapp:/opt/webapp training/webapp:ro python app.py
6.2 数据卷容器
数据卷容器作为容器,专门提供数据卷给其他容器挂载
首先,创建一个数据卷容器,并创建数据卷挂载到/dbdata
docker run -it -v /dbdata --name dbdata ubuntu
接下来,通过--volumes-from挂在dbdata容器的数据集
第七章 端口映射与容器互联
7.1 端口映射容器访问
1. 外部访问容器内部应用
若需要外部通过网络访问容器内部,需要-p或-P指定端口。
其中-P会随机一个端口到容器内部作为网络端口
docker run -d -P training/webapp python app.py
-p 可以进行指定 IP:HostPort:ContainerPort | IP::ContainerPort | HostPort:ConotainerPort
2. 映射所有接口地址
通过HostPort:ConotainerPort 将本地端口5000映射到容器端口5000,此时会默认将本地所有地址映射到容器所有地址。
docker run -d -p 5000:5000 training/webapp python app.py
3. 映射到指定地址的指定端口
可以使用IP:HostPort:ContainerPort 格式映射使用一个特殊地址,如127.0.0.1
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
4. 映射到指定地址的任意端口
IP::ContainerPort 则可以绑定localhost任意端口到容器的5000
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
5. 查看映射端口配置
docker port
7.2 互联网机制实现便捷互访
容器的互联(linking)用于多个容器中的应用快速交互的方式,可以通过容器名快速访问,而不用指定具体IP。
1. 自定义容器命名
--name可以对容器进行命名
不同容器不能使用相同名称,因此只有删除同名后才可以再次命名。
docker run的时候如果添加--rm则会在容器终止后自动删除,因此--rm和-d不能同时使用
2. 容器互联
--link可以让容器之间安全的进行交互,格式--link name:alias其中alias是别名
创建数据库容器:docker run -d --name db training/postgres
创建web容器,并连接db:docker run -d -P --name web --link db:db training/webapp python app.py
Docker 通过两种方式公开链接信息:
env命令查看:docker run --rm --name web2 --link db:db training/webapp env
查看host文件:docker run -t -i --rm --link db:db training/webapp /bin/bash
cat /etc/hosts
第八章 使用Dockerfile创建镜像
作为文本格式的配置文件,可以快速创建自定义镜像
8.1基本结构
主体内容:基础镜像信息,维护者信息,镜像操作指令,容器启动时执行指令
FROM指出基于的镜像名称,LABEL指出维护者信息,RUN指令执行命令(每一条RUN,镜像增加一层),CMD指运行容器时的操作命令。
如:debian:jessie基础镜像基础上安装Nginx环境
8.2 指令说明:
1. ARG
定义创建镜像过程使用的变量,镜像编译成功后,ARG指定的变量就不再存在。
2. FROM
指定所创建镜像的基础镜像
例如:ARG VERSSION=9.3
FROM debian:${VERSION}
3. LABEL
添加辅助信息
例如:LABEL version="1.0.0-rc3"
4. EXPOSE
声明镜像内服务监听的端口(只会声明,并不会完成端口的映射)
EXPOSE <port>
例如:EXPOSE 22 80 8443
5. ENV
指定环境变量,生成过程中会被后续RUN使用,启动的容器也会存在
格式:ENV <key> <value>
例如:ENV APP_VERSION=1.0.0
一条ENV赋值多个变量,会都赋值后再更新。
6. ENTRYPOINT
默认入口命令,启动容器时会作为根命令执行。
两种格式:ENTRYPOINT ["executable","param1","param2"]; exec调用执行
ENTRYPOINT command param1 param2; shell执行
7. VOLUME
创建一个数据挂载点
VOLUME ["/data"]
8. USER
指定运行容器时的用户名或UID
格式:USER daemon
9. WORKDIR
为RUN,CMD,ENTRYPOINT指令配置工作目录。相对路径会基于之前命令。
格式:WORKDIR /path/to/workdir
例如:WORKDIR /a
WORKDIR b
10. ONBUILD
指定当生成镜像创建子镜像时,自动执行的命令指令。
格式:ONBUILD [INSTRUCTION]
例如:ONBUILD ADD . /app/src
11. STOPSIGNAL
停止所创建镜像启动的容器接受退出信号
STOPSIGNAL signal
12. HEALTHCHECK
配置所启动容器如何进行健康检查
格式:HEALTHCHECK [OPTIONS] CMD command : 根据返回值是否为0判断
HEALTHCHECK NONE:禁止健康检查
13. SHELL
指定其他命令使用shell的类型
SHELL ["executable", "parameters"]
默认值["/bin/bash","-c"]
8.2操作指令
1.RUN
格式:RUN <command>或 RUN ["executable", "parameter1", "parameter2"]
两种格式,前者默认在shell终端执行,后者则可以采用其他终端类型。
每条RUN都会执行命令后,提交为新的镜像层。命令较长可以 \ 来换行
2. CMD
指定启动容器时默认执行的命令。每个Dockerfile只有最后一个CMD被执行
格式:CMD ["executable", "param1", "param2"] 任意终端
CMD command param1, param2 shell执行
CMD ["param1", "param2"] 提供给ENTRYPOINT的默认参数
3. ADD
添加内容到镜像
格式:ADD <src> <dest>
复制src下内容,到容器dest下。
4. COPY
复制内容到镜像
COPY <src> <dest>
类似ADD。
8.3 创建镜像
读取指定目录下的Dockerfile
格式:docker [image] build
docker build [OPTIONS] PATH | URL | -
例如:docker build -t builder/first_image:1.0.0 /tmp/docker_builder/ (-t为标签)
命令选项:
选择父镜像:分为基础镜像和普通镜像。基础镜像往往处于镜像树的根位置。
使用.dockerignore文件:该文件用于忽略匹配路径或文件
第23章 Docker三剑客之Machine
负责Docker容器的第一步,在多种平台上快速安装和维护Docker运行环境。
23.1 Machine简介
Machine负责对Docker进行安装和管理。
基本功能:在指定节点和平台安装Docker引擎,配置为可使用Docker的环境。
集中管理所安装的Docker环境。
23.2 安装Machine
1. Linux平台安装
sudo curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` > docker-machine
sudo mv docker-machine /usr/local/bin/docker-machine
sudo chmod +x /usr/local/bin/docker-machine
安装后检测版本
docker-machine -v
23.3 使用Machine
1. 虚拟机:通过virtualbox(提前安装)驱动启动一个虚拟环境
例如(启动):docker-machine create --driver=virtualbox test
(查看配置信息):docker-machine env test
(停止):docker-machine stop test
2. 本地主机:适合主机操作系统和SSH服务都安装好。需要确保本地主机可以ssh到目标主机。
docker-machine create -d generic --generic-ip-address=10.0.100.102 --generic-ssh-user=user test
可以看出,Machine通过SSH连接到指定节点,并安装了Docker引擎
3. 云平台驱动:配置其上的虚拟机为Docker主机
docker-machine create --dirver amazonec2.......
4. 客户端配置
默认配置都会在:~/.docker/machine/machines/路径下
23.4 Machine命令
docker machine <COMMAND> -h
1. active:查看当前激活状态的Docker主机,激活状态意味着DOCKER_HOST环境变量指向该主机。
格式:docker-machine active [arg...]
docker-machine active
2. config:查看Docker主机的配置信息
格式:docker-machine config [OPTIONS] [arg...]
docker-machine config dev
3. create:创建一个Docker主机环境
格式:docker-machine create [OPTIONS] [arg..,]
4. env:显示环境变量
格式:docker-machine env [OPTIONS] [arg...]
5. inspect:以json形式显示主机详细信息
格式:docker-machine inspect [OPTIONS] [arg...]
6. ip:获取Docker 主机地址
例如(获取default的地址):docker-machine ip default
7. kill:杀死Docker主机
8. ls:列出所有管理的主机
docker-machine ls [OPTIONS] [arg...]
第24章 Docker 三剑客之Compose
24.1 Compose简介
定位:定义和运行多个Docker容器的应用。
Compse允许通过一个docker-compose.yml模板文件来定义一组关联的应用容器为一个服务栈。
Compose重要概念:任务(task):一个容器称为一个任务,具有独一无二ID。
服务(service):某个相同容器镜像的容器副本集合,一个服务可以横向扩展为多个容器实例。
服务栈(stack):多个服务组成,相互配合。
24.2 安装与卸载
1. pip安装
安装:sudo pip install -U docker-compose
检测,并查看用法:docker-compose -h
2. 二进制包
sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod a+x /usr/local/bin/docker-compose
查看版本,以及是否成功:docker-compose version
3. 容器中执行(不会破坏环境,更适合云场景)
curl -L https://github.com/docker/compose/releases/download/1.19.0/run.sh > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
run.sh则是下载了docker/compose镜像并运行
4. 卸载
二进制包安装:sudo rm /usr/local/bin/docker-compose
pip安装:sudo pip uninstall docker-compose
24.3 Compose 模板文件
默认的模板文件名docker-compose.yml,格式YAML,最新版本为v3
版本1中每个顶级元素为服务名,次级元素为容器配置信息
版本3可以声明网络、存储信息,又增加了版本信息,并且服务都放置在services根下
1. build
指定Dockerfile所在文件夹的路径,或者相对docker-compose.yml文件的路径。
version: '3' services: app: build context: /path/to/build/dir dockerfile: Dockerfile-app lables: version: "2.0" released: "true" shm_size: '2gb' args: key: value name: myApp cache_from: - myApp:1.0
2. cap_add, cap_drop
指定容器的内核能力分配。
例如(指定拥有所有能力):
cap_add:
- ALL
去掉NET_ADMIn能力:
cap_drop:
- NET_ADMIN
3. command
覆盖容器启动后默认执行的命令:
command: echo "hello world"
command: ["bash", "-c", "echo", "hello world"]
4. configs
在Docker Swarm模式下,通过configs来管理和访问非敏感的配置信息。
5. cgroup_parent
指定父cgroup组,意味着将继承其资源限制。
cgroup_parent: cgroups_1
6. container_name
指定容器名,默认会使用 “项目名称_服务名称_序号”
container_name: docker-web-container
特别注意:指定容器名称后,该服务无法进行扩展,因为Docker不允许容器重名。
7. devices
指定设备映射
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"
8. depends_on
指定服务的依赖关系,会先启动被依赖的服务。
depends_on: db
9. dns
自定义dns服务器。可以是一个值,也可以是一个列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
10. dns_search
配置DNS搜索域。可以是一个值,也可以是一个列表。
dns_search: example.com
11. dockerfile
指定额外的编译镜像的Dockerfile
dockerfile: Dockerfile-alternate
12. entrypoint
覆盖容器默认的入口命令。会覆盖默认的启动命令。
entrypoint: python app.py
13. env_file
从文件获取环境变量,路径会基于模板文件路径。可以是一个值,也可以是一个列表。
env_file: .env
14. environment
设置环境变量,数组或字典的方式。
environment:
RACK_ENV: development
SESSION_SECRET:
或者
environment:
- RACK_ENV=development
- SESSION_SECRET
15. expose
暴露端口,但不映射宿主机。
expose:
- "3000"
- "8000"
16. extend
基于其他模板文件进行扩展。
如:已经实现基础模板文件common.yml内部服务webapp
再次编写development.yml文件。
web:
extends:
file: common.yml
service: webapp
....
使用extend避免产生循环依赖。extend不会继承links和volumes_from
17. external_links
链接到外部容器,甚至并非Compose管理的外部容器
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
18. extra_hosts
类似Docker中的--add-host参数,指定额外的host名称映射信息
extra_hosts:
- "googledns:8.8.8.8"
19. healthcheck
指定检测健康状态的机制,包括:检测方法、间隔、超时、重试次数、启动等待时间。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 30s
timeout: 15s
retries: 3
start_period: 30s
20. image
指定为镜像名称,或镜像id。如果本地不存在,Compose将会尝试去拉取。
image: ubuntu
21. isolation
配置容器隔离机制:default、process、hyperv。
22. lables
添加Docker元数据信息。
labels:
XXXX....
23. links
links作为旧的用法,之后可能被移除
连接到其他服务中的容器。格式可以为:服务器名 或者 服务器名:服务器别名
links:
- db
- db:database
- redis
使用的别名将在服务容器中/etc/hosts里创建。
24. logging
日志相关配置
logging.driver:日志驱动类型。
三种类型:
driver: "json-file"
driver: "syslog"
driver: "none"
25. network_mode
设置网络模式。使用和docker client的--net参数一样的值。分为:none, bridge, host, service:[service name], container:[name or id]
network_mode: "none"
26. networks
定义网络信息
27. pid
跟主机系统共享进程命名空间。打开该选项的容器之间,容器和主机之间可以通过进行ID进行访问。
pid: "host"
28. ports
暴露端口信息
使用宿主:容器(HOST:CONTAINER),或仅仅指定容器的端口,主机随机选择。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
29. secrets
配置蜜蜜数据。指定来源秘密,挂载后名称,权限等。
30. security_opt
指定容器模板标签机制的默认属性(用户、角色、类型、级别等)。
security_opt:
- label:user:USER
- label:role:ROLE
31. stop_grace_period
指定应用停止时的期限。过期后通过SIGKILL退出。
32. stop_signal
指定停止容器的信号,默认SIGTERM
33. sysctls
配置容器内的内核参数。
sysctls:
net.core.somaxconn: 4096
net.ipv4.tcp_syncookies: 1
34. ulimits
指定容器的ulimits限制。如进程数、文件句柄软硬限制。
35. userns_ mode
指定用户命名空间模式
userns_mode: "host"
36. volumes
数据卷所挂载路径设置。(HOST:CONTAINER),(HOST:CONTAINER:ro)
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
37. restart
指定重启策略:no(不重启)、always(总是)、on-failure(失败时)、unless-stopped(除非停止)。
restart: unless-stopped
38. deploy
指定部署和运行时的容器相关配置。包括:endpoint_mode、lables、mode、placement、replicas、resources、restart_policy、update_config等
(1)endpoint_mode
指定服务端点模式:vip:将会分配一个前端的虚拟地址,客户端访问时无需关心后端容器个数
dnsr:分配一个域名给服务器,访问域名时会轮询的返回容器地址。
(2)lables
指定服务器的标签
(3)mode
容器的副本模式:global:每个节点只有一个该应用容器。
replicated:集群中存在指定份数的应用容器副本。
(4)placement
定义容器放置的限制(哪些节点可以放)和配置(分配策略)。
(5)replicas
在mode为replicated时,设置副本个数
(6)resources
指定资源:CPU、内存等。
(7)restart_policy
指定容器重启策略。
(8)update_config
当容器需要更新时,该配置为更新的行为。
39. 其他指令
40. 读取环境变量
动态读取主机的系统环境变量
41. 扩展性
支持用户自定义的扩展字段
24.4 Compose命令说明
大部分的命令可以是项目本身,项目的服务或者容器。
格式:docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
1. build
构建项目中的服务容器
格式:docker-compose build [options] [SERVICE...]
2. bundle
创建一个可分发的配置包
格式:docker-compose bundle [options]
3. config
校验和查看Compose文件的配置信息。
格式:docker-compose config [options]
4. down
停止服务栈,并删除相关资源。
格式:docker-compose down [options]
5. events
监控容器的事件信息。
格式:docker-compose events [options] [SERVICE...]
6. exec
在一个运行内的容器执行指定命令
格式:docker-compose exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]
7. help
获得命令帮助
8. images
列出服务所创建的镜像
9. kill
发送SIGKILL信号强制停止服务容器
10. logs
查看服务容器的输出。
格式:docker-compose logs [options] [SERVICE...]
11. pause
暂停一个服务容器
格式:docker-compose pause [SERVICE...]
12. port
打印某个容器端口所映射的公共端口
格式:docker-compose port [options] SERVICE PRIVATE_PORT
13. ps
列出目前所有容器
格式:docker-compose ps [options] [SERVICE...]
14. pull
拉取服务依赖的镜像
格式:docker-compose pull [options] [SERVICE...]
15. push
推送服务创建的镜像到镜像仓库
格式:docker-compose push [options] [SERVICE...]
16. restart
重启项目的服务
格式:docker-compose restart [options] [SERVICE...]
17. rm
删除所有(停止状态的)容器
格式:docker-compose rm [options] [SERVICE...]
18. run
指定服务上执行一个命令
格式:docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
例如:docker-compose run ubuntu ping docker.com
19. scale
设置指定服务运行的容器个数
格式:docker-compose scale [options] [SERVICE=NUM...]
20. start
启动已存在的服务容器
格式:docker-compose start [SERVICE...]
21. stop
停止运行状态的容器
格式:docker-compose stop [options] [SERVICE...]
22. top
显示服务栈中正在运行的进程信息
格式:docker-compose top [SERVICE...]
23. unpause
恢复处于暂停状态的容器
格式:docker-compose unpause[SERVICE...]
24. up
尝试自动完成:构建镜像、创建服务、启动服务、开关联服务相关容器的一系列操作。
格式:docker-compose up [options] [SERVICE...]
25. version
打印版本信息
格式:docker-compose version
24.5 Compose环境变量
第27章 Kubernetes 生产级容器集群平台
Kubernete是Google于2014年开源的容器集群管理项目。
Kubernete作为分布式容器集群系统,优势:
优秀的API设计,简洁高效的架构设计,少量的主要组件,彼此通过接口调用。
基于微服务模式的多层资源抽象,兼顾灵活性与可操作性。
可拓展性好,模块化容易替换,伸缩能力极佳。
自动化程度高。
部署支持多个环境。
支持丰富的运维和配置工具。
自带控制台、客户端命令等工具。
27.2核心概念
Kubernete中每个对象拥有一个对应的声明式API。对象包括三大属性:元数据(metadata),规范(spec),状态(status)。
每个对象可以用一个json或yaml来定义,每个模板文件中定义了apiVersion、kind、metadata、spec等信息。
资源抽象对象:
容器组(Pod):作为最小的资源单位。由位于同一节点的若干容器组成,彼此共享网络命名空间和存储卷。Pod是短暂,随时可变,通常无状态。
一般每个Pod除了应用容器外,还有一个初始的pause容器,用于完成网络和存储空间的初始化。
服务(Service):对外提供某个特定功能的一组Pod和所关联的访问配置。
由于Pod地址不同,而且可能改变,因此通过服务提供唯一固定的地址。用户不需要关心具体的Pod信息。
存储卷(Volume):提供数据持久化存储。支持多种本地和云存储类型。
命名空间(Namespace):通过命名空间来实现虚拟化,将同一组物力资源虚拟为不同的抽象集群,避免不同租户的资源发生命名冲突。
控制器抽象对象:
副本集(ReplicaSet):旧版本叫做复制控制器。副本集作为Pod的抽象,让集群中维持指定个数的实例。操作相对底层,不推荐使用。
部署(Deployment):比副本集更高级的抽象,可以管理Pod或副本集。相对方便,推荐使用。
状态集(StatefulSet):管理带有状态的应用。可以为Pod分配独一无二的身份。确保重新调配时不会相互替换。
Daemon集(DaemonSet):确保节点上运行某个Pod,一般用来收集日志、监控节点、提供存储使用。
任务(Job):适用短期处理场景,创建若干Pod,并确保给定数目的Pod正常退出。
横向Pod扩展器(Horizontal Pod Autoscaler, HPA):类似云里面的自动扩展组,根据Pod使用率自动调整Pod数目。
入口控制器(Ingress Controller):定义访问集群中资源的一组规则,用来提供七层代理和负载均衡服务。
管理资源相关的辅助概念:
标签(Label):键值对,标记在资源对象上。
选择器(Selector):基于标签的正则表达式,用于筛选。
注解(Annotation):键值对,存放大量任意数据,一般是对象详细说明。
秘密数据(Secret):存放敏感数据,如认证的口令。
名字(Name):用户提供给资源的别名。
持久化存储(Persistent):确保数据不会丢失。
资源限额(Resource Quotas):限制某个命名空间下对资源的使用,逐渐提供多租户支持。
安全上下文(Security Context):应用到容器上的系统安全配置。
服务账号(Service Accounts):操作资源的用户账号。
27.3 资源抽象对象
Kubernete对集群资源进行不同级别的抽象,每个资源都是一个REST对象,通过API操作,通过json和yaml定义。
1. 容器组
Kubernete下最小的管理单位是容器组(Pod)。容器组由一到多个容器构成,围绕进行:创建、调度、停止等生命周期管理。
同一个容器组下,容器共享命名空间、cgroups限制和存储卷。因此内部应用可以很方便的进行访问。相当于一个虚拟机,多个不同的进程。
容器组既保持了容器的轻量解耦,又提供了调度操作的便利性。
生命周期:
待定:已经被系统接收,等待镜像。
运行:已经分配到节点,容器都被创建,至少一个容器在运行。
成功:所有容器都已经退出,不需要重启,任务完成。
失败:所有容器都已经退出,至少一个容器非正常退出。
未知:未知状态,例如节点无法汇报状态。
2. 服务
Kubernete主要面向对象是持有运行并无状态的。
服务主要解决Pod地址可变问题(因为Pod可能会失败并在其他节点重启)。
如:网站的后端服务,多个节点启动Pod,组成一个服务。前端只需要服务的唯一一个虚拟地址即可,并不关心发送到哪个Pod。
根据访问的不同,服务类型分为:
ClusterIP:提供一个集群内部的地址,只能在集群内部解析和访问。(默认的服务类型)
NodePort:每个节点上映射服务到一个静态的本地端口。外部可以访问,路由到内部自动创建ClusterIP。
LoadBalancer:使用外部路由服务,自动路由访问到自动创建的NodePort和ClusterIP。
ExternalName:将服务映射到指定地址。
3. 存储卷
存储卷(Volume)即容器内部挂载的数据卷,与Pod有一致的声明周期。
常见的数据卷类型:
emptyDir:Pod创建时在节点上创建一个控的挂载目录,节点离开时自动删除其数据。
hostPath:节点上存在的目录挂载到Pod中,Pod退出后也会保留。
gcePersistentDisk:使用GCE服务。保留数据
awsElasticBlockStore:使用AWS的EBS Volume服务。保留数据。
nfs:使用NFS网络存储,也会持久化数据。
gitRepo:挂载空目录到Pod,clone指定的git仓库代码到里面,试用直接从仓库某代码进行部署。
secret:传递敏感数据,基于内存的tmpfs,挂载临时秘密文件。
27.4 控制器抽象对象
1. 副本集和部署
由于Pod资源随时可能故障,Kubernete不需要保证Pod的运行,而且失败后的重新生成。需要通过 复制控制器 来实现这一功能。
用户申请容器组后,复制控制器将负责调度容器到某个节点上,并保证给定份数(replica)运行正常。Pod数多则终止,少则创建。
2. 状态集
通常,容器的应用不带有状态,部署同一个应用的多个Pod彼此可以替换,生命周期也较短。因此,无状态的应用只关心数据,不关心名称、位置等。
而某些应用需要关心Pod的状态(数据库和配置服务等),挂载独立的存储等。一旦Pod故障退出,需要创建同名Pod,并挂载原来的存储,以便继续执行,实现了高可用。
3. Daemon集
适合于长期运行在后台的伺服类型应用,如:节点采集日志等。
Daemon集会确保指定的一类节点上都运行该应用的Pod。
4. 任务
不同于长期运行的应用,任务中应用完成某一类处理即可退出。
5. 横向Pod扩展器
解决应用波动的情况,自动调整Pod个数。
27.5 其他抽象对象
1. 标签
一组键值对,用来标记所绑定对象的识别属性,进而可以分类。
2. 注解
类似标签,可以存储更复杂的信息,不用于分类。
3. 选择器
通过标签的键值来过滤出一组特定的资源对象。
4. 秘密数据
保存敏感数据。
5. UID和名字
Kubernetes用UID和名字来识别对象。UID是全局唯一,名字是命名空间唯一。
6. 命名空间
用来隔离不同用户的资源。
命名空间内,资源不允许重名。
kubernete启动后,默认保留两个命名空间:
default:资源未指定时,默认为该空间。
kube-system:由Kubernete自身创建的资源。
7. 污点和容忍
辅助调用Pod到节点调度过程。
一个工作节点注明若干污点,只有对这些污点容忍的pod,才可以调度到该节点。
27.6 快速体验
Linux为例
1. 下载minikube和kubectl
下载minikube,并复制到/usr/local/bin
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube
cp minikube /usr/local/bin
kubectl是Kubernete提供的客户端,可以操作启动后的集群
curl -Lo kubectl https://storage.googleapis.com/kubernete-release/release/${curl -s https://storage.googleapis.com/kurnetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl
cp kubectl /usr/local/bin
2. 启动集群
分为两种模式:一种在本地创建虚拟机,然后创建集群。一种直接创建集群,需要制定-vm-driver=none参数
TODO....................
3. 查看Kubernete服务
查看集群信息:kubectl cluster-info
查看启动的容器:docker ps
4. 使用部署控制器管理服务
切换到minikube客户端环境上下文
kubectl config use-context minikube
27.7重要组件
Kubernete集群采用了典型的“主-从”架构。Master负责控制,Node负责干活。
Master负责协调管理,包括组件:
Etcd:作为数据库,存放集群状态和配置相关数据
kube-apiserver:对外接口,提供RESTful API供客户端和其他组件调用。
kube-scheduler:负责对资源调度,具体负责分配某个请求的Pod到某个节点。
controller-manager:对不同资源的管理器,维护状态。
kube-ui:可选,自带的Web界面。
kube-dns:可选,记录启动容器组和服务地址。
其他组件:监控日志记录等。
Node节点可以是虚拟机或者物理机器。
容器引擎:支持Docker和rkt。
kubelet:节点主要工作代理,汇报状态实现声明周期管理。
kube-proxy:负责服务发现和负载均衡。
辅助组件:可选,supervisord保持kubelet和docker进行运行。
Node节点重要属性:
主机名:所在系统的主机别名
外部地址:外部客户端可通过该地址访问
内部地址:内部可访问的地址