Ashing's Blog

想学的太多 懂得的太少

0%

Docker命令总结

之前看 Docker 手册时顺手记的一些笔记比较杂乱,这里总结日常使用常用的命令

Docker常用命令

Docker 基础命令

搜拉列查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 搜索镜像
$ docker search xxx
# 拉取镜像,默认官方仓库
$ docker pull [registry url [:port]/] 仓库名[:标签]
# 列出所有docker运行的container,q指容器ID
$ docker pa -a[q]

# 检查 容器的数据卷具体信息
$ docker inspect
# 查看 镜像/容器/卷 所占用的空间
$ docker system df
# 查看 资源占用状态
$ docker stats
# 查看 访问记录
$ docker logs
# 查看 镜像构建过程
$ docker history

由镜像实例化创建容器(操作对象是image)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 由镜像实例化创建容器(操作对象是iamge)
$ docker run -d -i -t --rm --name [contianer name]
-e [env list]
-p [local port : container port]
-v [local dir : container dir]
[IMAGE][COMMAND][ARG]

# 例子: -dit, 防止自停; --rm, 容器退出后随之删除以节省空间; -v, $PWN为当前目录 ; -e, 指定环境变量
$ docker run -d --rm --name mysql_database -e MYSQL_USER=dxx -e MYSQL_PASSWORD=123456 -e MYSQL_DATABASE=awesome -p 3307:3306
-v $PWD/www:/opt/app-root/src/www # WEBSRC目录
-v $PWD/data:/var/lib/mysql # 数据库内容持久化
-v $PWN/conf:/etc/mysql/conf.d # 配置文件

# 例子:
docker run -dit --name ruoyi -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v $PWD/conf/my.cnf:/etc/mysql/my.cnf -v $PWD/data:/var/lib/mysql -v $PWD/log:/var/log/mysql mysql:5.7

# 重启已停止的容器
$ docker resart ID

# 数据卷容器,数据同步
$ docker ... container2 --volumn-from container1(父数数据卷) ...
  • 常见问题:docker后台运行容器必须有前台进程,否则会自动停止
  • 解决方法:
1
2
3
4
5
6
# 1.指定挂起阻塞命令启动容器
$ docker run -d --name my-redis redis sleep 99999999999999
# 2.使用交互界面后退出容器
$ docker run -it --name my-redis redis bash
# 3.-td命令结合使用(-i 不是必需,加了容器起来后终端返回容器ID)
docker run -itd --name my-redis2 redis bash

1
2
3
4
5
6
7
8
9
# exec 进入容器, 并使用bash交互
$ docker exec -it [name/ID] bash
$ docker exec -it [name/ID] /bin/bash

# attach
$ docker attach 容器ID|容器name

# SSH
# nsenter

1
2
# 停止所有容器
$ docker stop $(docker ps -aq)

1
2
3
4
# 拷贝物理机文件至容器某路径
$ docker cp xxx.txt [container ID:/dir] [local dir path]
# 拷贝物理机路径下所有文件至容器某路径
$ docker cp [container ID:/dir] [local dir path]

1
2
3
4
5
# 查看容器映射
$ docker port [container ID]

# 查看镜像改动
$ docker diff [image]

保存

1
2
# 给原来镜像新添加一层,形成新镜像,自己定制的黑箱镜像。慎用!
$ docker commit [选项] <容器ID> [容器名字]

导出入

1
2
3
4
5
# 导出
$ docker export ID > xxx.tar
# 导入, 区别:容器快照将丢弃所所有的历史记录和元数据可以重新指定标签元素)
$ docker import ULR/FILE
$ docker load url/FILE

Docker image

  • 列出镜像
1
2
3
4
5
6
7
8
9
docker images
docker image ls [镜像名] #列出部分镜像
docker image ls -a #列出中间层镜像
docker image ls -q #列出镜像的ID
docker iamge ls --digests #列出镜像摘要

docker image ls -f dangling=true #列出悬虚镜像
docker image ls -f since/before=mongo:3.2 #列出被过滤镜像,如before mingo:3.2前的镜像
docker image ls --format "{{.ID}}:{{.Repository}}" #指定格式列出
  • 删除镜像
1
2
3
docker image rm [选项] <镜像1> [<镜像2> ...]
docker image prune #删除悬虚镜像
docker image rm $(docker image ls -q -f before=mongo:3.2)) #配合ls过滤删除
  • 定制镜像
