docker技术入门与实战 第三版

docker技术入门与实战 第三版

 第一章 初识Docker与容器

Docker的优势:

  更快的交付和部署:通过镜像快速构建开发环境。测试和运维人员可以将其快速部署。

  更高效的资源利用:作为内核级别的虚拟化,资源需求更低。

  更轻松的迁移和扩展:可以在几乎任何平台运行。

  更简单的更新管理:通过Dockerfile只需要小的配置修改,修改以增量的方式进行分发和更新。

Docker与虚拟机比较:

  Docker容器启动和停止更快。

  Docker容器对系统资源需求更少。

  Docker通过类似git理念方便用户获取、分发和更新镜像,存储复用,增量更新。

  Docker通过Dockerfile支持灵活的自动化创建和部署机制。

 

 

 

第二章 核心概念与安装配置

Docker镜像:类似虚拟机镜像,作为只读的模板。(可以只包含某个操作系统和某个应用)

Docker容器:类似轻量级的沙盒,Docker利用容器来运行和隔离应用。

      镜像自身是只读的。容器从镜像启动时,会在最上层创建一个可写层。

Docker仓库:类似于代码仓库,集中存放镜像文件的地方。

      仓库注册服务器(Registry)是存放仓库的地方。如图2-1,内部放了Ubuntu仓库和CentOs仓库,Ubuntu仓库放了多个镜像版本。

 

 

 

如果使用Ubuntu16.04 LTS版本,可以安装如下安装包,使得Docker使用aufs存储。
sudo apt-get install -y \
linux-image-extra-$(uname -r) \
linux-image-extra-virtual 
 
安装Docker(Ubuntu下):
1. 添加镜像源
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common 

 2. 添加gpg密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

3. 确认导入的指纹

sudo apt-key fingerprint 0EBFCD88

4. 获取当前操作系统代号  (16.04 LTS代号:xenial,18.04 LTS代号:bionic)

lsb_release -cs 
5. 添加Docker稳定版本的官方软件源
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
xenial \
stable"
成功后,需要更新apt软件包缓存
sudo apt-get update
6. 安装最新版本的Docker
sudo apt-get install -y docker-ce  (手动添加软件源,其中docker-ce为一个版本)
sudo curl -sSL https://get.docker.com/ | sh  (官方脚本:自动安装Docker)

 

配置Docker服务

1. 为了避免每次使用Docker命令都切换到特权身份,将当前用户加入docker用户组

sudo usermod -aG docker USER_NAME
2. Docker启动调用了dockerd命令,因此可以直接用dockerd命令进行启动。
dockerd -D -H tcp://127.0.0.1:2376   (启动Docker服务,并开启Debug模式)
可以写入/etc/docker/路径下的daemon.json文件,由dockerd服务启动时读取
{
  "debug"  :  true,
  "hosts"  :  ["tcp://127.0.0.1:2376"]
docker服务的默认配置文件为:/etc/default/docker。
3. 重启Docker服务
sudo service docker restart 
 

第三章 使用Docker镜像

获取镜像:docker [image] pull NAME[:TAG]

     NAME为镜像仓库名称,TAG为镜像标签(版本)。不指定TAG默认下载最新版本

     例如:docker pull ubuntu:18.04

pull子命令:

    -a,-all-tags=true|false   是否获取所有镜像,默认否

    --disable-content-trust:取消内容校验

不同镜像仓库服务器可能出现镜像重名,严格将需要添加仓库地址(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 [image] load将导出的tar文件载入到本地镜像库,支持 -i, -input string

例如: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容器的数据集

docker run -it --volumes-from dbdata -name db1 ubuntu 

第七章 端口映射与容器互联

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节点重要属性:

  主机名:所在系统的主机别名

  外部地址:外部客户端可通过该地址访问

  内部地址:内部可访问的地址

 

posted @ 2020-07-13 11:04  注册以后还能改吧  阅读(678)  评论(0编辑  收藏  举报