Docker常用命令

docker从入门到实践参考文档

https://docker-practice.github.io/zh-cn/

dockr练习网站

https://labs.play-with-docker.com/

查看docker版本

docker version
或
docker -v

查看docker详细信息

# 包括镜像和容器数
docker info

镜像相关

从镜像仓库中拉取或者更新指定镜像

docker pull NAME[:TAG]
-a :拉取所有 tagged 镜像
例:
docker pull nginx:1.22
如不指定TAG则默认最新镜像

搜索docker镜像

# all所有镜像,可指定镜像
docker search all 

选项

  • -f:过滤条件,列出收藏数不小于指定值的镜像(默认收藏数从高到低)。
  • --no-trunc:显示完整的镜像描述;
  • --limit int:最大搜索结果数(默认值为25)
# 从Docker Hub查找所有镜像名包含 java,并且收藏数大于10的镜像,只显示前5条
docker search -f stars=10 --limit 5 --no-trunc java

输出详情:

  • NAME: 镜像仓库源的名称
  • DESCRIPTION: 镜像描述(使用--no-trunc选项后显示完整,不使用默认过长的描述会截断末尾显示...)
  • OFFICIAL: 是否 docker 官方发布
  • STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。
  • AUTOMATED: 自动构建。

列出本地镜像列表

# 列出本地所有镜像 //docker image ls 的缩写
docker images
# 指定镜像名
docker images [镜像名]

输出详情:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签,同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

给镜像打标签

# 镜像ID如:860c279d2fec,用户名可以省略,直接使用自定义镜像名:标签名
docker tag 镜像ID 用户名/镜像名:标签名
# 一个镜像可以打多个标签,共用一个镜像ID
docker tag 镜像名:标签 新镜像名:新标签

删除镜像

# 从本地删除一个已经下载的镜像,需先删除对应容器
docker rmi 镜像名:标签  
-f:强制删除
--no-prune:不移除该镜像的过程镜像,默认移除

# 删除所有未被容器使用的镜像(有交互提示,按y确认)
docker image prune -a

# 删除所有none的镜像、删除所有停止的容器、删除所有未被容器使用的网络(有交互提示,按y确认)
docker system prune

备份、注入本地镜像

# 备份,备份名推荐 镜像名-版本号.tar
docker save -o 备份名.tar 镜像名:标签
# 注入
docker load -i 备份名.tar
docker load < 备份名.tar

# 示例
docker save -o ngins_test-v1.tar nginx_test:latest    # 备份
docker rmi nginx_test:latest                          # 删除源镜像
docker load -i ngins_test-v1.tar                      # 恢复

容器相关

创建一个容器并运行

# 语法
docker run 选项 镜像名:标签 命令参数(可选)
docker run -tid --name c1 centos:7

选项

  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
  • -i:以交互模式运行容器,通常与 -t 同时使用。
  • -d:后台运行容器,并返回容器ID。
  • --name:为容器指定一个名称;例:--name test-container
  • -p:指定端口映射,映射多个端口使用多个-p参数,格式为:主机(宿主)端口:容器端口;例:-p 5000:5000
  • -v:映射一个数据卷或本地目录到容器内(类似于挂载)。例:-v /本地目录:/tmp/data
  • -e:设置环境变量,设置多个环境变量使用多个-e参数;例:-e REDIS_HOST=redis
  • --network:将容器连接到指定网络;例:--network NetworkName
  • --restart:指定容器停止后的重启策略,参考下方设置容器开机自启。
  • --rm:容器退出时自动移除容器。
  • --workdir,-w:容器内的工作目录,如果路径不存在,则会在容器内创建该路径;例:-w /path/to/dir/
  • --hostname或-h:指定容器的hostname;例:-h flask
  • --memory或-m:设置容器使用内存最大值;例:-m 200M
  • --cpu-shares或-c:设置容器 CPU 权重,最小值为2(多容器共享CPU场景下,如A容器值设置为5,B容器设置为10,两个容器将CPU拉满,则B容器占比66%,A容器占比33%);例:-c 5
  • --cpus:设置cpu数量限制;例:--cpus=2
  • --net:指定容器的网络连接类型,支持 bridge/host/none/container 四种类型;例:--net="bridge"
  • --env-file=[]: 从指定文件读入环境变量;例:--env-file ./env.list
  • --link=[]:添加链接到另一个容器;例:--link test1,将创建的容器link到test1

只创建容器不运行

docker create
# 示例
docker create  --name mynginx  nginx:latest

进入容器

# 使用attach命令进入容器,如果使用exit命令或ctrl+d退出,容器会停止运行;使用exec命令进入再exit退出容器终端,容器不会停止。
docker attach 容器名|容器ID
or
docker exec -ti 容器ming|容器ID /bin/bash      

# 示例,使用容器名或ID均可,使用attach进入容器,可使用Ctrl+p+q,退出但不停止容器运行
docker attach test
docker exec -ti 5e542a78fd84 /bin/bash

启动容器

docker start 容器名
docker restart 容器名
# 启动所有容器
docker start `docker ps -qa`

停止容器

# kill强制干掉进程,stop优雅退出,可同时停止多个
docker kill 容器名|容器ID
docker stop 容器名|容器ID

# 停止所有容器
docker stop `docker ps -qa`

列出容器

docker ps

选项

  • -a:显示所有的容器,包括未运行的。
  • -s:显示总的文件大小。
  • -l:显示最近创建的容器。
  • -n:列出最近创建的n个容器。
  • -f:根据条件过滤显示的内容,其值格式为"key=value"对。如:docker ps -f "name=test"
  • --no-trunc:显示不截断输出。(容器ID会完整显示,默认只显示前12位)
  • -q :静默模式,只显示容器编号。(配合其它选项使用作为变量删除所有容器)

输出详情

  • CONTAINER ID:容器ID
  • IMAGE:使用的镜像
  • COMMAND:容器里面运行的命令
  • CREATED:创建时间
  • STATUS:容器的状态
  • PORTS:容器的端口映射
  • NAMES:容器的名字
    STATUS状态有7种:
    • created(已创建)
    • restarting(重启中)
    • running(运行中)
    • removing(迁移中)
    • paused(暂停)
    • exited(停止)
    • dead(死亡)

查看容器详情

# 语法,inspect命令的参数为容器则是查看容器详情,参数为数据卷名则是查看该数据卷详细信息,参数为网络名则是查看该网络详情。
docker inspect 容器名|容器ID
# 选项
--format,-f          # 使用给定的 Go 模板格式化输出
--size,-s            # 如果类型为容器,则显示总文件大小
--type               # 返回指定类型的 JSON

# 示例
# 获取容器的IP信息
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $INSTANCE_ID
# 获取实例的 MAC 地址
docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $INSTANCE_ID
# 获取实例的日志路径
docker inspect --format='{{.LogPath}}' $INSTANCE_ID
# 获取实例的镜像名称
docker inspect --format='{{.Config.Image}}' $INSTANCE_ID
# 列出容器所有端口映射
docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID

# 如果请求的字段本身就是包含其他结构的结构字段,就是JSON格式,就可以使用如下方式获取对应的值
# 获取Config部分的信息
docker inspect --format='{{json .Config}}' $INSTANCE_ID                      
# 获取Config信息里Hostname这个key的value,即主机名
docker inspect --format='{{json .Config.Hostname}}' $INSTANCE_ID             
# 获取NetworkSettings信息里IPAddress这个key的value,即获取IP
docker inspect --format='{{json .NetworkSettings.IPAddress}}' $INSTANCE_ID   

设置容器开机自启

# 在创建容器时
docker run -tid --restart always 镜像名 /bin/bash
# restart参数值
    no:容器不自动重启

    on-failure:容器退出状态不为0时自动重启

    on-failure:[n]:容器退出状态不为0时自动重启,最大尝试n次

    always:始终尝试自动重启

# 如果容器已经被创建,修改容器的重启策略
docker update --restart always 容器名|容器ID

从容器创建一个新的镜像

# 语法
docker commit 容器名|ID 镜像名:标签

# 选项
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。

# 示例,注:如使用-a、-m等选项,需将容器名和镜像名置于命令最后,置于选项前会报错。
docker commit 493cfc test-mysql:1.0
# 当使用同一个容器生成镜像,并且指定的镜像名:标签和先前提交过的镜像重复时,旧的镜像:标签都会变为<none>
docker commit -a "tandabao" -m "my nginx" -p 493cfc  test-mysql:1.0

删除容器

# 使用rm删除一个或这个容器,可使用容器名或容器ID。注:删除容器必须在容器处于关闭状态时
docker rm 容器ID1 容器ID2
# -f选项,强制删除,包括正在运行中的
docker rm -f 容器ID1

# 删除所有停止的容器(有交互提示,按y确认)
docker container prune

# 删除所有停止的容器,通过-f过滤出状态为停止的容器。实际上可以不使用-f过滤,运行状态的容器无法删除会报错,停止的容器会直接删除
docker rm $(docker ps -qa -f"status=exited")
# 删除清空所有容器,包括运行中的
docker kill `docker ps -qa` ; docker rm `docker ps -aq`

# 删除所有停止的容器、删除所有未被容器使用的网络、删除所有none的镜像(有交互提示,按y确认)
docker system prune

cp -- 容器与主机之间的数据拷贝

# 语法
docker cp [OPTIONS] 容器ID:src_path dest_path
docker cp [OPTIONS] dest_path 容器ID:src_path 
# 选项
-L :保持源目标中的链接,即符号链接,默认复制符号链接,加上-L选项复制源

# 示例,将本地目录文件拷贝至容器目标目录,源目录以/结尾则拷贝整个目录,以/.结尾则拷贝目录内的所有文件至目标目录,目标目录不存在则创建。
# 如果拷贝单文件,源文件和目标文件同名,源文件将覆盖目标文件
docker cp /www/. 96f7:/www/

# 将容器96f7的/www目录拷贝到主机的/tmp目录中,其余和上述一致。
docker cp 96f7:/www/ /tmp/

查看容器的日志

# 语法
docker logs [options] 容器ID|容器名称
# 选项
-t:加入时间戳
-f:跟随最新的日志打印(动态展示,类似于tail -f命令)
--tail N:显示最后多少条
--since:显示某个开始时间的所有日志

# 示例,查看容器mynginx从2022年7月1日后的日志
docker logs --since="2022-07-01" mynginx

# 查找容器日志位置
docker inspect --format='{{.LogPath}}' 容器ID

# 可以修改docker配置文件 daemon.json 限定log文件的大小,/etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

查看容器中运行的进程信息

docker top 容器IP|容器名称
posted @ 2023-03-10 22:43  待满茶杯  阅读(51)  评论(0编辑  收藏  举报