基础部分
简介
背景:
一个项目从开发到上线,从操作环境,到运行环境,再到应用配置,需要关心很多东西,特别是各种版本的迭代之后,不同版本环境的兼容问题,对于开发和运维都是不小的考验。
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了