Docker命令大全

配置docker登陆时命令非明文

环境变量的登录方式(通过/etc/profile设置PASSWORD变量),以下示例从变量读取密码,然后使用STDIN将其传递给docker login命令:

1
echo "$PASSWORD" | docker login --username <xxx> --password-stdin ${REGISTRY_ADDRESS}

Docker命令记录(长期)

ctr为镜像打tag

1
ctr images tag oldimage:v1 newimage:v2

docker为镜像打tag

1
docker tag oldimage:v1 newimage:v2

从容器里面拷文件到宿主机

1
docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径

从宿主机拷文件到docker容器里面

1
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径

docker内部安装工具/插件/软件

1
2
3
4
5
6
需要知道docker是一个最小体积的"vm",所以里面几乎什么都没有,如果想用些第三方的软件,需要自行安装.如下:

要知道使用的基础是镜像是什么版本(一般是不会ls的,所以如果直接执行yum/apt不行的话,切/usr/bin再执行)
centos: yum
ubuntu: apt-get
alpine: apk

配置docker登陆时命令非明文

环境变量的登录方式(通过/etc/profile设置PASSWORD变量),以下示例从变量读取密码,然后使用STDIN将其传递给docker login命令:

1
echo "$PASSWORD" | docker login --username <xxx> --password-stdin ${REGISTRY_ADDRESS}

删除无用镜像和容器

1
2
3
4
5
6
7
8
9
10
11
12
# 先查看空间占用情况
docker system df
# 删除异常停止的docker容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'`
# 删除名称或标签为none的镜像
docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`
# allows you to clean up unused images. By default, docker image prune only cleans up dangling images. A dangling image is one that is not tagged and is not referenced by any container.
docker image prune
# To remove all images which are not used by existing containers, use the -a flag:
docker image prune -a
# 删除stopped container,unused network,没有本地关联的image,所有构建时的缓存
docker system prune -a

containerd删除无用镜像

1
2
3
crictl images|grep 'none'|awk '{print $3}'|xargs crictl rmi
或者
crictl rmi --prune

docker crontab删除容器内部文件

1
2
3
# 每五个小时运行一次, 删除/tmp目录上早于5个小时的/tmp文件
RUN echo 'find /tmp -type f -mmin -300 -exec rm -f {} ;' > /opt/script/tmp-cleanup.sh \
&& crontab -l | { cat; echo "0 */5 * * * /bin/bash /opt/script/tmp-cleanup.sh"; } | crontab -

docker save 用来将一个或多个image打包保存。

如:将本地镜像库中的image1和image2打包到images.tar中

1
docker save -o images.tar image1:v1 image2:v1

docker save 也可以打包container,保存的是容器背后的image.

docker load用于将打包的tar中包含的镜像load到本地镜像库,但不能重命名其中的镜像名。

1
docker load -i images.tar

docker export 打包container文件系统

1
docker export -o the_container.tar container_name

使用 docker import 载入,可以为新镜像指定name和tag

1
docker import the_container.tar new_image_name:tag

总结一下

1
2
3
4
5
docker save保存的是镜像(image),docker export保存的是容器(container);
docker load用来载入镜像包,必须是一个分层文件系统,必须是是save的包;
docker import用来载入容器包,但两者都会恢复为镜像;
docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。
docker export的包会比save的包要小,原因是save的是一个分层的文件系统,export导出的只是一个linux系统的文件目录

查找那个容器输出日志占用最大

1
2
3
4
5
# docker
for name in $(docker ps -a | awk '{print $1}' | grep -v CONTAINER); do docker inspect $name | grep LogPath | awk '{print $NF}' | tr -d '",' |xargs du -sh;done

# crict
for name in $(crictl ps -a | awk '{print $1}' | grep -v CONTAINER); do crictl inspect $name | grep logPath | awk '{print $NF}' | tr -d '",' |xargs du -sh;done

利用docker ps -a --format命令

获取镜像,ID,端口号,状态

1
docker ps -a --format "table {{.Image}}\t{{.ID}}\t{{.Ports}}\t{{.Status}}" 

列出正在运行的容器

1
docker ps -a -f  "status=running"

列出退出的容器

1
docker ps -a -f  "status=exited"

查看容器磁盘信息

1
docker ps -a --format "table {{.Size}}\t{{.Names}}"

获取容器的IP

1
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q)

获取容器的mac地址

1
docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $(docker ps -a -q)

获取容器name

1
2
docker inspect --format='{{.Name}}' $(docker ps -aq)
docker inspect --format='{{.Name}}' $(docker ps -aq)|cut -d"/" -f2

获取容器的Hostname

1
docker inspect --format '{{ .Config.Hostname }}' $(docker ps -q)

获取hostname,ip

1
docker inspect --format 'Hostname:{{ .Config.Hostname }}  Name:{{.Name}} IP:{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q)

获取容器的log path

1
docker inspect --format='{{.LogPath}}' `docker ps -a -q`

获取容器的镜像

1
docker inspect --format='{{.Config.Image}}' `docker ps -a -q`

验证overlayfs文件系统挂载(可通过overlayfs/snapshots/{id}来查找对应服务)

1
mount |grep overlayfs|grep {id}