1
2
3
4
docker exec -it ubuntu:18.04 /bin/bash					#进入镜像,用bash交互,完成定制镜像需求
docker diff nginx #查看镜像改动
docker commit [选项] <容器ID> [容器名字] #将容器的存储层保存下来成为镜像,慎用!黑箱镜像(处理制作人别人不知道执行过什么命令),会导致镜像臃肿!
docker commit -a "作者" -m "备注" 容器IdD <image-name>:<tag>

Docker contianer

  • 运行/终止容器
1
2
3
4
5
6
docker container start				#启动容器
docker container restart #重启容器
docker container stop #终止容器,只启动终端的容器,exit或ctrl+d退出时,容器立刻停止

docker container logs #获取容器输出信息
docker container ls -a #列出所有容器
  • 进入容器
1
2
docker attach ID/名 bash				#从stdin中exit会导致容器停止
docker exec -it ID/名 bash #从stdin中exit不会导致容器停止
  • 删除容器
1
2
3
4
docker container rm xxx				 #删除停止的容器
docker contaienr prune #清理所有停止容器

docker container rm -f xxx #删除运行的容器
  • 导入/出容器
1
2
docker export ID > xxx.tar		
docker import URL/文件

Docker-compose

docker-compose.yaml配置文件

1
2
ports:
- 433:5000 # 将主机433端口映射到容器5000端口
1
docker-compose up -d

Docker Clear

  • 查看空间占用细节
1
2
3
4
5
6
$ docker system df -v


已使用镜像(used image): 指所有已被容器(包括已停止的)关联的镜像。即 docker ps -a 看到的所有容器使用的镜像。
未引用镜像(unreferenced image):没有被分配或使用在容器中的镜像,但它有 Tag 信息。
悬空镜像(dangling image):未配置任何 Tag (也就无法被引用)的镜像,所以悬空。这通常是由于镜像 build 的时候没有指定 -t 参数配置 Tag 导致的。
  • 自动清理空间
1
2
3
4
5
6
7
8
9
10
11
$ docker system prune

该指令默认会清除所有如下资源:
已停止的容器(container)
未被任何容器所使用的卷(volume)
未被任何容器所关联的网络(network)
所有悬空镜像(image)。
该指令默认只会清除悬空镜像,未被使用的镜像不会被删除。
添加 -a 或 --all 参数后,可以一并清除所有未使用的镜像和悬空镜像。
可以添加 -f 或 --force 参数用以忽略相关告警确认信息。
指令结尾处会显示总计清理释放的空间大小。
  • 手工镜像清理
1
2
3
4
5
6
# 删除所有悬空镜像,但不会删除未使用镜像:
docker rmi $(docker images -f "dangling=true" -q)

# 删除所有未使用镜像和悬空镜像。
# 【说明】:轮询到还在被使用的镜像时,会有类似"image is being used by xxx container"的告警信息,所以相关镜像不会被删除,忽略即可。
docker rmi $(docker images-q)
  • 手工卷清理
1
2
3
4
5
6
# 删除所有未被任何容器关联引用的卷:
docker volume rm $(docker volume ls -qf dangling=true)

# 也可以直接使用如下指令,删除所有未被任何容器关联引用的卷(但建议使用上面的方式)
# 【说明】轮询到还在使用的卷时,会有类似"volume is in use"的告警信息,所以相关卷不会被删除,忽略即可。
docker volume rm $(docker volume ls -q)
  • 手工容器清理
1
2
3
4
# 删除所有已退出的容器
docker rm -v $(docker ps -aq -f status=exited)
# 删除所有状态为 dead 的容器
docker rm -v $(docker ps -aq -f status=dead)
  • 删除build失败的image
1
$ docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi

Docker Hub

  • 制作
1
2
3
4
5
6
7
8
# 当前目录的 Dockerfile 创建镜像
$ docker build -t <image-name>:<tag>
# 指定文件构建镜像,默认寻找当前目录的 Dockerfile 文件
$ docker build -f /path/to/a/Dockerfile -t <image-name>:<tag> .
# 将镜像保存 tar 包
$ docker save -o image-name.tar <image-name>:<tag>
# 导入 tar 镜像
$ docker load --input image-name.tar
  • 上传
1
2
3
4
# 登录 Docker Hub
$ docker login
# 上传推送镜像到公共仓库
$ docker push <hub-user>/<repo-name>:<tag>