Docker 笔记(3) image/container/volume 基本命令

文章目录

0. 前言

  • 本文内容主要包括
    • image(镜像)相关概念以及基本操作
    • container(容器)相关概念以及基本操作
  • 容器(Container)与镜像(Image)的基本概念
    • Image 是由若干只读(read-only)的layer组成的
    • 每个 Container 的本质就是在一系列 Image 的基础上添加一个读写层
    • 一个正在运行的 Contrainer 包含镜像、读写层、隔离的进程空间以及对应的进程
  • 下图对比了容器与镜像,出自这里

Docker 笔记(3) image/container/volume 基本命令

1. Image 相关命令

  • 参考资料:
  • 相关基本概念
    • Image 的唯一标识是 Image ID。
    • 每个镜像可以对应多个TAG。
    • 镜像如果没有TAG,很可能标识该镜像没有什么用了。
  • 命令分类
    • 仓库相关命令:search/pull/push
    • 本地镜像管理命令:ls/rm/prune/build

1.1 与镜像仓库相关命令

  • 搜索镜像:docker search
    • 在 docker hub 搜索别人已经上传了的镜像。
    • 命令形式:docker search [OPTIONS] TERM
    • 主要参数(Docs
      • --no-trunc:显示镜像的完整描述
      • -f:可以指定一些条件,过滤搜索结果,比如 starts,详情参考Docs
      • --limit:限制显示数量,默认25
      • --format:格式化输出
    • 返回结果:主要包括 NAME/DESCRIPTION/STARS/OFFICIAL/AUTOMATED 五个字段,分别表示镜像仓库名称、镜像描述、start数量、是否是docker官方出品、是否是自动构建。
      • 其实我不太懂“自动构建镜像”是什么,看了文档也没看懂
    • 举例如下
runoob@runoob:~$ docker search -f stars=10 java
NAME                  DESCRIPTION                           STARS   OFFICIAL   AUTOMATED
java                  Java is a concurrent, class-based...   1037    [OK]       
anapsix/alpine-java   Oracle Java 8 (and 7) with GLIBC ...   115                [OK]
develar/java                                                 46                 [OK]
isuper/java-oracle    This repository contains all java...   38                 [OK]
lwieske/java-8        Oracle Java 8 Container - Full + ...   27                 [OK]
nimmis/java-centos    This is docker images of CentOS 7...   13                 [OK]
  • 下载镜像:docker pull / docker image pull
    • 从 docker hub 或其他仓库下载镜像
    • 命令形式:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
      • 注意,所谓TAG就是对应的版本。如果不指定,那就下载最新版本。
    • 主要参数:
      • -a:获取所有镜像
    • 举例如下
$ docker pull debian:jessie

jessie: Pulling from library/debian
fdd5d7827f33: Already exists
a3ed95caeb02: Already exists
Digest: sha256:a9c958be96d7d40df920e7041608f2f017af81800ca5ad23e327bc402626b58e
Status: Downloaded newer image for debian:jessie
  • 上传镜像:docker push / docker image push
    • 将本地镜像上传到仓库(需要先登录)
    • 主要参数:
      • --all-tags:将所有tag都上传
    • 形式:docker push [OPTIONS] NAME[:TAG]
    • 举例
$ docker image push --all-tags registry-host:5000/myname/myimage

The push refers to repository [registry-host:5000/myname/myimage]
195be5f8be1d: Pushed
latest: digest: sha256:edafc0a0fb057813850d1ba44014914ca02d671ae247107ca70c94db686e7de6 size: 4527
195be5f8be1d: Layer already exists
v1: digest: sha256:edafc0a0fb057813850d1ba44014914ca02d671ae247107ca70c94db686e7de6 size: 4527
195be5f8be1d: Layer already exists
v1.0: digest: sha256:edafc0a0fb057813850d1ba44014914ca02d671ae247107ca70c94db686e7de6 size: 4527
195be5f8be1d: Layer already exists
v1.0.1: digest: sha256:edafc0a0fb057813850d1ba44014914ca02d671ae247107ca70c94db686e7de6 size: 4527

1.2 本地镜像管理

  • 查看本地镜像:docker images / docker image ls
    • 形式:docker images [OPTIONS] [REPOSITORY[:TAG]]
      • 可以不指定 REPOSITORY,这样就是显示本地所有
      • 也可以通过镜像名称来查看
    • 参数与 search 类似
      • -a, --all:限制显示数量,默认25
      • --no-trunc:显示镜像的完整描述
      • -f:可以指定一些条件,过滤搜索结果,比如 starts,详情参考Docs
      • --format:格式化输出
      • --quiet , -q:只显示ID不显示其他信息
    • 结果包括 REPOSIROTY/TAG/IMAGE ID/CREATED/SIZE 五个字段,都是顾名思义。
    • 举例如下:
runoob@runoob:~$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
mymysql                 v1                  37af1236adef        5 minutes ago       329 MB
runoob/ubuntu           v4                  1c06aa18edee        2 days ago          142.1 MB
<none>                  <none>              5c6e1090e771        2 days ago          165.9 MB
httpd                   latest              ed38aaffef30        11 days ago         195.1 MB
alpine                  latest              4e38e38c8ce0        2 weeks ago         4.799 MB
mongo                   3.2                 282fd552add6        3 weeks ago         336.1 MB
redis                   latest              4465e4bcad80        3 weeks ago         185.7 MB
...

root@runoob:~# docker images  ubuntu
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               90d5884b1ee0        9 weeks ago         188 MB
ubuntu              15.10               4e3b13c8a266        3 months ago        136.3 MB
  • 删除镜像:docker rmi / docker image rm

    • 命令形式:docker rmi [OPTIONS] IMAGE [IMAGE...]

      • 所谓的 IMAGE 可以是 IMAGE ID,也可以是名称。如果要删除多个镜像,其实就是用多个IMAGE。
      • 从文档中可知,IMAGE 名称可以是带 TAG的。
      • 如果指定的是名称以及TAG,且统一名称有多个TAG,则本操作只是删除了TAG,而没有删除镜像本身。如果只有一个TAG,那就会删除镜像本身。
      • 但文档中没说如果不带TAG直接删除会怎么样,需要自己试一下。
    • 常用参数:

      • -f, --force:强制删除。默认不能删除正在运行容器对应的镜像,如果要删除必须添加本选项。
      • --no-prune:不删除过程镜像。
    • 举例

docker rmi fd484f19954f

docker rmi test:latest
  • 删除多余镜像:docker image prune
    • 重点要介绍两个概念:untagged image 和 dangling images,具体参考这里
      • untagged images:没有被容器使用。就是 docker images 中 tag 为 <none> 的那些
      • dangling images:即虚悬镜像。不是特别理解,大概意思就是镜像有新版本了,那用不到的旧版本就是虚悬镜像。docker images 命令中name为<none>的那些
      • 感觉 dangling images 是 untagged images 的子集。
    • 命令形式:docker image prune [OPTIONS]
    • 常用选项:
      • -a, --all:如果指定,则删除所有 untagged images;如果没有指定,就删除 dangling images。
      • -f, --force:不用确认(不太懂什么场景)
      • --filter:过滤
    • 命令举例
docker image prune -a
  • 通过 Dockerfile 构建镜像:docker build / docker image build
    • 命令形式:docker build [OPTIONS] PATH | URL | -
      • Dockerfile可以通过本地路径或URL进行指定
    • 具体使用还是等学习 Dockerfile 的时候再说吧
  • 其他命令
    • docker save / docker image save:将镜像保存为tar文件
    • docker load / docker image load:导入本地tar文件
    • docker import / docker image import:从归档文件中创建镜像
    • docker tag / docker image tag:标记本地镜像,将其归入某一仓库
    • docker history / docker image history:查看镜像的创建历史
    • docker image inspect

2. Contrainer 相关命令

  • 镜像可以理解为只读文件,容器相对的就是镜像+读写层+计算机资源
  • 命令分类
    • 容器基本操作:ps/top/inspect/port
    • 容器声明周期相关操作:run/exec/start/stop/restart/rm/pause/unpause/kill

2.1 容器基本操作

  • 查看容器:docker ps
    • 命令形式 docker ps [OPTIONS]
    • 常用参数:
      • -a, --all:显示所有容器(包括没有运行的)。如果没有指定该参数(即默认情况)则输出运行中的容器。
      • -n:显示最新创建的若干容器
      • -q:只显示容器id
      • --no-trunc:显示详细信息
      • -l:显示最新创建的容器
      • -s:展示文件大小
      • -f, --filter:过滤结果
      • --format:定义结果展示形式
    • 结果:主要包括 CONTAINER ID/IMAGE/COMMAND/CREATED/STATUS/PORTS/NAME,分别表示容器编号、使用的镜像、启动容器时使用的命令、容器创建时间、状态(包括 created/restarting/running/removing/paused/exited/dead)、端口编号以及使用的连接方式(即TPC/UDP)、自动分配的容器名称
    • 举例如下
$ docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
9833437217a5        busybox             "top"               5 seconds ago       Up 4 seconds        8080/tcp                dreamy_mccarthy
fc7e477723b7        busybox             "top"               50 seconds ago      Up 50 seconds       0.0.0.0:32768->80/tcp   admiring_roentgen
  • 查看容器中运行的进程信息:docker top
    • 命令形式:docker top CONTAINER [ps OPTIONS]
    • 参数与前面的 docker ps 完全相同
    • 结果与普通的 TOP 命令相同
    • 使用举例
runoob@runoob:~/mysql$ docker top mymysql
UID    PID    PPID    C      STIME   TTY  TIME       CMD
999    40347  40331   18     00:58   ?    00:00:02   mysqld
  • 查看容器或镜像的元数据:docker inspect
    • 命令形式:docker inspect [OPTIONS] NAME|ID [NAME|ID...]
    • 可选参数:
      • -f, --format:结果展示形式
      • -s, --size:展示容器所占空间(进容器有效)
      • --type:为指定类型返回JSON(不太懂什么意思)
    • 结果我看不懂。。
  • 查看容器端口映射:docker port
    • 命令形式:docker port CONTAINER [PRIVATE_PORT[/PROTO]]
      • 可指定容器内的端口号以及协议
    • 使用举例
$ docker port test

7890/tcp -> 0.0.0.0:4321
9876/tcp -> 0.0.0.0:1234

$ docker port test 7890/tcp

0.0.0.0:4321
  • 其他命令:
    • docker attatch:
    • docker events:从服务器获取实时事件
    • docker logs:获取容器的日志
    • docker wait:阻塞运行直到容器停止,然后打印出它的退出代码
    • docker export:将文件系统作为一个tar归档文件导出到STDOUT

2.2 容器声明周期管理

  • 启动/停止/重启容器:docker start/stop/restart
    • 命令形式:
      • docker start [OPTIONS] CONTAINER [CONTAINER...]
      • docker stop [OPTIONS] CONTAINER [CONTAINER...]
      • docker restart [OPTIONS] CONTAINER [CONTAINER...]
  • 在运行的容器中执行命令(操作对象是容器):docker exec
    • 命令形式:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    • 常用选项:
      • -i:交互模式,一般与 -t一起使用,即-it,可以在容器内打开一个终端使用。
      • -t:没看懂注解,有个帖子
      • -d:detach 模式,即在后台运行命令
    • 使用举例如下
$ docker exec -it ubuntu_bash pwd
/
  • 创建容器(但不启动):docker create
  • 暂停/恢复容器中的进程:docker pause/unpause
    • 命令形式:
      • docker pause CONTAINER [CONTAINER...]
      • docker unpause CONTAINER [CONTAINER...]
  • 删除容器:docker rm
    • 命令形式:docker rm [OPTIONS] CONTAINER [CONTAINER...]
    • 常用选项:
      • -f:通过SIGKILL 信号强制删除运行中的容器
      • -l:移除网络连接,而不是容器本身
      • -v:删除与容器关联的卷
  • 结束运行中的进程:docker kill
    • 命令形式:docker kill [OPTIONS] CONTAINER [CONTAINER...]
    • 选项:-s,向容器发送一个信号(我也不知道啥意思)
    • 使用举例如下
docker kill my_container
  • 创建一个新的容器并运行(操作对象是镜像):docker run
    • 命令形式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    • 常用选项
      • -d:后台运行容器,并返回容器ID
      • -i:以交互模式运行,一般与 -t 一起使用
      • -t:类似于 docker exec 命令,我也不太懂,反正一遍就是和 -i 一起使用
      • -p:指定端口映射,格式为 主机(宿主)端口:容器端口
      • -P:将容器所有端口随机映射到主机
      • --name:为容器指定名称
      • --rm:退出容器时自动删除该容器
      • -v:绑定一个卷
    • 使用举例
# 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx
docker run --name mynginx -d nginx:latest

# 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data
docker run -p 80:80 -v /data:/data -d nginx:latest

# 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令
docker run -it nginx:latest /bin/bash
上一篇:2021-03-24


下一篇:Centos7下GlusterFS分布式存储集群环境部署记录