35.docker(三)

文章目录

  • [第7章 容器监控](#第7章 容器监控)
  • [第8章 容器日志](#第8章 容器日志)
    • [Docker logs](#Docker logs)
  • [第9章 Docker-compose](#第9章 Docker-compose)
  • [第10章 docker图形界面管理](#第10章 docker图形界面管理)
    • [DockerUI 容器管理器的安装与使用](#DockerUI 容器管理器的安装与使用)
    • [Docker 图形化界面管理工具 Portainer](#Docker 图形化界面管理工具 Portainer)

第7章 容器监控

Docker自带的监控子命令

当Docker部署规模逐步变大后,可视化监控容器环境的性能和健康状态将会变得越来越重要。

ps

docker ps 是我们早已熟悉的命令了,方便我们查看当前运行的容器。前面已经有大量示例,这里就不赘述了。

bash 复制代码
[root@docker ~ 21:53:26]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
5755c870ce7b   mysql:5.7   "docker-entrypoint.s..."   26 minutes ago   Up 26 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql

top

查看容器的进程

bash 复制代码
[root@docker ~ 21:53:48]# docker top --help

Usage:  docker top CONTAINER [ps OPTIONS]

Display the running processes of a container

Aliases:
  docker container top, docker top

示例:

bash 复制代码
[root@docker ~ 21:54:44]# docker top 57
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
systemd+            7461                7440                0                   21:26               ?                   00:00:00            mysqld

命令后面还可以跟上 Linux 操作系统 ps 命令的参数显示特定的信息,比如 -au

bash 复制代码
[root@docker ~ 21:55:14]# docker top 57 -au
USER                PID                 %CPU                %MEM                VSZ                 RSS                 TTY                 STAT                START               TIME                COMMAND
systemd+            7461                0.0                 2.8                 1174700             223944              ?                   Ssl                 21:26               0:00                mysqld

stats

列出容器资源使用率

bash 复制代码
[root@docker ~ 21:55:25]# docker stats --help

Usage:  docker stats [OPTIONS] [CONTAINER...]

Display a live stream of container(s) resource usage statistics

Aliases:
  docker container stats, docker stats

Options:
  -a, --all             Show all containers (default shows just running)
      --format string   Format output using a custom template:
                        'table':            Print output in table format with column headers
                        (default)
                        'table TEMPLATE':   Print output in table format using the given Go
                        template
                        'json':             Print in JSON format
                        'TEMPLATE':         Print output using the given Go template.
                        Refer to https://docs.docker.com/go/formatting/ for more information
                        about formatting output with templates
      --no-stream       Disable streaming stats and only pull the first result
      --no-trunc        Do not truncate output

示例:

bash 复制代码
[root@docker ~ 21:55:51]# docker stats 

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O           BLOCK I/O     PIDS
5755c870ce7b   mysql     0.01%     203MiB / 7.486GiB   2.65%     6.13kB / 11.1kB   0B / 30.4MB   30

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O           BLOCK I/O     PIDS
5755c870ce7b   mysql     0.02%     203MiB / 7.486GiB   2.65%     6.13kB / 11.1kB   0B / 30.4MB   30

默认会显示一个实时变化的列表,展示每个容器的 CPU 使用率,内存使用量和可用量,网络和磁盘的 IO 数据。

注意:容器启动时如果没有特别指定内存 limit,stats 命令会显示 host 的内存总量,但这并不意味着每个 container 都能使用到这么多的内存。

cAdvisor

cAdvisor 是 google 开发的容器监控工具。

bash 复制代码
[root@docker ~ 21:58:47]# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw  --volume=/sys:/sys:ro  --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest

也可以使用镜像hub.c.163.com/xbingo/cadvisor:latest。

通过 http://[Host_IP]:8080 访问 cAdvisor。首次打开比较慢,系统需要收集数据并绘制图表。

点击Docker Containers进去看容器具体信息

总结:

  • 缺点:操作界面略显简陋,而且需要在不同页面之间跳转,并且只能监控一个 host。
  • 优点:可以将监控到的数据导出给第三方工具,由这些工具进一步加工处理。

结论:我们把 cAdvisor 定位为一个监控数据收集器,并导出数据给第三方工具,而非展示数据。

第8章 容器日志

高效的监控和日志管理对保持生产系统持续稳定地运行以及排查问题至关重要。

在微服务架构中,由于容器的数量众多以及快速变化的特性使得记录日志和监控变得越来越重要。考虑到容器短暂和不固定的生命周期,当我们需要 debug 问题时有些容器可能已经不存在了。因此,一套集中式的日志管理系统是生产环境中不可或缺的组成部分。

Docker logs

对于一个运行的容器,Docker 会将日志发送到 容器标准输出设备(STDOUT)和标准错误设备(STDERR),STDOUT 和 STDERR 实际上就是容器的控制台终端。

举个例子,用下面的命令运行 httpd 容器:

bash 复制代码
[root@docker ~ 22:00:50]# docker run -p 80:80 httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message
[Fri Nov 21 14:03:34.467638 2025] [mpm_event:notice] [pid 1:tid 1] AH00489: Apache/2.4.65 (Unix) configured -- resuming normal operations
[Fri Nov 21 14:03:34.467897 2025] [core:notice] [pid 1:tid 1] AH00094: Command line: 'httpd -D FOREGROUND'

我们在启动日志的时候没有用 -d 参数,httpd 容器以前台方式启动,日志会直接打印在当前的终端窗口。

如果加上 -d 参数以后台方式运行容器,我们就看不到输出的日志了。

bash 复制代码
[root@docker ~ 22:03:56]# docker run -d -p 80:80 httpd
12b124587c2983710dde852e43fffd3e27e446912c52477e5aa7d71fbd9b04af

这种情况下如果要查看容器的日志,有两种方法:

  1. attach 到该容器。
  2. docker logs 命令查看日志。

先来看 attach 的方法。运行 docker attach 命令。

bash 复制代码
[root@docker ~ 22:04:13]# docker attach 12

attach 到了 httpd 容器,但并没有任何输出,这是因为当前没有新的日志信息。

为了产生一条新的日志,可以在 host 的另一个命令行终端执行 curl localhost

终端B:

bash 复制代码
[root@docker ~ 21:13:39]# curl localhost
<html><body><h1>It works!</h1></body></html>
[root@docker ~ 22:04:58]# curl localhost
<html><body><h1>It works!</h1></body></html>

这时,attach 的终端就会打印出新的日志。

终端A:

bash 复制代码
[root@docker ~ 22:04:13]# docker attach 12
172.17.0.1 - - [21/Nov/2025:14:04:58 +0000] "GET / HTTP/1.1" 200 45
172.17.0.1 - - [21/Nov/2025:14:05:01 +0000] "GET / HTTP/1.1" 200 45

attach 的方法在实际使用中不太方便,因为:

  1. 只能看到 attach 之后的日志,以前的日志不可见。
  2. 退出 attach 状态比较麻烦(Ctrl+p 然后 Ctrl+q 组合键),一不小心很容器将容器杀掉(比如按下 Ctrl+C)。

查看容器日志推荐的方法是用 docker logs 命令。

bash 复制代码
[root@docker ~ 22:05:24]# docker logs 12
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message
[Fri Nov 21 14:04:13.031689 2025] [mpm_event:notice] [pid 1:tid 1] AH00489: Apache/2.4.65 (Unix) configured -- resuming normal operations
[Fri Nov 21 14:04:13.031791 2025] [core:notice] [pid 1:tid 1] AH00094: Command line: 'httpd -D FOREGROUND'
172.17.0.1 - - [21/Nov/2025:14:04:58 +0000] "GET / HTTP/1.1" 200 45
172.17.0.1 - - [21/Nov/2025:14:05:01 +0000] "GET / HTTP/1.1" 200 45
[Fri Nov 21 14:05:24.058673 2025] [mpm_event:notice] [pid 1:tid 1] AH00491: caught SIGTERM, shutting down

docker logs 能够打印出自容器启动以来完整的日志,并且 -f 参数可以继续打印出新产生的日志,效果上与 Linux 命令 tail -f 一样。

第9章 Docker-compose

我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。如果每个容器都要按顺序手动启停,那么维护工作量将会很大,而且工作效率也很低。

Docker Compose 可以轻松、高效地管理容器,它是一个用于定义和运行多容器的管理工具。

它通过一个单独的 docker-compose.yml 模板文件(YAML 格式)定义一组相关联资源集。

Compose 中有两个重要的概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose 项目由 Python 编写(后用Go语言重写),实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

命令说明

bash 复制代码
[root@docker ~ 22:05:33]# docker compose -h
Flag shorthand -h has been deprecated, please use --help

Usage:  docker compose [OPTIONS] COMMAND

Define and run multi-container applications with Docker

Options:
      --all-resources              Include all resources, even those not used by services
      --ansi string                Control when to print ANSI control characters
                                   ("never"|"always"|"auto") (default "auto")
      --compatibility              Run compose in backward compatibility mode
      --dry-run                    Execute command in dry run mode
      --env-file stringArray       Specify an alternate environment file
  -f, --file stringArray           Compose configuration files
      --parallel int               Control max parallelism, -1 for unlimited (default -1)
      --profile stringArray        Specify a profile to enable
      --progress string            Set type of progress output (auto, tty, plain, quiet) (default
                                   "auto")
      --project-directory string   Specify an alternate working directory
                                   (default: the path of the, first specified, Compose file)
  -p, --project-name string        Project name

Commands:
  attach      Attach local standard input, output, and error streams to a service's running container
  build       Build or rebuild services
  config      Parse, resolve and render compose file in canonical format
  cp          Copy files/folders between a service container and the local filesystem
  create      Creates containers for a service
  down        Stop and remove containers, networks
  events      Receive real time events from containers
  exec        Execute a command in a running container
  images      List images used by the created containers
  kill        Force stop service containers
  logs        View output from containers
  ls          List running compose projects
  pause       Pause services
  port        Print the public port for a port binding
  ps          List containers
  pull        Pull service images
  push        Push service images
  restart     Restart service containers
  rm          Removes stopped service containers
  run         Run a one-off command on a service
  scale       Scale services 
  start       Start services
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop services
  top         Display the running processes
  unpause     Unpause services
  up          Create and start containers
  version     Show the Docker Compose version information
  wait        Block until the first service container stops
  watch       Watch build context for service and rebuild/refresh containers when files are updated

Run 'docker compose COMMAND --help' for more information on a command.

version

bash 复制代码
[root@docker ~ 22:48:01]# docker compose version
Docker Compose version v2.27.0

Compose 模板

模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 docker run 相关参数的含义都是类似的。

默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。

模板文件结构

  • version:用来定义模板文件的版本,不同版本的模板,格式也不一样。
  • 资源列表:用来定义资源清单,包括service、secret、network、volume等。
  • 注释行: # 开头的注释行。

示例:使用版本2模板,定义一个使用httpd镜像的services。

bash 复制代码
version: "2"

services:
  webapp:
    image: httpd

详细结构参考官方

Compose文档

实战-Wordpress

回顾一下如果用docker run改如何操作:

bash 复制代码
[root@docker ~ 22:51:23]# docker run -itd  --name db --restart always -v /db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=huawei -e MYSQL_DATABASE=wordpress mysql:5.7
e3ce362a8cb97831773a60d06b83706235bc1d73c3274180216959d847d586e0

[root@docker ~ 22:51:49]# docker run -itd --name blog -v /web:/var/www/html -p 80:80 --link db -e WORDPRESS_DB_HOST=DB -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=huawei -e WORDPRESS_DB_NAME=wordpress wordpress
431b9f493c3ed00959b7d3194c589ff7d5193e75ef11e159133ced8f3b6c2309

[root@docker ~ 23:04:17]# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED             STATUS             PORTS                                                  NAMES
431b9f493c3e   wordpress                "docker-entrypoint.s..."   3 minutes ago       Up 3 minutes       0.0.0.0:80->80/tcp, :::80->80/tcp                      blog
e3ce362a8cb9   mysql:5.7                "docker-entrypoint.s..."   12 minutes ago      Up 12 minutes      3306/tcp, 33060/tcp                                    db
5299f5c709e9   google/cadvisor:latest   "/usr/bin/cadvisor -..."   About an hour ago   Up About an hour   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              cadvisor
5755c870ce7b   mysql:5.7                "docker-entrypoint.s..."   2 hours ago         Up 2 hours         0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql

测试效果:

通过docker compose来统一管理这两个容器呢?

假设新建一个名为 wordpress 的文件夹,然后进入这个文件夹,创建 docker-compose.yml 文件

bash 复制代码
# 删除之前的环境
[root@docker ~ 23:04:21]# docker rm -f $(docker ps -aq)

# 通过docker compose实现多个容器一起启动
[root@docker ~ 23:06:46]# mkdir wordpress
[root@docker ~ 23:06:56]# cd wordpress/
[root@docker wordpress 23:07:01]# vim docker-compose.yml
services:
 blog:  #服务名字,相当于docker run的时候指定的一个名称
  image: wordpress:latest  #必选,镜像的名字
  restart: always
  links: 
   - db
  ports:   #可选,等价于 docker run 里的 -p 选项指定端口映射
   - "80:80"
  environment:   #可选,等价于 docker run 里的 --env 选项设置环境变量
   - WORDPRESS_DB_HOST=db
   - WORDPRESS_DB_USER=root
   - WORDPRESS_DB_PASSWORD=huawei
   - WORDPRESS_DB_NAME=wordpress
 db:
  image: mysql:5.7
  restart: always
  environment:
   - MYSQL_ROOT_PASSWORD=huawei
   - MYSQL_DATABASE=wordpress

[root@docker wordpress 23:14:09]# docker compose config -q
[root@docker wordpress 23:14:11]#

后端运行

bash 复制代码
[root@docker wordpress 23:14:25]# docker compose up -d
[+] Running 3/3
 ✔ Network wordpress_default   Created                                                             0.3s 
 ✔ Container wordpress-db-1    Started                                                             0.6s 
 ✔ Container wordpress-blog-1  Started 

查看现象

bash 复制代码
[root@docker wordpress 23:14:33]# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED         STATUS         PORTS                               NAMES
9f56da832ddf   wordpress:latest   "docker-entrypoint.s..."   9 seconds ago   Up 7 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   wordpress-blog-1
9ff2eb0dd000   mysql:5.7          "docker-entrypoint.s..."   9 seconds ago   Up 8 seconds   3306/tcp, 33060/tcp                 wordpress-db-1

第10章 docker图形界面管理

DockerUI 容器管理器的安装与使用

简介:

DockerUI是一个易用且轻量化的 Docker 管理工具,通过 Web 界面的操作,更方便对于 Docker 指令不熟悉的用户更容易操作 Docker 。

功能:

  • Docker主机管理:数据卷管理,镜像管理,容器管理,构建管理,仓库配置管理,网络配置管理
  • Docker Swarm集群管理:集群概要信息,节点管理,Service管理,任务管理,密码管理,配置管理

镜像:

我今天分享的这个镜像是来自于这位大佬@joinsunsoft 的,他发布在Docker Hub的镜像地址为:https://hub.docker.com/r/joinsunsoft/docker.ui

安装

启动容器并映射8999端口:

bash 复制代码
[root@docker ~ 23:24:11]# docker run -d --name docker.ui --restart always -v /var/run/docker.sock:/var/run/docker.sock -p 8999:8999 joinsunsoft/docker.ui
Unable to find image 'joinsunsoft/docker.ui:latest' locally
latest: Pulling from joinsunsoft/docker.ui
213ec9aee27d: Pull complete 
362df81e5664: Pull complete 
c3f864fca442: Pull complete 
5a55080a5af0: Pull complete 
497ed8376dfb: Pull complete 
4642bc86bdfb: Pull complete 
af43397a88d3: Pull complete 
Digest: sha256:1b70b86be661e931e112d8b59850eeac927966679c52b46064d67df2c489d7a5
Status: Downloaded newer image for joinsunsoft/docker.ui:latest
b311625604d19bb067e1579309ab405d2e6ef89dd7495881911597bf9ac5060f

启动效果

你可以访问:http://192.168.108.30:8999

默认用户名密码:ginghan /123456

DockerUI的主界面(概览),它展示的信息还是很多的,除了容器相关,还有资源占用情况等信息。

Docker 图形化界面管理工具 Portainer

Portainer 是一个 Docker 图形化管理工具,可以通过 Web UI 轻松的管理容器、镜像、网络、卷。同时上手难度也更大一些

Portainer 分为社区版和商业版,本文安装的是社区版(Portainer CE),该版本免费,比较适合个人用户使用

安装

1.创建存储卷

bash 复制代码
[root@docker ~ 23:29:22]# docker volume create portainer_data
portainer_data

2.通过docker安装Portainer

bash 复制代码
[root@docker ~ 00:07:51]# docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
Unable to find image 'portainer/portainer-ce:latest' locally
latest: Pulling from portainer/portainer-ce
a48e87497a08: Pull complete 
7e764748a0e3: Pull complete 
04f56cab0724: Pull complete 
666c509ccde9: Pull complete 
6109bb7d1248: Pull complete 
da18f9659f11: Pull complete 
e80185cdbc79: Pull complete 
4f4fb700ef54: Pull complete 
Digest: sha256:83fab9ec8e05a9ca17c64d2288fef25f498124eccdbcd12eaff9238870884630
Status: Downloaded newer image for portainer/portainer-ce:latest
eac9fc7020e443b6dd52c919ac8434729ed2fd215b96ba2728a67194deae648c

9443 端口默认会启用 SSL,如果需要直接通过 http 访问,需要加上 -p 9000:9000 访问 9000 端口

这里,-v /var/run/docker.sock:/var/run/docker.sock 参数使得Portainer能够访问Docker守护进程,从而能够管理容器。-v portainer_data:/data 参数则用于持久化Portainer的数据。

访问

通过 http://ip:9000 或者 https://ip:9443 访问 Portainer,首次访问需要创建管理员账号

创建用户及密码

完成登录后,管理本机直接点击 Get Started

进入主界面可以看到 local,点击 Live connect

连接到该机器后,就可以看到 Docker 相关状态并且可以对其进行管理

相关推荐
野猪佩挤2 小时前
k8s部署loki(distributed模式)
云原生·容器·kubernetes
小钱c72 小时前
docker相关常用指令
运维·docker·容器
ChenXinBest2 小时前
一次firewalld和docker冲突问题排查
linux·docker
随风语3 小时前
Docker学习
docker·容器
m0_488777653 小时前
Docker Compose 编排
docker·容器·docker-compose·编排管理多个服务
Code知行合壹3 小时前
Kubernetes实战进阶
云原生·容器·kubernetes
xuhe23 小时前
[重磅更新] 支持最新 Overleaf 6.x!我的私有化部署方案 xuhe2/sharelatex-ce 迎来大升级
linux·docker·github·科研·overleaf
不想画图3 小时前
dockerfile镜像构建和docker compose编排
docker·容器
半壶清水4 小时前
ubuntu中使用使用Docker-Compose管理MySQL、Apache、PHP容器
mysql·ubuntu·docker·php·apache