1、Docker概述
1.1 docker是什么
- 使用最广泛的容器引擎
- 操作系统级别的虚拟化技术,进程级别的隔离
- 依赖于linux内核特性:namespace(资源隔离)和Cgroup(资源限制)
- 一个简单的应用打包工具
1.2 docker设计目的
- 提供简单的应用程序打包工具
- 开发和运维职责逻辑分离
- 多环境保持一致性
1.3 docker基本组成
- docker client
- docker daemon
- docker image
- docker container
- docker registry
1.4 容器VS虚拟机
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
阿里云源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker软件包源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker CE
yum install -y docker-ce
# 启动Docker服务并设置开机启动
systemctl start docker
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 镜像和容器关系
容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时, 会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。 如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多 少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作 的,并不会修改镜像的源文件,这种方式提高磁盘利用率。
若想持久化这些改动,可以通过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共享(相对权重) |
示例:
内存限额:
# 允许容器最多使用500M内存和100M的Swap,并禁用 OOM Killer:
docker run -d --name nginx --memory="500m" --memory-swap=“600m" --oom-kill-disable nginx
CPU限额:
# 允许容器最多使用一个半的CPU:
docker run -d --name nginx04 --cpus="1.5" nginx
# 允许容器最多使用50%的CPU:
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
# 管理卷:
docker volume create nginx-vol
docker volume ls
docker volume inspect nginx-vol
# 用卷创建一个容器:
docker run -d --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
# 清理:
docker stop nginx-test
docker rm nginx-test
docker volume rm nginx-vol
注意:
- 如果没有指定卷,自动创建。
- 建议使用—mount,更通用。
5.3 Bind Mounts
# 用卷创建一个容器:
docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
# 验证绑定:
docker inspect nginx-test
# 清理:
docker stop nginx-test
docker rm nginx-test
注意:
- 如果源文件/目录没有存在如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。
- 不会自动创建,会抛出一个错误。
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 网络模式
• bridge
–net=bridge
默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
• host
–net=host
容器不会获得一个独立的network namespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信息,而是使用宿主
机的。容器除了网络,其他都是隔离的。
• none
–net=none
获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。
• container
–net=container:Name/ID
与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。
• 自定义网络
与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名容器之间网络通信。
7、Dockerfile
7.1 Dockerfile格式
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构建镜像
Usage: docker build [OPTIONS] PATH | URL | - [flags]
Options:
-t, --tag list # 镜像名称
-f, --file string # 指定Dockerfile文件位置
docker build -t shykes/myapp .
docker build -t shykes/myapp -f /path/Dockerfile /path
docker build -t shykes/myapp http://www.example.com/Dockerfile
7.4 构建业务基础镜像
https://www.yuque.com/geray-alxoc/bapt5y/we445k
7.5 部署LNMP网站平台
1、自定义网络
docker network create lnmp
2、创建Mysql容器
docker run -d \
--name lnmp_mysql \
--net lnmp \
--mount src=mysql-vol,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress mysql:5.7 --character-set-server=utf8
3、创建PHP容器
docker run -d --name lnmp_php --net lnmp --mount src=wwwroot,dst=/wwwroot php:v1
4、创建Nginx容器
docker run -d --name lnmp_nginx --net lnmp -p 88:80 \
--mount src=wwwroot,dst=/wwwroot nginx:v1
5、以wordpress博客为例
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
$ tar zxvf harbor-offline-installer-v1.6.1.tgz
$ cd harbor
$ vi harbor.cfg
hostname = 10.206.240.188
ui_url_protocol = http
harbor_admin_password = 123456
$ ./prepare
$ ./install.sh
8.2 Harbor基本使用
# 1、配置http镜像仓库可信任
$ vi /etc/docker/daemon.json
{"insecure-registries":["reg.ctnrs.com"]}
$ systemctl restart docker
# 2、打标签
$ docker tag centos:6 reg.ctnrs.com/library/centos:6
# 3、上传
$ docker push reg.ctnrs.com/library/centos:6
# 4、下载
$ docker pull reg.ctnrs.com/library/centos:6
9、Prometheus监控Docker主机
Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统。自2012年成为社区 开源项目,拥有非常活跃的开发人员和用户社区。为强调开源及独立维护,Prometheus于2016 年加入云原生云计算基金会(CNCF),成为继Kubernetes之后的第二个托管项目。
官网地址:
9.1 Prometheus概述
Prometheus 特点:
- 多维数据模型:由度量名称和键值对标识的时间序列数据
- PromQL:一种灵活的查询语言,可以利用多维数据完成复杂的查询
- 不依赖分布式存储,单个服务器节点可直接工作
- 基于HTTP的pull方式采集时间序列数据
- 推送时间序列数据通过PushGateway组件支持
- 通过服务发现或静态配置发现目标
- 多种图形模式及仪表盘支持(grafana)
架构图:
- Prometheus Server:收集指标和存储时间序列数据,并提供查询接口
- ClientLibrary:客户端库
- Push Gateway:短期存储指标数据。主要用于临时性的任务
- Exporters:采集已有的第三方服务监控指标并暴露metrics
- Alertmanager:告警
- Web UI:简单的Web控制台
实例:可以抓取的目标称为实例(Instances)
作业:具有相同目标的实例集合称为作业(Job)
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['192.168.1.10:9090']
9.2 Harbor部署
Docker部署:https://prometheus.io/docs/prometheus/latest/installation/
docker run -d \
--name=prometheus \
-p 9090:9090 \
-v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
10、Prometheus+Grafana监控Docker主机
cAdvisor(Container Advisor)用于收集正在运行的容器资源使用和性能信息。 Grafana 是一个开源的度量分析和可视化系统。
官方地址:
https://github.com/google/cadvisor
https://grafana.com/grafana/download
Docker主机监控模板:193
Linux主机监控模板:9276
Docker部署Grafana:
docker run -d \
--name=grafana \
-p 3000:3000 \
grafana/grafana
Docker部署cAdvisor:
docker run -d \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest