1、Docker概述

1.1 docker是什么

  • 使用最广泛的容器引擎
  • 操作系统级别的虚拟化技术,进程级别的隔离
  • 依赖于linux内核特性:namespace(资源隔离)和Cgroup(资源限制)
  • 一个简单的应用打包工具

1.2 docker设计目的

  • 提供简单的应用程序打包工具
  • 开发和运维职责逻辑分离
  • 多环境保持一致性

1.3 docker基本组成

  • docker client
  • docker daemon
  • docker image
  • docker container
  • docker registry

0、Docker基础 - 图1

1.4 容器VS虚拟机

0、Docker基础 - 图2

0、Docker基础 - 图3

1.5 docker应用场景

  • 应用程序打包和发布  应用程序隔离
  • 持续集成
  • 部署微服务
  • 快速搭建测试环境
  • 提供PaaS产品(平台即服务)

2、Docker安装

2.1 docker版本

  • 社区版(Community Edition,CE )
  • 企业版(Enterprise Edition,EE)

2.2 支持的平台

  • Linux(CentOS,Debian,Fedora,Oracle Linux,RHEL,SUSE和Ubuntu)
  • mac
  • windows

2.3 安装-centos

官方文档:https://docs.docker.com

阿里云源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  1. # 安装依赖包
  2. yum install -y yum-utils device-mapper-persistent-data lvm2
  3. # 添加Docker软件包源
  4. yum-config-manager \
  5. --add-repo \
  6. https://download.docker.com/linux/centos/docker-ce.repo
  7. # 安装Docker CE
  8. yum install -y docker-ce
  9. # 启动Docker服务并设置开机启动
  10. systemctl start docker
  11. systemctl enable docker

3、镜像管理

3.1 镜像?

  • 一个分层存储的文件
  • 一个软件的环境
  • 一个镜像可以创建N个容器
  • 一种标准化的交付
  • 一个不包含Linux内核而又精简的Linux操作系统

    镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history <imageID/name> 查看镜像中各层内容及大小,每层 对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/<storage-driver>中。

docker官方镜像仓库 :https://hub.docker.com/explore

3.2 镜像和容器关系

0、Docker基础 - 图4

容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时, 会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。 如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多 少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作 的,并不会修改镜像的源文件,这种方式提高磁盘利用率

若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像。

  • 一个镜像创建多个容器
  • 镜像增量式存储
  • 创建的容器里面修改不会影响到镜像

3.3 镜像管理命令

指令 描述
ls 列出镜像
build 构建镜像
history 查看镜像历史
inspect 显示一个或多个镜像详细信息
pull 拉取镜像
push 推送镜像
search 搜索镜像
rmi 移除一个或多个镜像
prune 移除未使用的镜像(没有被标记或被任何容器引用的)
tag 创建一个引用源镜像标记目标镜像
export 导出容器文件系统到tar归档文件
import 导入容器文件系统tar归档文件创建镜像
save 保存一个或多个镜像到一个tar归档文件
load 加载镜像来自tar归档或标准输入

4、容器管理

4.1 创建容器常用选项

选项 描述
-i, —interactive 交互式
-t, —tty 分配一个伪终端
-d, —detach 后台运行
-e, —env 设置环境变量
-p, —publish list 映射容器端口到主机
-P, —publish-all 映射容器所有EXPOSE的端口到宿主机随机端口
—name string 指定容器名称
-h, —hostname 设置容器主机名
—ip string 指定容器ip,只能用于自定义网络
—network 连接容器到一个网络
-v, —volume list 绑定挂载卷
—restart string 可选值:[always on-failure] 容器退出时重启策略(默认为no)

4.2 资源限制选项

选项 描述
-m, —memory 容器使用的最大内存量
—memory-swap 允许交换到磁盘的内存量
—memory-swappiness=<0-100> 容器使用SWAP分区交换的百分比(0-100,默认为-1)
—oom-kill-disable 禁用OOM Killer
—cpus 可以使用的CPU数量
—cpuset-cpus 限制容器使用特定的CPU核心,如(0-3, 0,1)
—cpu-shares CPU共享(相对权重)

示例:

内存限额:

  1. # 允许容器最多使用500M内存和100M的Swap,并禁用 OOM Killer:
  2. docker run -d --name nginx --memory="500m" --memory-swap=“600m" --oom-kill-disable nginx

CPU限额:

  1. # 允许容器最多使用一个半的CPU:
  2. docker run -d --name nginx04 --cpus="1.5" nginx
  3. # 允许容器最多使用50%的CPU:
  4. docker run -d --name nginx05 --cpus=".5" nginx

4.3 容器管理命令

指令 描述
ls 列出容器
inspect 显示一个或多个容器详细信息
exec 在运行的容器中执行命令
commit 创建一个新镜像来自容器
cp 拷贝文件或文件夹
logs 获取一个容器日志
port 列出或指定容器映射端口
top 显示一个容器运行的进程
stats 显示容器资源使用统计
stop/start/restart 停止/启动一个或多个容器
rm 删除一个或多个容器

5、 管理应用程序数据

5.1 挂载数据到容器

Docker提供三种方式将数据从宿主机挂载到容器中:

  • volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
  • bind mounts-:将宿主机上的任意位置的文件或者目录挂载到容器中。
  • tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用 tmpfs,同时避免写入容器可写层提高性能。

5.2 volume

  1. # 管理卷:
  2. docker volume create nginx-vol
  3. docker volume ls
  4. docker volume inspect nginx-vol
  5. # 用卷创建一个容器:
  6. docker run -d --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
  7. docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
  8. # 清理:
  9. docker stop nginx-test
  10. docker rm nginx-test
  11. docker volume rm nginx-vol

注意:

  1. 如果没有指定卷,自动创建。
  2. 建议使用—mount,更通用。

5.3 Bind Mounts

  1. # 用卷创建一个容器:
  2. docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
  3. docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
  4. # 验证绑定:
  5. docker inspect nginx-test
  6. # 清理:
  7. docker stop nginx-test
  8. docker rm nginx-test

注意:

  1. 如果源文件/目录没有存在如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏
  2. 不会自动创建,会抛出一个错误。

5.4 Volume VS Bind Mounts

Volume:

  • 多个运行容器之间共享数据,多个容器可以同时挂载相同的卷。
  • 当容器停止或被移除时,该卷依然存在。
  • 当明确删除卷时,卷才会被删除。
  • 将容器的数据存储在远程主机或其他存储上(间接)
  • 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)

Bind Mounts

  • 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
  • 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机 上构建Maven项目时,容器都可以访问构建的项目包。
  • 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时

6、容器网络

6.1 网络模式

  1. bridge
  2. net=bridge
  3. 默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
  4. host
  5. net=host
  6. 容器不会获得一个独立的network namespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信息,而是使用宿主
  7. 机的。容器除了网络,其他都是隔离的。
  8. none
  9. net=none
  10. 获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。
  11. container
  12. net=container:Name/ID
  13. 与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。
  14. 自定义网络
  15. 与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名容器之间网络通信。

0、Docker基础 - 图5

7、Dockerfile

7.1 Dockerfile格式

0、Docker基础 - 图6

7.2 Dockerfile指令

指令 描述
FROM 基于那个镜像构建新镜像
MAINTAINER LABEL 镜像维护者姓名和邮箱地址
RUN 构建镜像时运行的shell命令
COPY 拷贝文件或目录到镜像中
ENV 设置环境变量
USER 为RUN、CMD和ENTRYPOINT执行命令运行用户
EXPOSE 声明容器运行的服务端口
HEALTHCHECK 容器中服务健康检查
WORKDIR 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
ENTRYPOINT 运行容器时执行,如果有多个ENTRYPOINT指令,最后一个生效
CMD 运行容器时执行,如果有多个CMD指令,最后一个生效

7.3 Build构建镜像

  1. Usage: docker build [OPTIONS] PATH | URL | - [flags]
  2. Options:
  3. -t, --tag list # 镜像名称
  4. -f, --file string # 指定Dockerfile文件位置
  5. docker build -t shykes/myapp .
  6. docker build -t shykes/myapp -f /path/Dockerfile /path
  7. docker build -t shykes/myapp http://www.example.com/Dockerfile

7.4 构建业务基础镜像

https://www.yuque.com/geray-alxoc/bapt5y/we445k

7.5 部署LNMP网站平台

0、Docker基础 - 图7

  1. 1、自定义网络
  2. docker network create lnmp
  3. 2、创建Mysql容器
  4. docker run -d \
  5. --name lnmp_mysql \
  6. --net lnmp \
  7. --mount src=mysql-vol,dst=/var/lib/mysql \
  8. -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress mysql:5.7 --character-set-server=utf8
  9. 3、创建PHP容器
  10. docker run -d --name lnmp_php --net lnmp --mount src=wwwroot,dst=/wwwroot php:v1
  11. 4、创建Nginx容器
  12. docker run -d --name lnmp_nginx --net lnmp -p 88:80 \
  13. --mount src=wwwroot,dst=/wwwroot nginx:v1
  14. 5、以wordpress博客为例
  15. https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz

8、Harbor镜像仓库

Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的 企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访 问控制 ,AD/LDAP集成以及审计日志等,足以满足基本企业需求。

官方地址:https://vmware.github.io/harbor/cn/

组件 功能
harbor-adminserver 配置管理中心
harbor-db MySQL数据库
harbor-jobservice 负责镜像复制
harbor-log 记录操作日志
harbor-ui Web管理页面和API
nginx 前端代理,负责前端页面和镜像上传/下载转发
redis 会话
registry 镜像存储

8.1 Harbor部署

Harbor安装有3种方式:

  • 在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小
  • 离线安装:安装包包含部署的相关镜像,因此安装包比较大
  • OVA安装程序:当用户具有vCenter环境时,使用此安装程序,在部署OVA后启动Harbor
  1. $ tar zxvf harbor-offline-installer-v1.6.1.tgz
  2. $ cd harbor
  3. $ vi harbor.cfg
  4. hostname = 10.206.240.188
  5. ui_url_protocol = http
  6. harbor_admin_password = 123456
  7. $ ./prepare
  8. $ ./install.sh

8.2 Harbor基本使用

  1. # 1、配置http镜像仓库可信任
  2. $ vi /etc/docker/daemon.json
  3. {"insecure-registries":["reg.ctnrs.com"]}
  4. $ systemctl restart docker
  5. # 2、打标签
  6. $ docker tag centos:6 reg.ctnrs.com/library/centos:6
  7. # 3、上传
  8. $ docker push reg.ctnrs.com/library/centos:6
  9. # 4、下载
  10. $ docker pull reg.ctnrs.com/library/centos:6

9、Prometheus监控Docker主机

Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统。自2012年成为社区 开源项目,拥有非常活跃的开发人员和用户社区。为强调开源及独立维护,Prometheus于2016 年加入云原生云计算基金会(CNCF),成为继Kubernetes之后的第二个托管项目。

官网地址:

https://prometheus.io/

https://github.com/prometheus

9.1 Prometheus概述

Prometheus 特点:

  • 多维数据模型:由度量名称和键值对标识的时间序列数据
  • PromQL:一种灵活的查询语言,可以利用多维数据完成复杂的查询
  • 不依赖分布式存储,单个服务器节点可直接工作
  • 基于HTTP的pull方式采集时间序列数据
  • 推送时间序列数据通过PushGateway组件支持
  • 通过服务发现或静态配置发现目标
  • 多种图形模式及仪表盘支持(grafana)

架构图:

0、Docker基础 - 图8

  • Prometheus Server:收集指标和存储时间序列数据,并提供查询接口
  • ClientLibrary:客户端库
  • Push Gateway:短期存储指标数据。主要用于临时性的任务
  • Exporters:采集已有的第三方服务监控指标并暴露metrics
  • Alertmanager:告警
  • Web UI:简单的Web控制台

实例可以抓取的目标称为实例(Instances)

作业具有相同目标的实例集合称为作业(Job)

  1. scrape_configs:
  2. - job_name: 'prometheus'
  3. static_configs:
  4. - targets: ['localhost:9090']
  5. - job_name: 'node'
  6. static_configs:
  7. - targets: ['192.168.1.10:9090']

9.2 Harbor部署

Docker部署https://prometheus.io/docs/prometheus/latest/installation/

  1. docker run -d \
  2. --name=prometheus \
  3. -p 9090:9090 \
  4. -v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml \
  5. prom/prometheus

10、Prometheus+Grafana监控Docker主机

cAdvisor(Container Advisor)用于收集正在运行的容器资源使用和性能信息。 Grafana 是一个开源的度量分析和可视化系统。

0、Docker基础 - 图9

官方地址

https://github.com/google/cadvisor

https://grafana.com/grafana/download

Docker主机监控模板:193

Linux主机监控模板:9276

Docker部署Grafana:

  1. docker run -d \
  2. --name=grafana \
  3. -p 3000:3000 \
  4. grafana/grafana

Docker部署cAdvisor:

  1. docker run -d \
  2. --volume=/:/rootfs:ro \
  3. --volume=/var/run:/var/run:ro \
  4. --volume=/sys:/sys:ro \
  5. --volume=/var/lib/docker/:/var/lib/docker:ro \
  6. --volume=/dev/disk/:/dev/disk:ro \
  7. --publish=8080:8080 \
  8. --detach=true \
  9. --name=cadvisor \
  10. google/cadvisor:latest