Docker
发表于:2024-01-13 | 分类: 中间件
字数统计: 6k | 阅读时长: 25分钟 | 阅读量:

基础部分

简介

背景:

一个项目从开发到上线,从操作环境,到运行环境,再到应用配置,需要关心很多东西,特别是各种版本的迭代之后,不同版本环境的兼容问题,对于开发和运维都是不小的考验。

Docker对此给出了一个标准化的解决方案:安装的时候,把原始环境一模一样地复制过来,极大地减少了不同机器不能运行的问题。

Docker镜像的设计,打破了过去「程序即应用」的观念。透过镜像(images)可以将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。

理念:

Docker是基于Go语言实现的云开源项目,目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。

过往技术:虚拟机(virtual machine),是带环境安装的一种解决方案。

缺点:资源占用多;冗余步骤多;启动慢

为了解决弥补以往的缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。

Docker 和传统虚拟化方式的差别:

  1. 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟,更加轻便。
  2. 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

官网:Docker

仓库:Docker Hub

因为 Red Hat 即将停止CentOS系列的维护,所以官网不再推荐。未来可尝试 Debian

安装

使用CentOS 7,要求系统为64位、系统内核版本为 3.10 以上。

1
2
3
4
#打印当前系统相关信息
uname -r
#查看内核版本
cat /etc/redhat-release
  1. 安装gcc环境(为了意外)
1
2
yum -y install gcc
yum -y install gcc-c++
  1. 卸载旧版本
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. 安装软件包(提供实用程序)并设置存储库
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. 安装
  • 最新版
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. 校验
1
2
3
4
#启动
sudo systemctl start docker
#验证
sudo docker run hello-world
  1. 配置加速镜像
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 命令的流程:

e27d6910ca291baf9f382e063766cbc0.png

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。

容器,是一个运行时环境,也就是Logo上的集装箱。

be989fd0ab3c05b2f35e5b5caa24eef7.png

常用命令

帮助命令

1
2
3
4
5
6
#查看版本
docker version
#查看信息
docker info
#查看指令手册
docker --help

镜像命令

1
2
#查看本机镜像
docker images [OPTIONS]

常用参数:

  • -a:列出本地所有的镜像(含中间映像层)
  • -q:只显示镜像ID
  • –digests:显示镜像的摘要信息
  • –no-trunc:显示完整的镜像信息

数据说明:

  1. REPOSITORY:表示镜像的仓库源
  2. TAG:镜像的标签
  3. IMAGE ID:镜像ID
  4. CREATED:镜像创建时间
  5. 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
  • -f:强制删除
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采用的方式)

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

规范:

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层并对镜像进行提交

内部流程:

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 循环上面操作直到所有指令都执行完成

常用指令

  1. FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条指令必须是from
  2. MAINTAINER:镜像维护者的姓名和邮箱地址
  3. RUN:容器构建时需要运行的命令,有两种格式:
    • shell格式:RUN <命令行命令>;示例:RUN yum -y install vim
    • exec格式:RUN ["可执行文件","参数1","参数2"...];示例:RUN ["~/zk.sh","stop"]等价于RUN ~/zk.sh stop
  4. EXPOSE:声明当前容器对外暴露的端口
  5. WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
  6. USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root
  7. ENV:用来在构建镜像过程中设置环境变量
  8. ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
  9. COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。COPY src源路径 dest目标路径COPY ["src源路径", "dest目标路径"]
  10. VOLUME:容器数据卷,用于数据保存和持久化工作
  11. CMD:指定容器启动后的操作,除了shell格式和exec格式,当指定了ENTRYPOINT指令时,会成为参数列表格式:CMD ["参数1","参数2"...]

Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换

CMD是在docker run时运行;RUN是在docker build时运行。

  1. 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
#当前最新的7.2.3;debian
FROM redis

ADD jdk-8u391-linux-x64.tar.gz /usr/local/java/
#配置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

默认三大网络模式:

  1. bridge:网桥模式(相当于NAT)
  2. host:主机网络(相当于主机网络)
  3. none:无网络
1
2
3
4
5
6
#查看网络源数据
docker network inspect XXX网络名字
#新建网络
docker network create XXX网络名字
#删除网络
docker network rm XXX网络名字

作用:内置了容器服务名和ip的映射,容器IP变动时候可以通过服务名直接网络通信而不受到影响

  1. 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 文件中定义

使用步骤:

  1. 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
  2. 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
  3. 执行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环境,包括单机环境和集群环境。

官网:PortainerInstall 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了

上一篇:
Spring Cloud Alibaba
下一篇:
Kafka