Docker 命令 #2

发布时间 2023-04-23 13:57:24作者: 風栖祈鸢

Docker 命令 #2

这次是在阿里云上部署了个新服务,记一下用到的命令。

Linux 命令

查看文件

一般都是使用 ls 命令( list )查看当前目录的文件,或者使用 ls -l 查看文件详情,而 ll 则是 ls -l 的缩写。

移动文件

使用 mv 命令( move )移动文件,用法:mv [选项] 文件源 目的地,如果目的地是一个文件名,则将文件重命名移动。

使用 -i 确定文件移动是否有覆盖:如果 mv 命令会导致文件的覆盖,则系统会询问是否要覆盖:

mv -i qiyuan1.md qiyuan2.md
mv: overwrite 'qiyuan2.md'?

或者使用 -f 强制移动,即使会导致文件的覆盖也会直接移动,使用 -f 后,-i 会失效。

或者使用 -b 为被覆盖的文件创建一个备份:

mv -b qiyuan1.md qiyuan2.md
 
qiyuan2.md~

备份文件的末尾会加上一个 ~ 符号。

复制文件

使用 cp 命令( copy )复制文件,用法:cp [选项] 文件源 目的地,如果目的地是一个文件名,则将文件重命名复制。

cp ./jlr-cons-tianjin/start/ServerStart.sh ./jlr-cons-shanghai-gz-test/start

可选参数如下(都没用到):

  • -i:如果目标文件已经存在,则会询问是否覆盖,cp 命令默认就是 cp -i
  • -d:如果源文件为软链接(对硬链接无效),则复制出的目标文件也为软链接;
  • -l:把目标文件建立为源文件的硬链接文件,不复制源文件;
  • -s:把目标文件建立为源文件的软链接文件,不复制源文件;
  • -p:复制后目标文件保留源文件的属性(包括所有者、所属组、权限和时间);
  • -r:递归复制,用于复制目录;
  • -a:相当于 -d、-p、-r 选项一起用,保留源文件的一切特点;

Docker 命令

runlike

runlike 是一个基于 Go 语言编写的开源工具,用于显示 Docker 容器的命令行参数,并将其格式化为可直接使用的 Docker run 命令。该工具可以让用户快速了解容器的启动参数,便于容器的迁移、备份、调试等操作。它支持通过容器 ID 或名称来查找容器的参数。

使用注意,非 docker runlike <容器名>,而是直接 runlike <容器名>,如:

[root@jaguar-test-02 /extracme/data]# runlike jlr-cons-tianjin
docker run --name=jlr-cons-tianjin --hostname=jlr-cons-tianjin --mac-address=02:42:ac:11:00:11 --env=HostIP=10.0.0.200 
--env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/jdk1.8.0_161/bin 
--env=GLIBC_REPO=https://github.com/sgerrand/alpine-pkg-glibc --env=GLIBC_VERSION=2.28-r0 --env=LANG=C.UTF-8 
--env=JAVA_HOME=/usr/local/jdk1.8.0_161 --env=JAVA_BIN=/usr/local/jdk1.8.0_161/bin 
--env=CLASSPATH=/usr/local/jdk1.8.0_161/lib/dt.jar:/usr/local/jdk1.8.0_161/lib/tools.jar 
--volume=/extracme/data/jlr-cons-tianjin/start/:/usr/local/start/ 
--volume=/extracme/data/jlr-cons-tianjin/logs/:/usr/local/logs/ 
--volume=/extracme/data/jlr-cons-tianjin/java/:/usr/local/java/ 
--privileged --workdir=/usr/local/java -p 8031:8080 -p 9999 --restart=no --runtime=runc --detach=true 
-t wuweis/jdk:1.8.alpine 
/bin/sh -c '/usr/local/start/ServerStart.sh run'

其中指定的参数含义如下:

docker run:运行 Docker 容器的命令

--name=jlr-cons-tianjin:为容器指定名称为 jlr-cons-tianjin

--hostname=jlr-cons-tianjin:将容器的主机名设置为 jlr-cons-tianjin

--mac-address=02:42:ac:11:00:11:将容器的 MAC 地址设置为 02:42:ac:11:00:11

--env=:为容器指定环境变量,格式为 变量名=变量值

--volume=:将本地的目录挂载到容器的目录,格式为 本地目录=容器目录

--privileged:以特权模式运行容器,容器将具有对主机系统的完全访问权限

--workdir=/usr/local/java:将容器的工作目录设置为 /usr/local/java

-p 8031:8080:将主机端口 8031 映射到容器的端口 8080

-p 9999:映射容器端口 9999,没有指定主机端口,就随机用一个

--restart=no:当容器停止运行时,不会自动重新启动容器

--runtime=runc:指定容器运行时为 runc

--detach=true:在后台运行容器

-t wuweis/jdk:1.8.alpine:使用镜像 wuweis/jdk:1.8.alpine 来运行容器

/bin/sh -c '/usr/local/start/ServerStart.sh run':在容器内执行命令 /usr/local/start/ServerStart.sh run

docker inspect

docker inspect <container_id_or_name>

Docker 的 inspect 命令可以返回一个容器的详细信息,包括容器的元数据和配置信息。这个命令可以返回一个 JSON 格式的文本字符串,然后可以使用 Go 的模板语法来处理这个字符串,获取我们想要的信息。

如查看所有容器的 MAC 地址:

docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.MacAddress}} {{end}}' $(docker ps -aq)

在 Go 的模板语法中,{{.}} 表示当前上下文的值。例如,{{.Name}} 表示容器的名称,{{range .NetworkSettings.Networks}} 表示迭代 NetworkSettings.Networks 列表中的每个元素。其中 .MacAddress 表示当前上下文中的 Mac 地址值。这样,我们就可以使用这个语法来自定义 docker inspect 命令的输出,并使用 Go 的模板语法来格式化输出。

最后的 $(docker ps -aq) 是获取所有容器的 ID,此处作为参数使用,用以遍历所有容器的信息,或者可以使用 $(docker ps -q) 获取所有只在运行中的容器的 ID。

还可以查看每个容器对应的端口信息:

docker inspect --format='{{.Name}} - {{range $p, $conf := .NetworkSettings.Ports}}{{$p}} -> {{(index $conf 0).HostPort}} {{end}}' 
$(docker ps -aq)

这个就复杂多了,主要还是因为 docker 的详细信息 JSON 的数据结构的问题,要从中筛选出需要的信息。