操作Container

启动容器并启动bash(交互方式)

1
docker run -i -t <image_name/continar_id> /bin/bash

启动容器以后台方式运行(更通用的方式)

这里的 image_name 包含了tag,例如hello.demo.kdemo:v1.0

1
docker run -d -it  image_name

附着到正在运行的容器

1
docker attach <id、container_name>

进入正在运行的容器内部,同时运行bash(比attach更好用)

这里的bash也可以换成具体的命令,例如ping 127.0.0.1

1
docker exec -t -i <id/container_name> /bin/bash

docker exec是如此的有用,以至于我们通常是将其封装为一个脚本,放到全局可调用的地方,比如,可以写成一个indocker.sh

1
2
3
4
5
6
7
8
$ cat indocker.sh
docker exec -t -i $1 /bin/bash
# 查看需要附着的容器id
$ docker ps | less -S
CONTAINER ID IMAGE
9cf7b563f689 hello.demo.kdemo:v160525.202747

$ ./indocker.sh 9cf7b563f689

查看容器日志

1
docker logs <id/container_name>

实时查看日志输出

1
2
docker logs -f <id/container_name> 
# 类似 tail -f [-t]带上时间戳

列出当前所有正在运行的container

1
docker ps

用一行列出所有正在运行的container

容器多的时候非常清晰

1
docker ps | less -S

列出所有的container

1
docker ps -a

列出最近一次启动的container

1
docker ps -l

显示一个运行的容器里面的进程信息

1
docker top <id/container_name>

查看容器内部详情细节

1
docker inspect <id/container_name>

在容器中安装新的程序

1
docker run <id/container_name> apt-get install -y app_name

从容器里面拷贝文件/目录到本地一个路径

1
docker cp <id/container_name>:/container_path to_path

保存对容器的修改(commit)

当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器

1
docker commit <id/container_name> new_image_name

删除单个容器

1
docker rm <id/container_name>

删除所有容器

1
2
3
4
5
docker rm `docker ps -a -q`
# 停止所有的容器
docker stop $(docker ps -aq)
# 删除所有的容器
docker rm $(docker ps -aq)

停止、启动、杀死、重启一个容器

1
2
3
4
docker stop <id/container_name>
docker start <id/container_name>
docker kill <id/container_name>
docker restart <id/container_name>

操作Image

列出镜像

1
docker image ls

从dockerhub检索image

1
docker search <image_name>

下载image

1
docker pull <image_name>

删除一个或者多个镜像

1
docker rmi <image_name>

显示一个镜像的历史

1
docker history <image_name>

发布docker镜像

1
docker push <new_image_name>

要发布到私有Registry中的镜像,在镜像命名中需要带上Registry的域名(如果非80端口,同时需要带上端口号)

1
docker push dockerhub.yourdomain.com:443/hello.demo.kdemo:v1.0

拉取docker镜像

1
docker pull <image_name>

网络操作

查看docker0的网络(宿主机上操作)

1
ip a show docker0

查看容器的IP地址

1
docker inspect -f '{{ .NetworkSettings.IPAddress }}' <id/container_name>

或者附着到容器内部查看其内部ip

1
docker exec -it <id/container_name> ip a show eth0

docker信息

查看docker版本

1
2
3
4
5
6
7
8
9
10
11
12
13
$ docker version
Client: Docker Engine - Community
Version: 20.10.6
API version: 1.41
Go version: go1.13.15
Git commit: 370c289
Built: Fri Apr 9 22:46:01 2021
OS/Arch: linux/amd64
Context: default
Experimental: true

Server: Docker Engine - Communit
# ...

查看docker系统的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
scan: Docker Scan (Docker Inc., v0.7.0)

Server:
Containers: 83
Running: 61
Paused: 0
Stopped: 22
# ...

高级技巧

docker 批量删除无用的容器或镜像

1
2
3
4
# 删除异常停止的docker容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'`
# 删除名称或标签为none的镜像
docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`

清理所有停止运行的容器

1
2
3
docker container prune 
# 或者
docker rm $(docker ps -aq)

清理所有悬挂()镜像

1
2
3
docker image prune
# 或者
docker rmi $(docker images -qf "dangling=true")

清理所有无用数据卷

1
docker volume prune

清理所有无用镜像

清理后再次使用需要重新下载

1
docker image prune -a

按需批量清理容器

1
docker ps -a --filter 'exited=0'

目前支持的过滤器(–filter)有

  • id (container’s id)
  • label (label= or label==)
  • name (container’s name)
  • exited (int - the code of exited containers. Only useful with –all)
  • status (created|restarting|running|removing|paused|exited|dead)
  • ancestor ([:], or <image@digest>) - filters containers that were created from the given image or a descendant.
  • before (container’s id or name) - filters containers created before given id or name
  • since (container’s id or name) - filters containers created since given id or name
  • isolation (default|process|hyperv) (Windows daemon only)
  • volume (volume name or mount point) - filters containers that mount volumes.
  • network (network id or name) - filters containers connected to the provided network
  • health (starting|healthy|unhealthy|none) - filters containers based on healthcheck status

按需批量清理镜像

1
2
3
4
5
6
 # 列出所有悬挂(dangling)的镜像,也就是显示为<none>的那些
docker images --filter "dangling=true"
# 清理所有悬挂(dangling)的镜像,也就是显示为<none>的那些
docker rmi $(docker images -qf "dangling=true")
# 清理,同上
docker image prune --filter 'exited=0'

目前支持的过滤器(–filter)有

  • dangling (boolean - true or false)
  • label (label= or label==)
  • before ([:], or <image@digest>) - filter images created before given id or references
  • since ([:], or <image@digest>) - filter images created since given id or references
  • reference (pattern of an image reference) - filter images whose reference matches the specified pattern

查看docker日志

1
docker logs -f `docker ps | grep qq- | awk '{print $1}'`