张国远 發表於 2025-3-27 17:03:00

docker常用命令

<p>docker的安装很多,就不说了</p>
<p>docker常用命令:</p>
<p>注:以下命令中,凡涉及到容器id的,都可以用容器id前三位,或者容器name</p>
<p>重启Docker服务:<strong>systemctl restart docker</strong> / <strong>service docker restart</strong><br>关闭Docker服务:<strong>docker service docker stop</strong> / <strong>docker systemctl stop docker</strong></p>
<p>查看Docker服务状态:<strong>systemctl status docker</strong><br>停止容器:<strong>docker stop 容器ID</strong><br>重启容器:<strong>docker restart 容器ID</strong><br>删除容器:<strong>docker rm container_id</strong><br>搜索仓库镜像:<strong>docker search 镜像名</strong><br>查看镜像:<strong>docker images</strong>&nbsp; &nbsp; / <strong>docker image ls</strong><br>拉取镜像:<strong>docker pull 镜像名(或docker pull nginx:xxx ,xxx指版本号)</strong><br>删除镜像:<strong>docker image rm image_id&nbsp; &nbsp;/ &nbsp;<strong>docker rmi image_id</strong></strong><br>启动(停止的)容器:<strong>docker start 容器ID</strong><br>启动(新)容器:<strong>docker run -it ubuntu /bin/bash</strong>(或docker run -p 80:80 -d --name nginx nginx:1.24.0,第一个80宿主机端口,第二个80容器端口)<br>进入容器:<strong>docker attach 容器ID&nbsp; /&nbsp; &nbsp;docker exec -it 容器ID /bin/bash</strong>,推荐使用后者。<br>先启动再设置自启动:<strong>docker update --restart=always容器ID</strong>&nbsp; &nbsp; &nbsp;(执行后需要systemctl restart docker 才能生效)<br>查看正在运行的容器:<strong>docker ps</strong><br>查看所有容器:<strong>docker ps -a</strong></p>
<p>查看docker内存情况:<strong>docker stats -a</strong>&nbsp; &nbsp; /&nbsp; <strong>dokcer stats</strong></p>
<p>查看容器配置&nbsp;:<strong>docker inspect 容器id</strong></p>
<p>查看容器挂载目录&nbsp;:<strong>docker inspect 容器id |grep Destination</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>生成image镜像:</p>
<div><strong>docker build -t image_name:v1 .</strong></div>
<div>docker build -t 名字 冒号 版本号(v1,v2&nbsp;&nbsp;0.0.1&nbsp;&nbsp;0.0.2) 空格&nbsp;&nbsp;点</div>
<div>注:后面的点一定不能掉,冒号和版本号可以不要</div>
<p>运行 docker run:</p>
<div>完整版:<strong>docker run -dit --name docker_name --add-host www.baidu.com:192.168.1.100&nbsp;&nbsp;-p 8888:8000&nbsp; --log-driver json-file --log-opt max-size=5120m --log-opt max-file=2 --restart=always -v /data/app/docker_name:/src:rw docker_name:v1 /bin/bash</strong></div>
<p><strong>-dit</strong>&nbsp; 不清楚</p>
<p><strong>--name docker_name</strong>&nbsp; 定义docker容器的名称,如果不填会随机分配一个名字,建议还是填一个</p>
<p><strong>--add-host&nbsp;www.baidu.com:192.168.1.100</strong>&nbsp; 设置host,如果一切没问题,这个可以不要</p>
<p><strong>-p 8888:8000&nbsp;</strong> &nbsp;设置端口映射,8888为宿主机端口,8000为docker内部端口,含义:访问宿主机8888的时候,相当于访问docker里的8000端口</p>
<p><strong>--log-driver json-file --log-opt max-size=5120m --log-opt max-file=2</strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;--log-opt max-size=5120m为设置日志文件单个大小为 5120M&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;--log-opt max-file=2&nbsp;设置文件最多为2个,多余的会删掉&nbsp; &nbsp; &nbsp; (这一步建议根据自己服务器设置,不设置的话会无限增长)</p>
<p><strong>--restart=always&nbsp;</strong> &nbsp;设置会一直重启,重启dockers后会自启动,防止以外终止</p>
<p><strong>-v /data/app/docker_name:/src:rw&nbsp;</strong> &nbsp; 服务器文件夹与docker里文件夹映射,含义:宿主机/data/app/docker_name 这个文件夹对应容器里的/src ,容器对这个文件夹具有 rw权限,r : 独&nbsp; w:写,&nbsp;&nbsp;&nbsp; 重要文件最好都这样,比如用户上传的图片等,防止docker rm&nbsp;docker_name 后丢失</p>
<p><strong>docker_name:v1</strong>&nbsp; &nbsp; &nbsp;image的名称和版本号</p>
<p><strong>/bin/bash&nbsp;</strong> 不清楚</p>
<p>&nbsp;</p>
<p>查看docker日志:</p>
<p>跟踪查看日志:<strong>docker logs -f -t&nbsp;&nbsp;容器名称或者容器id</strong></p>
<p>查看最新n行日志:<strong>docker logs -t --tail=50 容器名称或容器id</strong></p>
<p>查看某个时间之后的日志:<strong>docker logs -t --since="2022-09-22T09:10:00" 容器名称或容器id</strong></p>
<p>查看最近30min的日志:&nbsp;<strong>docker logs --since 30m 容器名称或容器id</strong></p>
<p>查看某个时间段日志:<strong>docker logs -t --since="2022-09-22T09:10:00" --until "2022-09-22T09:20:00" 容器名称或容器id</strong></p>
<p>查看日志路径:<strong>docker inspect --format='{{.LogPath}}' &lt;容器ID&gt;</strong></p>
<p>导出docker日志到文件:<strong>docker logs --since="2023-04-28T00:00:00" --until "2023-04-28T12:00:00" 容器id &gt;&gt;file.log</strong></p>
<p>查看日志大小:<strong>docker inspect --format='{{.LogPath}}'&nbsp;&lt;容器ID&gt; | xargs sudo du -sh</strong></p>
<p>docker 查看日志大小(/data/docker 为docker的安装目录):</p>
<p><strong>for d in $(ls -d /data/docker/containers/*); do ls --time-style=long-iso -lh $d/*-json.log | awk -F' *|/' '{printf("%30s\t%s\t%s %s\t%s\n", "'$(docker ps -af id=${d##*/} --format "table {{.Names}}" | tail -1)'", $5, $6, $7, $14) }'; done</strong></p>
<p>清理指定docker的日志(xxxx为docker容器的名称):</p>
<p><strong>echo &gt; /data/docker/containers/$(docker ps --no-trunc -aqf 'name=xxxx')/*-json.log</strong></p>
<p>&nbsp;</p>
<p>docker镜像的导入导出:</p>
<p>1》源机器与目标机器系统一致的情况下:(比如都是amd)</p>
<p>&nbsp; &nbsp; &nbsp;1、在源机器,镜像打包:docker save 镜像名称:镜像版本 &gt;打包后的文件名字.tar<br>&nbsp; &nbsp; &nbsp;2、在目标机器,将镜像加载到Docker:docker load -i 打包后的文件名字.tar(例子:docker load -i minio.tar)</p>
<p>2》源机器与目标机器系统不一致的情况下:(源机器是amd,目标机器是arm)</p>
<div>&nbsp; &nbsp; 1、<strong>docker&nbsp;&nbsp;pull&nbsp;&nbsp;&nbsp;--platform&nbsp;&nbsp;linux/arm64&nbsp;&nbsp;</strong><strong>mcr.microsoft.com/dotnet/aspnet:6.0</strong><br></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 注:linux/arm64&nbsp;&nbsp;不可填成&nbsp;&nbsp;linux/arm&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mcr.microsoft.com/dotnet/aspnet:6.0&nbsp;&nbsp;&nbsp;为&nbsp;&nbsp;image的名称和版本号</div>
<div>&nbsp; &nbsp; &nbsp;2、<strong>docker&nbsp;save&nbsp;-o&nbsp;aspnet.tar&nbsp;</strong><strong>mcr.microsoft.com/dotnet/aspnet:6.0</strong><br></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;注:这一步是导出基础image</div>
<div>&nbsp; &nbsp; &nbsp;3、<strong>docker&nbsp;load&nbsp;-i&nbsp;/data/app/aspnet.tar</strong></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;注:这一步是导入基础image</div>
<div>&nbsp; &nbsp; &nbsp;4、这个时候就可以继续&nbsp;&nbsp;docker&nbsp;build了</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>
<div>net6项目中使用DateTime.Now获取到的时间比本地时间要差8小时,但是docker容器中,使用date获取的时间是正确的,网上提供了很多种方法,主要有以下三种方法,其中前面两种方法我尝试过了,是可以行得通的,下面是常见的三种方法:(推荐方法2)</div>
<div>&nbsp;</div>
<div>1. 进入docker内部将本地时间链接到默认的本地时间,解决方法如上</div>
<div>&nbsp;</div>
<div># 进入容器命令行</div>
<div><strong>docker exec -it /bin/bash</strong></div>
<div># 一般都已经安装了 timezone 数据包,如遇到未安装则执行,yum命令有的容器中无法使用,可以使用 apt-get install -y tzdata</div>
<div>yum install -y tzdata</div>
<div># 软链接时区文件到localtime</div>
<div><strong>ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &amp;&amp; echo 'Asia/Shanghai' &gt;/etc/timezone</strong></div>
<div>&nbsp;</div>
<div>2.通过dockerfile在安装项目的时候,命令和第一种方法差不多,只是运行时间不一样,将下面的代码放在dockerfile即可,该方法亲手尝试也可以行得通的</div>
<div><strong>RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \</strong></div>
<div><strong>&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; echo 'Asia/Shanghai' &gt;/etc/timezone</strong></div>
<div>&nbsp;</div>
<div>3.直接从宿主机拷入时区文件到docker中,来实现时区,命令如下,该方法我尝试了,两种命令都报错了,第一个方法报错no such directory,我查询了宿主机确实没有/etc/localtime目录,于是用了第二个命令也报错了,报错如下:Error response from daemon: Error processing tar file(exit status 1): unlinkat /usr/share/zoneinfo/Asia/Shanghai: device or resource busy,于是就没有办法进行下去,这个方式没有走的通</div>
<div>&nbsp;</div>


</div>
<p><br>容器内安装需要的命令:(由于linux上一些命令在容器内没有,可以在Dockerfile里编写,也可以手动添加,此为手动添加)</p>
<p>1、进入容器&nbsp; &nbsp;<strong>docker exec -it 容器id /bin/bash</strong></p>
<p>2、执行安装命令</p>
<div>&nbsp; &nbsp; &nbsp; &nbsp;安装 curl: <strong>apt&nbsp;install&nbsp;curl</strong></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp;安装ping: <strong>apt&nbsp;install&nbsp;iputils-ping</strong></div>
<div>3、退出容器&nbsp; &nbsp;&nbsp;<strong>exit</strong></div>
<div>&nbsp;</div><br><br>
来源:https://www.cnblogs.com/LinryBaker/p/18796107
頁: [1]
查看完整版本: docker常用命令