docker常用命令

帮助命令

docker version:版本信息

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.0
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        7287ab3
 Built:             Tue Dec  8 18:57:35 2020
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

docker info:详细信息(可以看到配置的镜像加速器)

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# 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.4.2-docker)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 2
 Server Version: 20.10.0
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs

。。。。。。。。。。

  Registry Mirrors:
   https://x3anyg4w.mirror.aliyuncs.com/

docker --help :帮助命令(很重要)

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker --help

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default "/root/.docker")
  -c, --context string     Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/root/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  app*        Docker App (Docker Inc., v0.9.1-beta3)
  builder     Manage builds
  buildx*     Build with BuildKit (Docker Inc., v0.4.2-docker)

。。。。。。

镜像命令

docker images(列出本地主机上的镜像)

# 各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
tomcat       latest    feba8d001e3f   11 days ago   649MB
centos       latest    300e315adb2f   3 weeks ago   209MB

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像,默认TAG为latest 。

选项说明:

-a :列出本地所有的镜像(含中间映像层)
-q :只显示镜像ID。
--digests :显示镜像的摘要信息
--no-trunc :显示完整的镜像信息

docker search  (在远程仓库查找某个镜像)

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker search tomcat
NAME                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
tomcat                        Apache Tomcat is an open source implementati…   2909      [OK]       
tomee                         Apache TomEE is an all-Apache Java EE certif…   85        [OK]       
dordoka/tomcat                Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base…   55                   [OK]
bitnami/tomcat                Bitnami Tomcat Docker Image                     37                   [OK]
kubeguide/tomcat-app          Tomcat image for Chapter 1                      29                   
consol/tomcat-7.0             Tomcat 7.0.57, 8080, "admin/admin"              17                   [OK]
cloudesire/tomcat             Tomcat server, 6/7/8                            15                   [OK]
aallam/tomcat-mysql           Debian, Oracle JDK, Tomcat & MySQL              13                   [OK]
arm32v7/tomcat                Apache Tomcat is an open source implementati…   10                   
maluuba/tomcat7-java8         Tomcat7 with java8.                             6                    

。。。。。。

选项说明:

--no-trunc : 显示完整的镜像描述

docker pull (拉取镜像)

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
tomcat       latest    feba8d001e3f   11 days ago   649MB
centos       latest    300e315adb2f   3 weeks ago   209MB
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
6ec7b7d162b2: Pull complete 
cb420a90068e: Pull complete 
2766c0bf2b07: Pull complete 
e05167b6a99d: Pull complete 
70ac9d795e79: Pull complete 
Digest: sha256:4cf620a5c81390ee209398ecc18e5fb9dd0f5155cd82adcbae532fec94006fb9
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
tomcat       latest    feba8d001e3f   11 days ago   649MB
nginx        latest    ae2feff98a0c   2 weeks ago   133MB
centos       latest    300e315adb2f   3 weeks ago   209MB

docker pull nginx 即 docker pull nginx:latest,如有指定标签需要写明。

在pull镜像时,由于镜像会基于其他的父镜像(镜像是一层套一层),所以需要一并下载依赖的其他镜像。

docker rmi(删除镜像)

  • 删除单个镜像
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker rmi hello-world 
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container 6403e01e2e57 is using its referenced image bf756fb1ae65

无法删除,出现这个问题的原因是删除的这个images被容器依赖,通过docker ps -a查询容器(-a :列出当前所有正在运行的容器+历史上运行过的):

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED        STATUS                    PORTS     NAMES
6403e01e2e57   hello-world   "/hello"   19 hours ago   Exited (0) 19 hours ago             vigorous_mcnulty

这时有两种方式:

1、先删除这个容器,再删除镜像

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker rm 6403e01e2e57
6403e01e2e57
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker rmi hello-world 
Untagged: hello-world:latest
Untagged: hello-world@sha256:1a523af650137b8accdaed439c17d684df61ee4d74feac151b5b337bd29e7eec
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc973ba3b1686355f221c38a36978ac63

2、-f 强制删除

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker rmi -f hello-world 
  • 删除多个镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG 
  • 删除所有镜像
