如果您想了解Docker查看应用的实际内存和docker查看内存占用的知识,那么本篇文章将是您的不二之选。我们将深入剖析Docker查看应用的实际内存的各个方面,并为您解答docker查看内存占用的疑
如果您想了解Docker 查看应用的实际内存和docker查看内存占用的知识,那么本篇文章将是您的不二之选。我们将深入剖析Docker 查看应用的实际内存的各个方面,并为您解答docker查看内存占用的疑在这篇文章中,我们将为您介绍Docker 查看应用的实际内存的相关知识,同时也会详细的解释docker查看内存占用的运用方法,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- Docker 查看应用的实际内存(docker查看内存占用)
- 167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo
- Docker 04 应用部署与迁移备份 Dockerfile 与 Docker 私有仓库
- docker cp 和 docker exec 查看 docker 运行的容器信息
- docker history 查看docker镜像构建过程 还原dockerfile 查看启动参数
Docker 查看应用的实际内存(docker查看内存占用)
前言
我们把应用部署到 Docker 里面之后,有什么办法查看这个应用占用了多少内存呢?
docker 本身提供了一个命令让我们可以直接看到当前时间所有容易占用的情况。
docker stats --no-stream

从上面来看,这几个应用用的内存加起来已经是将近 12G 了。
但是,这个时候看到机器使用的内存还不到 2G。

第一反应就是,docker 这个统计太离谱,太坑人了。
查了一番资料过后,其实是计算的问题,也不能说那个是错的。
注:这里的 docker 版本是
Docker version 20.10.2, build 2291f61
一般来说应用对内存的占用,这个指标其实是十分重要的,不然内存泄漏都难以发现。
如果我们想要看到应用比较真实的内存要怎么做呢?
处理方案
其实可以分成两个步骤
-
找到应用的真实进程 Id (宿主机里面的) -
从宿主机的 /proc/pid/status
去看VmRSS
的值
找 Pid
docker inspect
命令可以看到当前容器的一些信息,里面也包含了我们要找的这个 Pid。
docker inspect -f ''{{.State.Pid}}'' 容器ID
这个时候就找到了对应的 Pid 了。
ps
看了一下这个 Pid 确实是应用的。
这个时候第一步就完成了。
查 VmRSS
有了 Pid 之后,要查内存就比较容易了。
直接 cat /proc/pid/status
就能看到了。

虽说这样能找到某个应用具体的内存,但是每次都这样去操作一遍也是挺麻烦的。
而且这样操作一次只能查一个应用,想看多个应用还要分多次。
既然有了上面的步骤,那么我们就可以把这个整理成一个脚本,每次执行一下这个脚本就可以了。
# 找出所有运行的容器
idNames=`docker ps --format "{{.ID}}|{{.Names}},"`
# 按,号分隔
OLD_IFS="$IFS"
IFS=","
arr=($idNames)
IFS="$OLD_IFS"
# 输出 Title
printf "%-15s %-30s %-15s\n" Id Name Mem
# 遍历所有容器
for item in ${arr[@]}
do
# 容器ID和容器名字 按 | 分隔
OLD_IFS="$IFS"
IFS="|"
array=($item)
IFS="$OLD_IFS"
# 当前容器的Pid
pid=`docker inspect -f ''{{.State.Pid}}'' ${array[0]}`
# 当前容器的内存
mem=$(cat /proc/$pid/status|grep -e VmRSS| awk ''{print $2}'')
# 输出结果
printf "%-15s %-30s %-15s\n" ${array[0]} ${array[1]} $[$mem / 1024]M
done
执行上面的脚本后,就可以看到当前正在运行的容器的内存占用情况了。

现在看上去,占用大概是 1G 多,加上其他的内存占用,这个值看上去就和 free
看到的不到 2G 的使用内存比较接近了。

本文分享自微信公众号 - dotNET 跨平台(opendotnet)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。
167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo
background : 最近为小伙伴们筹划docker系列的技术分享,研究了一会docker相关技术, 在此记录一下构建nginx容器时候的坑
1.nginx服务器根目录问题
docker 官方镜像提供的nginx基于debian/jessie平台,其文件结构和ubuntu中的nginx中并不相同
eg:
run一个niginx容器
<span>//80端口被占用,so...</span> $ sudo docker run <span>-it</span><span>-p</span><span>800</span>:<span>800</span> nginx $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES <span>1801</span>a32aab54 nginx <span>"nginx -g ''daemon off"</span><span>2</span> minutes ago Up <span>2</span> minutes <span>80</span>/tcp, <span>443</span>/tcp, <span>0.0</span><span>.0</span><span>.0</span>:<span>800</span><span>-></span><span>800</span>/tcp berserk_kare
进入容器内部
<span>$ </span>sudo docker exec -it <span>1801</span>a32aab54 /bin/bash root<span>@1801a32aab54</span><span>:/</span><span># </span>
查看nginx目录
<span># cd /etc/nginx/</span> conf<span>.d</span>/ koi-utf mime<span>.types</span> nginx<span>.conf</span> uwsgi_params fastcgi_params koi-win modules/ scgi_params win-utf
可以看到不仅没有熟悉的 /sites-available,也没有 /sites-enabled
继续查看nginx配置
<span># cat /conf.d/default.conf</span><span>server</span> { listen <span>80</span>; server_name localhost; <span>#charset koi8-r;</span><span>#access_log /var/log/nginx/log/host.access.log main;</span> location / { root /usr/share/nginx/html; <span>index</span><span>index</span>.html <span>index</span>.htm; } <span>#error_page 404 /404.html;</span><span># redirect server error pages to the static page /50x.html</span><span>#</span> error_page <span>500</span><span>502</span><span>503</span><span>504</span> /<span>50</span>x.html; location = /<span>50</span>x.html { root /usr/share/nginx/html; } <span>#...省略php-fpm配置,好长..</span> }
根目录配置: root /usr/share/nginx/html;
测试
<span># cd /usr/share/nginx/html</span><span># touch index.html</span><span># echo "test nginx in docker" >index.html</span>
php-fpm配置相关
'').addClass(''pre-numbering'').hide(); $(this).addClass(''has-numbering'').parent().append($numbering); for (i = 1; i '').text(i)); }; $numbering.fadeIn(1700); }); });以上就介绍了167 docker docker构建nginx容器系列问题,包括了docker,nginx方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
Docker 04 应用部署与迁移备份 Dockerfile 与 Docker 私有仓库
MySQL 部署
拉取 mysql 镜像 docker pull centos/mysql-57-centos7
创建 MySQL 容器 docker run -di --name=mysql01 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=320512 centos/mysql-57-centos7
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是 root 用户的登录密码
Tomcat 部署
拉取镜像 docker pull tomcat:7-jre7
创建容器 创建容器 -p 表示地址映射
docker run ‐di ‐‐name=mytomcat ‐p 9000:8080
‐v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7‐jre7
Nginx 部署
拉取镜像 docker pull nginx
创建容器 docker run ‐di ‐‐name=mynginx ‐p 80:80 nginx
Redis 部署
拉取镜像 docker pull redis
创建容器 docker run ‐di ‐‐name=myredis ‐p 6379:6379 redis
迁移与备份
容器保存为镜像
我们可以通过以下命令将容器保存为镜像
docker commit 容器名称 镜像名称
镜像备份
我们可以通过以下命令将镜像保存为 tar 文件
docker save -o tar 文件名称 镜像名称
恢复镜像
docker load -i tar 文件名称
Dockerfile
Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过 Dockerfile 文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。
常用命令
命令 | 作用 |
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是 Dockerfile 的核心部分 (可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和 ADD 相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |
使用脚本创建镜像
步骤:
(1)创建目录
mkdir –p /usr/local/dockerjdk8
(2)下载 jdk-8u171-linux-x64.tar.gz 并上传到服务器(虚拟机)中的 /usr/local/dockerjdk8 目录
(3)创建文件 Dockerfile vi Dockerfile
#依赖镜像名称和 ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER ITCAST
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径 jar, 把 java 添加到容器中
ADD jdk‐8u171‐linux‐x64.tar.gz /usr/local/java/
#配置 java 环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
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
(4)执行命令构建镜像(注意后边的空格和点,不能省略)
docker build ‐t=''jdk1.8'' .
参看镜像是否建立完成
docker images
Docker 私有仓库
私有仓库搭建与配置
(1)拉取私有仓库镜像(此步省略)
docker pull registry
(2)启动私有仓库容器
docker run ‐di ‐‐name=registry ‐p 5000:5000 registry
(3) 打开浏览器输入地址 http://ip:5000/v2/_catalog,看到 {"repositories":[]} 表示私有仓库搭建成功并且内容为空。
(4) 修改 daemon.json vi /etc/docker/daemon.json
添加以下内容,保存退出,这是为了让 docker 信任私有仓库地址 {"insecure-registries":["ip:5000"]}
重启 docker 服务
systemctl restart docker
镜像上传到私有仓库
标记此镜像为私有仓库的镜像 docker tag jdk1.8 ip:5000/jdk1.8
再次启动私服容器
docker start registry
上传标记的镜像
docker push ip:5000/jdk1.8
docker cp 和 docker exec 查看 docker 运行的容器信息
1. 使用 docker 运行 redis 和 postgresql
docker run -d -p 6379:6379 -v /redis/data/:/data redis
docker run -d -p 5432:5432 -v /postgres/data:/var/lib/postgresql/data postgres
2. 验证工作目录
docker inspect redis
3. 查看 contrainer 的名字
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09370c8d3f66 redis "docker-entrypoint..." 2 hours ago Up 2 hours 0.0.0.0:6379->6379/tcp determined_turing
b729386f1712 postgres "docker-entrypoint..." 2 hours ago Up 2 hours 0.0.0.0:5432->5432/tcp mystifying_beaver
4. 进入 redis 进行操作
docker exec -it determined_turing redis-cli
5. 将 images 里面的内容都 copy 到 host 的物理路径下面
docker cp determined_turing:/ /redis
交换顺序就能够将 宿主机的内容 复制到 docker container 里面去了.
docker history 查看docker镜像构建过程 还原dockerfile 查看启动参数
介绍:
~]# docker history --help
Usage: docker history [OPTIONS] IMAGE
Show the history of an image
Options:
--format string Pretty-print images using a Go template
--help Print usage
-H,--human Print sizes and dates in human readable format (default true)
--no-trunc Don't truncate output
-q,--quiet Only show numeric IDs
示例:
~]# docker history kubeguide/tomcat-app:v1
IMAGE CREATED CREATED BY SIZE COMMENT
a29e200a18e9 2 years ago /bin/sh -c #(nop) ADD dir:c5c3bddef49cbc9f... 992kB
<missing> 2 years ago /bin/sh -c #(nop) MAINTAINER bestme <bestm... 0B
<missing> 2 years ago /bin/sh -c #(nop) CMD ["catalina.sh" "run"] 0B
<missing> 2 years ago /bin/sh -c #(nop) EXPOSE 8080/tcp 0B
<missing> 2 years ago /bin/sh -c set -e && nativeLines="$(catal... 0B
<missing> 2 years ago /bin/sh -c set -x && curl -fSL "$TOMCAT_... 16.6MB
<missing> 2 years ago /bin/sh -c #(nop) ENV TOMCAT_TGZ_URL=https... 0B
<missing> 2 years ago /bin/sh -c #(nop) ENV TOMCAT_VERSION=8.0.35 0B
<missing> 2 years ago /bin/sh -c #(nop) ENV TOMCAT_MAJOR=8 0B
<missing> 2 years ago /bin/sh -c set -ex && for key in 05AB33... 114kB
<missing> 2 years ago /bin/sh -c apt-get update && apt-get insta... 7.18MB
<missing> 2 years ago /bin/sh -c { echo 'deb http://httpredir.... 172B
<missing> 2 years ago /bin/sh -c #(nop) ENV OPENSSL_VERSION=1.0.... 0B
<missing> 2 years ago /bin/sh -c #(nop) workdir /usr/local/tomcat 0B
<missing> 2 years ago /bin/sh -c mkdir -p "$CATALINA_HOME" 0B
<missing> 2 years ago /bin/sh -c #(nop) ENV PATH=/usr/local/tomc... 0B
<missing> 2 years ago /bin/sh -c #(nop) ENV CATALINA_HOME=/usr/l... 0B
<missing> 2 years ago /bin/sh -c set -x && apt-get update && a... 163MB
<missing> 2 years ago /bin/sh -c #(nop) ENV JAVA_DEBIAN_VERSION=... 0B
<missing> 2 years ago /bin/sh -c #(nop) ENV JAVA_VERSION=7u101 0B
<missing> 2 years ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/lib/j... 0B
<missing> 2 years ago /bin/sh -c { echo '#!/bin/sh'; echo 's... 87B
<missing> 2 years ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
<missing> 2 years ago /bin/sh -c apt-get update && apt-get insta... 1.17MB
<missing> 2 years ago /bin/sh -c apt-get update && apt-get insta... 44.3MB
<missing> 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 years ago /bin/sh -c #(nop) ADD file:5d8521419ad6cfb... 125MB
如果要让CREATED BY 列完整显示,可以加上 --no-trunc 参数。直接在shell中看会比较乱,可以输出到文件查看,就比较直观了
以PHPmyadmin docker镜像为例,效果如下:
今天的关于Docker 查看应用的实际内存和docker查看内存占用的分享已经结束,谢谢您的关注,如果想了解更多关于167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、Docker 04 应用部署与迁移备份 Dockerfile 与 Docker 私有仓库、docker cp 和 docker exec 查看 docker 运行的容器信息、docker history 查看docker镜像构建过程 还原dockerfile 查看启动参数的相关知识,请在本站进行查询。
本文标签: