基础部分
简介
背景:
一个项目从开发到上线,从操作环境,到运行环境,再到应用配置,需要关心很多东西,特别是各种版本的迭代之后,不同版本环境的兼容问题,对于开发和运维都是不小的考验。
Docker对此给出了一个标准化的解决方案:安装的时候,把原始环境一模一样地复制过来,极大地减少了不同机器不能运行的问题。
Docker镜像的设计,打破了过去「程序即应用」的观念。透过镜像(images)可以将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
理念:
Docker是基于Go语言实现的云开源项目,目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
过往技术:虚拟机(virtual machine),是带环境安装的一种解决方案。
缺点:资源占用多;冗余步骤多;启动慢
为了解决弥补以往的缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。
Docker 和传统虚拟化方式的差别:
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟,更加轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
官网:Docker
仓库:Docker Hub
因为 Red Hat 即将停止CentOS系列的维护,所以官网不再推荐。未来可尝试 Debian
安装
使用CentOS 7,要求系统为64位、系统内核版本为 3.10 以上。
1 2 3 4
| #打印当前系统相关信息 uname -r #查看内核版本 cat /etc/redhat-release
|
- 安装gcc环境(为了意外)
1 2
| yum -y install gcc yum -y install gcc-c++
|
- 卸载旧版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| systemctl stop docker #卸载 sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras #删除所有映像、容器和卷 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd #卸载旧版本以及相关的依赖项 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
|
- 安装软件包(提供实用程序)并设置存储库
1 2 3 4 5
| sudo yum install -y yum-utils #官网 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo #推荐 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
|
- 安装
1 2
| #安装当前系统支持的最新版本 sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
1 2 3 4
| #查看当前系统支持版本 yum list docker-ce --showduplicates | sort -r #安装指定版本 sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-buildx-plugin docker-compose-plugin
|
- 校验
1 2 3 4
| #启动 sudo systemctl start docker #验证 sudo docker run hello-world
|
- 配置加速镜像
1 2 3 4 5 6 7 8
| #没有就创建 mkdir -p /etc/docker #添加配置 vim /etc/docker/daemon.json #加载配置 systemctl daemon-reload #重启服务 systemctl restart docker
|
1 2 3 4 5 6
| { "registry-mirrors": [ "https://dockerhub.azk8s.cn", "https://hub-mirror.c.163.com" ] }
|
配置开机启动:systemctl enable docker
底层原理
run 命令的流程:
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。
容器,是一个运行时环境,也就是Logo上的集装箱。
常用命令
帮助命令
1 2 3 4 5 6
| #查看版本 docker version #查看信息 docker info #查看指令手册 docker --help
|
镜像命令
1 2
| #查看本机镜像 docker images [OPTIONS]
|
常用参数:
- -a:列出本地所有的镜像(含中间映像层)
- -q:只显示镜像ID
- –digests:显示镜像的摘要信息
- –no-trunc:显示完整的镜像信息
数据说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
如果不指定版本标签,默认使用latest,示例:ubuntu:latest
1 2
| #查找远程镜像 docker search [OPTIONS] 镜像名字
|
参数说明:
- –no-trunc:显示完整的镜像描述
- -s:列出收藏数不小于指定值的镜像
- –automated:只列出 automated build类型的镜像
1 2 3 4
| #下载镜像 docker pull 镜像名字[:TAG] #删除镜像 docker rmi 镜像名字[:TAG]/ID
|
1 2 3 4
| #删除多个 docker rmi -f 镜像名1:TAG 镜像名2:TAG #删除全部 docker rmi -f $(docker images -qa)
|
容器命令
1 2 3 4 5
| #新建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
#启动交互式容器,在容器内执行/bin/bash命令 docker run -it centos /bin/bash
|
参数说明:
- –name=”容器新名字”: 为容器指定一个名称;
- -d: 后台运行容器,并返回容器ID,也即启动守护式容器;
- -i:以交互模式运行容器,通常与 -t 同时使用;
- -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- -P: 随机端口映射;
- -p: 指定端口映射,有以下四种格式:
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
1 2
| #列出当前所有正在运行的容器 docker ps [OPTIONS]
|
参数说明:
- -a :列出当前所有正在运行的容器+历史上运行过的
- -l :显示最近创建的容器
- -n:显示最近n个创建的容器
- -q :静默模式,只显示容器编号
- –no-trunc :不截断输出
1 2 3 4 5 6 7 8 9 10 11 12 13
| #退出并关闭容器 exit #容器不停止退出(快捷键) ctrl+P+Q
#启动/重启/停止/强制停止容器 docker start/restart/stop/kill 容器ID或者容器名
#删除已停止的容器 docker rm 容器ID #删除多个容器 docker rm -f $(docker ps -a -q) docker ps -a -q | xargs docker rm
|
后台启动
后台启动需要守护进程,不是所有的服务都可以后台启动的。
示例:
1 2 3 4
| #后台启动 docker run -d centos #查看运行容器 docker ps -a
|
会发现容器已经退出,因为没有前台服务,导致服务启动后会因为无事可做而被杀掉,而像redis、mysql等服务,由于存在守护进程,所以可以后台启动。
1 2 3 4 5 6 7 8 9
| #查看容器日志 #-t 是加入时间戳;-f 跟随最新的日志打印;--tail 数字,显示最后多少条 docker logs -f -t --tail 条数 容器ID
#查看容器内运行的进程 docker top 容器ID #查看容器内部细节 docker inspect 容器ID
|
1 2 3
| #重新进入后台容器 docker exec -it 容器ID docker attach 容器ID
|
attach 直接进入容器启动命令的终端,不会启动新的进程
exec 是在容器中打开新的终端,并且可以启动新的进程
即使用attach命令时输入exit容易导致容器关闭。
1 2 3 4 5 6
| #从容器内拷贝文件到主机上 docker cp 容器ID:容器内路径 目的主机路径 #导出容器内容(备份) docker export 容器ID > 文件名.tar #导入tar包中的内容为一个镜像并创建新的文件系统 docker import 文件名.tar - 镜像名:TAG
|
数据卷
1
| docker run -d -p 80:8080 -v 主机目录:容器目录 --privileged=true 容器名
|
-v
:目录挂载,将容器中的目录挂载到主机目录中(共享文件夹);可以实现将容器内的数据保存进主机中
默认容器具有读写权限
1
| docker run -d -p 80:8080 -v 主机目录:容器目录:ro --privileged=true 容器名
|
其中ro表示readonly
--privileged=true
:在centos7中目录挂载被视为不安全行为,所以需要使用此命令来解决权限问题
1 2
| #查看数据卷是否挂载成功 docker inspect 容器ID
|
1 2
| #继承其它容器的卷规则 docker run -it --privileged=true --volumes-from 容器id --name 容器名 镜像名
|
镜像
镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容。
**联合文件系统(UnionFS)**:联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一个提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
UnionFS 是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像(类似花卷)。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
注意:Docker镜像层都是只读的,容器层(最外暴露的一层)时可写的
制作与提交
1 2
| #提交容器副本使之成为一个新的镜像 docker commit -m="描述信息" -a="作者" 容器ID 目标镜像名:标签名
|
上面的操作只是将镜像提交到了本地,可以通过docker images
查看
我们可以将提交的本地镜像提交到阿里云个人仓库:开放云原生应用-云原生(Cloud Native)
登录后搜索 容器镜像服务,然后选择个人根据提示创建命名空间及仓库(选择本地仓库),然后根据操作指南进行提交即可,以下记录一下相关命令:
1 2 3 4 5 6 7 8 9
| #登录 docker login --username=lemonpuer registry.cn-hangzhou.aliyuncs.com #从Registry中拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/lemonpuer/lemon:[镜像版本号]
#重命名镜像 docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/lemonpuer/lemon:[镜像版本号] #推送镜像 docker push registry.cn-hangzhou.aliyuncs.com/lemonpuer/lemon:[镜像版本号]
|
登录密码为开通服务是设置的秘密
私有库
Docker Registry:Docker官方提供的工具,用于构建私有镜像仓库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #拉取镜像 docker pull registry #启动 docker run -d -p 5000:5000 -v /registry/myregistry/:/tmp/registry --privileged=true registry #查看库中镜像 curl -XGET http://ip:5000/v2/_catalo #默认不支持http,修改配置文件 vim /etc/docker/daemon.json { "registry-mirrors": [ "https://dockerhub.azk8s.cn", "https://hub-mirror.c.163.com" ], "insecure-registries": ["ip:5000"] } #修改本地镜像TAG docker tag 镜像名:TAG ip:5000/镜像名:TAG #推送到私服 docker push ip:5000/镜像名:TAG #拉取镜像 docker pull ip:5000/镜像名:TAG
|
安装MySQL
不建议直接使用docker run mysql
,数据容易丢失。
推荐命令:
1
| docker run -d -p 3306:3306 --privileged=true -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:8.0.31-debian
|
这样即使直接将容器删除,也不会影响表中的数据
安装Redis
1
| docker run -p 6379:6379 --name redis --privileged=true -v /mydata/redis/redis.conf:/etc/redis/redis.conf -v /mydata/redis/data:/data -d redis redis-server /etc/redis/redis.conf
|
配置文件:redis.conf
进阶部分
集群安装
MySQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #启动master docker run -d -p 3306:3306 --privileged=true -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql:8.0.31-debian #进入master docker exec -it mysql-master /bin/bash #登录后创建数据同步用户 CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
#启动slave docker run -d -p 3307:3306 --privileged=true -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave mysql:8.0.31-debian #进入slave docker exec -it mysql-slave /bin/bash #登陆后配置主从复制 change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3306, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
|
主从复制参数说明:
- master_host:主数据库的IP地址;
- master_port:主数据库的运行端口;
- master_user:在主数据库创建的用于同步数据的用户账号;
- master_password:在主数据库创建的用于同步数据的用户密码;
- master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
- master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
- master_connect_retry:连接失败重试的时间间隔,单位为秒。
1 2 3 4
| #在数据库中查看主从同步状态 show slave status \G; #在从数据库中开启主从同步 start slave;
|
/G 表示以键值对的形式展示
Redis
理论:
redis集群有三种存储方案:
缺点:扩容和缩容后,映射关系需要重新进行计算(很多数据要迁移)
乍一听听不懂,其实也很好理解,构建一个一致性哈希环[0,2^32-1],根据Redis的信息映射到哈希环的一个点,key根据计算会落到哈希环的一个点,它顺时针遇到的第一个Redis便存储该数据。
有更好的容错性和扩展性,扩缩容只会改变哈希环中两个redis节点之间的数据,但新的问题是容易因为节点分布不均匀造成数据倾斜。
Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。我们只需要控制每个Redis节点分配的槽数即可。
1 2 3 4 5 6 7 8 9 10 11
| docker run -d --name redis-node-1 --net host --privileged=true -v /mydata/redis/share/redis-node-1:/mydata redis --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /mydata/redis/share/redis-node-2:/mydata redis --cluster-enabled yes --appendonly yes --port 6382 docker run -d --name redis-node-3 --net host --privileged=true -v /mydata/redis/share/redis-node-3:/mydata redis --cluster-enabled yes --appendonly yes --port 6383 docker run -d --name redis-node-4 --net host --privileged=true -v /mydata/redis/share/redis-node-4:/mydata redis --cluster-enabled yes --appendonly yes --port 6384 docker run -d --name redis-node-5 --net host --privileged=true -v /mydata/redis/share/redis-node-5:/mydata redis --cluster-enabled yes --appendonly yes --port 6385 docker run -d --name redis-node-6 --net host --privileged=true -v /mydata/redis/share/redis-node-6:/mydata redis --cluster-enabled yes --appendonly yes --port 6386
|
1 2
| #设置主从关系 redis-cli --cluster create 192.168.124.106:6381 192.168.124.106:6382 192.168.124.106:6383 192.168.124.106:6384 192.168.124.106:6385 192.168.124.106:6386 --cluster-replicas 1
|
–cluster-replicas 1 表示为每个master创建一个slave节点;集群会自动搭配对应的主从关系
1 2 3
| #查看节点状态 cluster info cluster nodes
|
1 2 3 4
| #连接集群 redis-cli -p 6381 -c #查看集群信息 redis-cli --cluster check ip:6381
|
-c:优化路由;如果不带会导致部分数据不能存储
扩缩容
1 2 3 4 5 6 7 8 9 10 11
| #新增节点 docker run -d --name redis-node-7 --net host --privileged=true -v /mydata/redis/share/redis-node-7:/mydata redis --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /mydata/redis/share/redis-node-8:/mydata redis --cluster-enabled yes --appendonly yes --port 6388
#将7号节点作为master加入集群 redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381 #重新分配槽号 redis-cli --cluster reshard ip:6381 #分配从节点 redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
|
1 2 3 4 5
| #从节点可以直接删除 redis-cli --cluster del-node ip:6388 从机6388节点ID #将7号节点中的槽位分配给其它节点 redis-cli --cluster reshard ip:6381 #删除7号节点
|
扩缩容其实和Redis第五章在虚拟机中的操作一样
DockerFile
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
官方教程:Dockerfile reference | Docker Docs
规范:
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层并对镜像进行提交
内部流程:
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 循环上面操作直到所有指令都执行完成
常用指令
- FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条指令必须是from
- MAINTAINER:镜像维护者的姓名和邮箱地址
- RUN:容器构建时需要运行的命令,有两种格式:
- shell格式:
RUN <命令行命令>
;示例:RUN yum -y install vim
- exec格式:
RUN ["可执行文件","参数1","参数2"...]
;示例:RUN ["~/zk.sh","stop"]
等价于RUN ~/zk.sh stop
- EXPOSE:声明当前容器对外暴露的端口
- WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
- USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root
- ENV:用来在构建镜像过程中设置环境变量
- ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
- COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。
COPY src源路径 dest目标路径
或COPY ["src源路径", "dest目标路径"]
- VOLUME:容器数据卷,用于数据保存和持久化工作
- CMD:指定容器启动后的操作,除了shell格式和exec格式,当指定了ENTRYPOINT指令时,会成为参数列表格式:
CMD ["参数1","参数2"...]
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
CMD是在docker run时运行;RUN是在docker build时运行。
- ENTRYPOINT:用来指定一个容器启动时要运行的命令;类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,并且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
案例说明:
1 2 3 4 5
| FROM nginx
ENTRYPOINT ["nginx","-c"]
CMD ["/etc/nginx/nginx.conf"]
|
1 2 3 4
| #实际效果:nginx -c /etc/nginx/nginx.conf docker run nginx:test #实际效果:nginx -c /etc/nginx/new.conf docker run nginx:test /etc/nginx/new.conf
|
配置Redis+Java8的镜像:
1 2 3 4 5 6 7 8 9 10 11
| FROM redis
ADD jdk-8u391-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_391 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 8080
|
1 2 3 4
| #构建 docker build -t mylinux:1.0 . #运行 docker run -p 6379:6379 -p 80:8080 --name mylinux --privileged=true -v /mydata/redis/redis.conf:/etc/redis/redis.conf -v /mydata/redis/data:/data -d mylinux:1.0 redis-server /etc/redis/redis.conf
|
虚悬镜像
仓库名、标签都是的镜像,俗称dangling image
虚悬镜像没有存在的价值,一般都删掉
1 2 3 4
| #查看 docker image ls -f dangling=true #删除 docker image prune
|
Docker网络
在我们启动Docker后,使用ip addr
会发现列表中多了一个docker0
1 2
| #查看docker网络模式命令 docker network ls
|
默认三大网络模式:
- bridge:网桥模式(相当于NAT)
- host:主机网络(相当于主机网络)
- none:无网络
1 2 3 4 5 6
| #查看网络源数据 docker network inspect XXX网络名字 #新建网络 docker network create XXX网络名字 #删除网络 docker network rm XXX网络名字
|
作用:内置了容器服务名和ip的映射,容器IP变动时候可以通过服务名直接网络通信而不受到影响
- container:和已经存在的一个容器共享一个网络ip配置
示例:docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
关闭alpine1;alpine2的网路数据也会消失
容器编排
Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
当服务过多并且相互有依赖关系(设定启动顺序)的情况是,我们手动一个个启动容器是非常累的,Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project),这样可以很容易地用一个配置文件定义一个多容器的工程,然后使用一条指令完成项目构建和启动。
官网介绍:Compose 文件版本 3 参考 |Docker 文档
下载:安装 Compose 插件 |Docker 文档
概念:
- 服务:应用容器实例
- 工程:由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义
使用步骤:
- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
- 执行
docker-compose up
命令 来启动并运行整个应用程序,完成一键部署上线
常用命令:
命令 |
说明 |
docker-compose -h |
查看帮助 |
docker-compose up |
启动所有docker-compose服务 |
docker-compose up -d |
启动所有docker-compose服务并后台运行 |
docker-compose down |
停止并删除容器、网络、卷、镜像 |
docker-compose exec yml里面的服务id |
进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash |
docker-compose ps |
展示当前docker-compose编排过的运行的所有容器 |
docker-compose top |
展示当前docker-compose编排过的容器进程 |
docker-compose logs yml里面的服务id |
查看容器输出日志 |
docker-compose config |
检查配置 |
docker-compose config -q |
检查配置,有问题才有输出 |
docker-compose restart |
重启服务 |
docker-compose start |
启动服务 |
docker-compose stop |
停止服务 |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| version: "3" services: microService: image: zzyy_docker:1.6 container_name: ms01 ports: - "6001:6001" volumes: - /app/microService:/data networks: - atguigu_net depends_on: - redis - mysql redis: image: redis:6.0.8 ports: - "6379:6379" volumes: - /app/redis/redis.conf:/etc/redis/redis.conf - /app/redis/data:/data networks: - atguigu_net command: redis-server /etc/redis/redis.conf mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: '123456' MYSQL_ALLOW_EMPTY_PASSWORD: 'no' MYSQL_DATABASE: 'db2021' MYSQL_USER: 'zzyy' MYSQL_PASSWORD: 'zzyy123' ports: - "3306:3306" volumes: - /app/mysql/db:/var/lib/mysql - /app/mysql/conf/my.cnf:/etc/my.cnf - /app/mysql/init:/docker-entrypoint-initdb.d networks: - atguigu_net command: --default-authentication-plugin=mysql_native_password networks: atguigu_net:
|
可视化工具
Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。
官网:Portainer;Install Portainer CE with Docker
CE表示社区版;跟着官网操作安装即可
容器监控CIG
通过docker status
可以查看当前机器上所有容器的资源占用数据,但数据资料是实时的,没有数据存储、健康预警等功能。
CIG:CAdvisor监控收集+InfluxDB存储数据+Granfana展示图表
对应的docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| version: '3.1' volumes: grafana_data: {} services: influxdb: image: tutum/influxdb:0.9 restart: always environment: - PRE_CREATE_DB=cadvisor ports: - "8083:8083" - "8086:8086" volumes: - ./data/influxdb:/data cadvisor: image: google/cadvisor links: - influxdb:influxsrv command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086 restart: always ports: - "8080:8080" volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro grafana: user: "104" image: grafana/grafana user: "104" restart: always links: - influxdb:influxsrv ports: - "3000:3000" volumes: - grafana_data:/var/lib/grafana environment: - HTTP_USER=admin - HTTP_PASS=admin - INFLUXDB_HOST=influxsrv - INFLUXDB_PORT=8086 - INFLUXDB_NAME=cadvisor - INFLUXDB_USER=root - INFLUXDB_PASS=root
|
--restart=always
:跟随docker容器启动
一般中小公司就够用了,更完善的功能就需要上K8S了