docker rmi -f $(docker images -qa)

#docker images -qa  # 查询过往的和全部的镜像ID

容器命令(一)

docker run(新建并启动容器)

选项说明:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

--name="容器新名字": 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式
      ip:hostPort:containerPort
      ip::containerPort
      hostPort:containerPort
      containerPort

交互式容器

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
tomcat       latest    feba8d001e3f   2 weeks ago   649MB
centos       latest    300e315adb2f   4 weeks ago   209MB
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker run -it centos 
[root@a71c63f25d64 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 03:19 pts/0    00:00:00 /bin/bash
root        15     1  0 03:19 pts/0    00:00:00 ps -ef

docker run -it centos:

使用镜像centos:latest以交互模式启动一个容器,并进入容器。

提示符root@a71c63f25d64的变化,说明已进入容器,进入容器后,可以用其他linux命令(比如ps、ls等等)正常操作这个centos容器。

为什么docker run -it centos会进入容器,因为docker run -it centos缺省了后面的默认shell种类,即/bin/bash(其他还有csh、sh等),就是说如果不写就默认为/bin/bash。

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker run -it centos ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                        PORTS     NAMES
c80bf3e520cc   centos    "ls"          7 seconds ago    Exited (0) 6 seconds ago                beautiful_shaw
0c6bffe45002   centos    "ls"          20 minutes ago   Exited (0) 20 minutes ago               magical_dubinsky
a71c63f25d64   centos    "/bin/bash"   26 minutes ago   Exited (127) 21 minutes ago             xenodochial_morse

加上COMMAND参数ls后,并没有进入容器,而是直接把运行结果(ls)返回,并马上退出了容器。

指定容器名称

docker run -it --name mycentos0922 centos:

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
b86226808d2b   centos    "/bin/bash"   About a minute ago   Up About a minute             mycentos0922

docker ps(查看容器)

选项说明

docker ps [OPTIONS]

OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
--no-trunc :不截断输出
#当前运行
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
b86226808d2b   centos    "/bin/bash"   About a minute ago   Up About a minute             mycentos0922
#上一个
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps -l
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
b86226808d2b   centos    "/bin/bash"   19 minutes ago   Up 19 minutes             mycentos0922
#上3个
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps -n 3
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                   PORTS     NAMES
b86226808d2b   centos    "/bin/bash"   19 minutes ago   Up 19 minutes                      mycentos0922
c80bf3e520cc   centos    "ls"          3 hours ago      Exited (0) 3 hours ago             beautiful_shaw
0c6bffe45002   centos    "ls"          3 hours ago      Exited (0) 3 hours ago             magical_dubinsky
#只显示容器号
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps -q 
b86226808d2b
#全部的
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                     PORTS     NAMES
b86226808d2b   centos    "/bin/bash"   20 minutes ago   Up 20 minutes                        mycentos0922
c80bf3e520cc   centos    "ls"          3 hours ago      Exited (0) 3 hours ago               beautiful_shaw
0c6bffe45002   centos    "ls"          3 hours ago      Exited (0) 3 hours ago               magical_dubinsky
a71c63f25d64   centos    "/bin/bash"   3 hours ago      Exited (127) 3 hours ago             xenodochial_morse

退出容器

对于交互式容器,默认不使用command参数的话,run -it 后会进入容器内,此时退出容器有两种方式:

  • exit,容器停止并退出
  • ctrl + p + q(先按p再按q),容器不停止,只是退出,容器在后台运行,这时用docker ps查看的话,容器状态为up

启动/重启/停止/强制停止容器

docker start/restart/stop/kill

docker rm(删除已停止的容器)

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                     PORTS     NAMES
b86226808d2b   centos    "/bin/bash"   39 minutes ago   Up 38 minutes                        mycentos0922
c80bf3e520cc   centos    "ls"          3 hours ago      Exited (0) 3 hours ago               beautiful_shaw
0c6bffe45002   centos    "ls"          4 hours ago      Exited (0) 4 hours ago               magical_dubinsky
a71c63f25d64   centos    "/bin/bash"   4 hours ago      Exited (127) 4 hours ago             xenodochial_morse
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker rm b86226808d2b
Error response from daemon: You cannot remove a running container b86226808d2b42d1a2dd4060e01fbfdc3186b107647742052c633bf1810f6da6. Stop the container before attempting removal or force remove
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker rm -f b86226808d2b
b86226808d2b

对于正在运行的容器,无法用rm删除,可以用rm -f强制删除,但不建议这么做,最好是先stop,再rm。

一次性删除多个容器:

docker rm $(docker ps -a -q)  或者  docker ps -a -q|xargs docker rm

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker rm $(docker ps -a -q)
c80bf3e520cc
0c6bffe45002
a71c63f25d64

容器命令(二)

启动守护式容器

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker run -d centos
5eb9f9ce25fd6321e66494f744a4c22d2cdeb375a5bf81356f47c6ea770eb7f6
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps -l
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
5eb9f9ce25fd   centos    "/bin/bash"   14 seconds ago   Exited (0) 13 seconds ago             focused_almeida
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# 

发现docker run -d启动守护式容器后,docker ps查看并没有正在运行的容器。

但根据返回的容器id,确实是启动了一个容器,再根据docker ps -l 确定此容器在13秒之前已退出了。

这里有一个docker很重要的机制:Docker容器后台运行的话,就必须有一个前台进程。
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

docker logs(查看容器日志)

选项说明

docker logs -f -t --tail 容器ID
* -t 是加入时间戳
* -f 跟随最新的日志打印
* --tail 数字 显示最后多少条

先执行一个守护式容器:

docker run -d centos /bin/sh -c "while true;do echo hello zzy;sleep 2;done"

此时用docker ps查看,会发现有容器在up,因为容器中shell执行的是循环脚本。

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker run -d centos /bin/sh -c "while true;do echo hello zzy;sleep 2;done"
e0711f532a9a33c672754f5efb261eead894f3c75249dae21ff7e98d303dfb32
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
e0711f532a9a   centos    "/bin/sh -c 'while t…"   5 seconds ago   Up 4 seconds             competent_burnell

用docker logs 查看这个容器的日志:

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker logs -t -f --tail 3 e0711f532a9a
2021-01-05T09:03:00.923246482Z hello zzy
2021-01-05T09:03:02.925240633Z hello zzy
2021-01-05T09:03:04.927207553Z hello zzy
2021-01-05T09:03:06.929193959Z hello zzy
2021-01-05T09:03:08.931253460Z hello zzy
2021-01-05T09:03:10.933214269Z hello zzy
2021-01-05T09:03:12.935182144Z hello zzy

docker top (查看容器内运行的进程)

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
e0711f532a9a   centos    "/bin/sh -c 'while t…"   11 minutes ago   Up 11 minutes             competent_burnell
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker top e0711f532a9a
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                26729               26709               0                   17:01               ?                   00:00:00            /bin/sh -c while true;do echo hello zzy;sleep 2;done
root                27232               26729               0                   17:13               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 2

docker inspect (查看容器内部细节)

docker容器是层层继承的关系,以json字符串的形式返回结果

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker inspect e0711f532a9a
[
    {
        "Id": "e0711f532a9a33c672754f5efb261eead894f3c75249dae21ff7e98d303dfb32",
        "Created": "2021-01-05T09:01:30.54195429Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true;do echo hello zzy;sleep 2;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 26729,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-01-05T09:01:30.835940473Z",
            "FinishedAt": "0001-01-01T00:00:00Z"

。。。。。。

进入正在运行的容器并以命令行交互

上面有讲到用docker run -it 启动交互式容器后,会进入容器,用ctrl + p + q退出但并不停止容器,这时如果想重新进入容器的话有两种方式:

1.docker attach 容器ID
2.docker exec -it 容器ID /bin/bash
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS         PORTS     NAMES
d317ba66016d   centos    "/bin/bash"   10 seconds ago   Up 9 seconds             friendly_diffie
#用attach重新进入
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker attach d317ba66016d
#ctrl+p+q退出
[root@d317ba66016d /]# read escape sequence
#用exec重新进入
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker exec -it d317ba66016d /bin/bash
[root@d317ba66016d /]# 

两种方式的区别:

attach 直接进入容器启动命令的终端,不会启动新的进程
exec   是在容器中打开新的终端,并且可以启动新的进程

exec功能比attach更强大,还可以不进入容器,直接执行命令然后返回结果:

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker exec -it d317ba66016d ls /tmp
ks-script-esd4my7v  ks-script-eusq_sc5

总结:attach必须进入容器后才能干活,exec在容器内和容器外都可以干活

docker cp (从容器内拷贝文件到主机上)

docker cp 容器ID:容器内路径 目的主机路径(注意有个冒号)

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# pwd
/root
#查看容器/tmp目录
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker exec -it d317ba66016d ls -l /tmp
total 8
-rwx------ 1 root root 701 Dec  4 17:37 ks-script-esd4my7v
-rwx------ 1 root root 671 Dec  4 17:37 ks-script-eusq_sc5
#把容器/tmp目录下的ks-script-esd4my7v拷贝到宿主机/root下
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker cp d317ba66016d:/tmp/ks-script-esd4my7v /root
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# ll
total 4
-rwx------ 1 root root 701 Dec  5 01:37 ks-script-esd4my7v

小结

docker命令大全:

attach    Attach to a running container         # 当前 shell 下 attach 连接指定运行镜像

build     Build an image from a Dockerfile        # 通过 Dockerfile 定制镜像

commit    Create a new image from a container changes  # 提交当前容器为新的镜像

cp        Copy files/folders from the containers filesystem to the host path  #从容器中拷贝指定文件或者目录到宿主机中

create    Create a new container                        # 创建一个新的容器,同 run,但不启动容器

diff      Inspect changes on a container's filesystem   # 查看 docker 容器变化

events    Get real time events from the server          # 从 docker 服务获取容器实时事件

exec      Run a command in an existing container        # 在已存在的容器上运行命令

export    Stream the contents of a container as a tar archive   # 导出容器的内容流作为一个 tar 归档文件[对应 import ]

history   Show the history of an image                  # 展示一个镜像形成历史

images    List images                                   # 列出系统当前镜像

import    Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]

info      Display system-wide information               # 显示系统相关信息

inspect   Return low-level information on a container   # 查看容器详细信息

kill      Kill a running container                      # kill 指定 docker 容器

load      Load an image from a tar archive              # 从一个 tar 包中加载一个镜像[对应 save]

login     Register or Login to the docker registry server    # 注册或者登陆一个 docker 源服务器

logout    Log out from a Docker registry server          # 从当前 Docker registry 退出

logs      Fetch the logs of a container                 # 输出当前容器日志信息

port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT    # 查看映射端口对应的容器内部源端口

pause     Pause all processes within a container        # 暂停容器

ps        List containers                               # 列出容器列表

pull      Pull an image or a repository from the docker registry server   # 从docker镜像源服务器拉取指定镜像或者库镜像

push      Push an image or a repository to the docker registry server    # 推送指定镜像或者库镜像至docker源服务器

restart   Restart a running container                   # 重启运行的容器

rm        Remove one or more containers                 # 移除一个或者多个容器

rmi       Remove one or more images             # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]

run       Run a command in a new container              # 创建一个新的容器并运行一个命令

save      Save an image to a tar archive                # 保存一个镜像为一个 tar 包[对应 load]

search    Search for an image on the Docker Hub         # 在 docker hub 中搜索镜像

start     Start a stopped containers                    # 启动容器

stop      Stop a running containers                     # 停止容器

tag       Tag an image into a repository                # 给源中镜像打标签

top       Lookup the running processes of a container   # 查看容器中运行的进程信息

unpause   Unpause a paused container                    # 取消暂停容器

version   Show the docker version information           # 查看 docker 版本号

wait      Block until a container stops, then print its exit code   # 截取容器停止时的退出状态值

参考:https://www.cnblogs.com/venicid/p/11870332.html#auto-id-26

原文地址:https://www.cnblogs.com/xulan0922/p/14208048.html