资深专家都知道的顶级 Docker 命令

栏目: 服务器 · Nginx · 发布时间: 5年前

内容简介:开发人员一直在努力提高 Docker 的使用率和性能,命令也在不停变化。Docker 命令经常被弃用,或被替换为更新且更有效的命令,本文总结了近年来资深专家最常用的命令列表并给出部分使用方法。目前,Docker 共有 13 个管理命令和 41 个通用命令,以下是常用 Docker 命令列表:无论是在本地还是云端,我们都需要检查 Docker 版本和系统信息,可以使用以下命令找到 Docker 版本:

开发人员一直在努力提高 Docker 的使用率和性能,命令也在不停变化。Docker 命令经常被弃用,或被替换为更新且更有效的命令,本文总结了近年来资深专家最常用的命令列表并给出部分使用方法。

目前,Docker 共有 13 个管理命令和 41 个通用命令,以下是常用 Docker 命令列表:

  • docker help—检查最新 Docker 可用命令;
  • docker attach—将本地输入、输出、错误流附加到正在运行的容器;
  • docker commit—从当前更改的容器状态创建新镜像;
  • docker exec—在活动或正在运行的容器中运行命令;
  • docker history—显示镜像历史记录;
  • docker info—显示系统范围信息;
  • docker inspect—查找有关 docker 容器和镜像的系统级信息;
  • docker login—登录到本地注册表或 Docker Hub;
  • docker pull—从本地注册表或 Docker Hub 中提取镜像或存储库;
  • docker ps—列出容器的各种属性;
  • docker restart—停止并启动容器;
  • docker rm—移除容器;
  • docker rmi—删除镜像;
  • docker run—在隔离容器中运行命令;
  • docker search—在 Docker Hub 中搜索镜像;
  • docker start—启动已停止的容器;
  • docker stop—停止运行容器;
  • docker version—提供 docker 版本信息。

查找 Docker 版本和系统信息

无论是在本地还是云端,我们都需要检查 Docker 版本和系统信息,可以使用以下命令找到 Docker 版本:

复制代码

$ docker version
Client:
Version:18.03.0-ce
API version:1.37
Go version: go1.9.4
Git commit:0520e24
Built: Wed Mar21 23:06:222018
OS/Arch: darwin/amd64
Experimental:false
Orchestrator: swarm
Server:
Engine:
Version:18.03.0-ce
API version:1.37(minimum version1.12)
Go version: go1.9.4
Git commit:0520e24
Built: Wed Mar21 23:14:322018
OS/Arch: linux/amd64
Experimental:true

另一个重要命令是 docker info:

复制代码

$ docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 18.03.0-ce
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type:true
Native Overlay Diff:true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network:bridgehost ipvlan macvlannulloverlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
…

该命令将显示部分设备信息,比如服务器版本、存储驱动程序、内核版本、操作系统、总内存等。当尝试为当前 Docker 安装启动新资源或尝试找出系统级资源分配问题时,这些信息非常有用,这也是检查运行、停止容器数量及下载镜像数量的快速方法。

搜索下载 Docker 镜像

可以使用 docker search 命令在 Docker Hub 搜索已有镜像:

复制代码

$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntuisa Debian-based Linux operating sys…7861 [OK]
dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-serverandNoVNC190 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi…156 [OK]
ansible/ubuntu14.04-ansible Ubuntu14.04LTS with ansible93 [OK]
ubuntu-upstart Upstartisan event-based replacementfor th…87 [OK]
neurodebian NeuroDebian provides neuroscience research s…50 [OK]
…

以上对 ubuntu 的搜索显示可用镜像、描述和官方状态等信息。如果要下载 ubuntu 镜像,可以使用 docker pull 命令:

复制代码

$ docker pull ubuntu
Usingdefaulttag:latest
latest:Pulling from library/ubuntu
6b98dfc16071:Pull complete
4001a1209541:Pull complete
6319fc68c576:Pull complete
b24603670dc3:Pull complete
97f170c87c6f:Pull complete
Digest:sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d
Status:Downloaded newer imagefor ubuntu:latest
$

Docker 镜像

使用 docker info 命令查找拥有镜像数量:

复制代码

$ docker info
Containers:0
Running:0
Paused:0
Stopped:0
Images:1
…

docker images 命令可详细列出拥有镜像:

复制代码

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              113a43faa138        2 weeks ago         81.2MB

假设下载 NGINX 镜像,可以运行 docker pull 命令:

复制代码

$docker pull nginx

如果检查 Docker 镜像,会看到如下内容:

复制代码

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              113a43faa138        2 weeks ago         81.2MB
nginx               latest              cd5239a0906a        2 weeks ago         109MB

如果寻找 Ubuntu 16.04 版本,可使用 16.04 标签下载特定版本:

复制代码

$ docker pull ubuntu:16.04

随后,将出现两个 Ubuntu 映像版本:

复制代码

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04              5e8b97a2a082        2 weeks ago         114MB
ubuntu              latest              113a43faa138        2 weeks ago         81.2MB
nginx               latest              cd5239a0906a        2 weeks ago         109MB

注意:无需注册 Docker Hub 即可提取镜像。如果想将镜像推送到 Docker Hub,需要注册然后使用 docker login 命令登录:

复制代码

$ docker login--username=yourhubusername--email=youremail@company.com

运行镜像的 Docker 容器

假设想在 docker 上运行 NGINX 服务器,可运行以下命令:

复制代码

$ docker run -p 8080:80nginx

如果已用 run 命令从 Docker Hub 提取 nginx 映像创建 NGINX 容器。 -p 8080:80 会告诉 Docker 将 localhost 端口 8080 映射到 Docker 容器端口 80,应该能够从 http:// localhost:8080 访问 NGINX 服务器。

NGINX 容器已附加到命令行。如果退出命令行,容器将会停止,可使用 detach(’-  d)启动 NGINX 容器,这样即使退出命令行也可继续运行。

复制代码

$ docker run -p 8080:80-d nginx

以上命令将以分离模式启动容器并返回命令行。

使用 docker ps 命令列出 Docker 容器

docker ps 命令允许查找正在运行的所有容器:

复制代码

$ docker ps
CONTAINER ID         IMAGE         COMMAND         CREATED           STATUS          PORTS             NAMES
6162daed25da         nginx  "nginx -g 'daemon of…" 7 minutes ago   Up7 minutes  0.0.0.0:8080->80/tcp  hardcore_torvalds

如上显示容器的各种属性,可以看到是从 nginx 镜像创建并显示端口转发信息。CONTAINER ID 和 NAMES 属性需要特别提及,可以使用上述两大属性唯一标识容器。二者都可自动生成,但也可在容器创建过程中为容器命名。

创建一个名为 my_nginx 的 NGINX 容器:

复制代码

$ docker run --name my_nginx -p 8888:80-d nginx

再次列出所有 Docker 容器:

复制代码

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                  NAMES
e7b19b6ad778        nginx               "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:8888->80/tcp   my_nginx
6162daed25da        nginx               "nginx -g 'daemon of…"   15 minutes ago       Up16 minutes       0.0.0.0:8080->80/tcp   hardcore_torvalds

请注意,新容器的名称为“my_nginx”。 处理大量容器时,可以使用命名约定,这可以更好得组织容器。

docker ps 命令仅显示正在运行的容器。如果对上述情况使用 docker info 命令:

复制代码

$ docker info
Containers:2
Running:2
Paused:0
Stopped:0
Images:3

可以看到有两个容器正在运行,如果一个暂停或已停止,则不会仅使用 docker ps 命令查看这些容器,必须使用 all( -  a)选项:

复制代码

$ docker ps -a

启动,停止,重启和杀死容器

假设要停止’my_nginx’容器,可使用 CONTAINER ID 或 NAME。

复制代码

$ docker stop my_nginx
my_nginx

列出 Docker 容器:

复制代码

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
6162daed25da        nginx               "nginx -g 'daemon of…"   27 minutes ago      Up27 minutes       0.0.0.0:8080->80/tcp   hardcore_torvalds
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS                  NAMES
e7b19b6ad778        nginx               "nginx -g 'daemon of…"   12 minutes ago      Exited (0) About a minute ago                          my_nginx
6162daed25da        nginx               "nginx -g 'daemon of…"   27 minutes ago      Up27 minutes                   0.0.0.0:8080->80/tcp   hardcore_torvalds

如果在没有 -a 选项的情况下运行 docker ps,只显示正在运行的容器。在第二种情况下,可以看到’my_nginx’容器处于退出状态。

让我们 docker start  容器:

复制代码

$ docker start my_nginx
my_nginx

检查 Docker 容器列表:

复制代码

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
e7b19b6ad778        nginx               "nginx -g 'daemon of…"   16 minutes ago      Up29 seconds       0.0.0.0:8888->80/tcp   my_nginx
6162daed25da        nginx               "nginx -g 'daemon of…"   30 minutes ago      Up30 minutes       0.0.0.0:8080->80/tcp   hardcore_torvalds

可以看到 STATUS 显示容器’my_nginx’再次被启动。

如果由于某些问题而需重启容器,则可使用 restart 命令,这比单独停止和启动容器速度更快:

复制代码

$docker restart my_nginx

可以像进程一样终止 docker 容器,比如终止 my_nginx 容器:

复制代码

$docker kill my_nginx

再次列出 Docker 容器:

复制代码

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS                  NAMES
e7b19b6ad778        nginx               "nginx -g 'daemon of…"   22 minutes ago      Exited (137)7 seconds ago                          my_nginx
6162daed25da        nginx               "nginx -g 'daemon of…"   36 minutes ago      Up36 minutes                0.0.0.0:8080->80/tcp   hardcore_torvalds

容器 my_nginx 未运行。此外,可在信息中看到一个正在运行的容器和一个已停止容器:

复制代码

$ docker info
Containers:2
Running:1
Paused:0
Stopped:1
Images:3
…

Docker Exec Bash 和 Docker SSH

如果需要与 shell 进行交互以创建服务或解决问题,可以使用 docker exec 命令创建交互式 shell。比如,用 bash shell 从 ubuntu 映像启动一个容器:

复制代码

$docker run --name my_ubuntu -it ubuntu:latest bash
root@a19c770b8621:/#

root @haracle#表示位于 Docker 容器的 bash shell 中,可以运行 shell 命令:

复制代码

root@a19c770b8621:/# ls
bin boot dev etc homeliblib64mediamntoptprocrootrunsbinsrvsystmpusrvar
root@a19c770b8621:/# pwd
/

列出 Docker 容器:

复制代码

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                  NAMES
a19c770b8621        ubuntu:latest       "bash"                   Abouta minute ago   UpAbouta minute                          my_ubuntu
6162daed25da        nginx               "nginx -g 'daemon of…"   Aboutanhour ago    UpAboutanhour    0.0.0.0:8080->80/tcp   hardcore_torvalds

如上,my_ubuntu 正在运行。假设想将 Docker ssh 放入’my_ubuntu’容器中,可以使用 docker exec bash:

复制代码

$docker exec -it my_ubuntu bash
root@a19c770b8621:/#

使用 docker exec 向容器发出命令。例如,可以直接用命令提示符在 my_ubuntu 容器上运行 ls 命令:

复制代码

$ docker exec -it my_ubuntu ls
bin dev home lib64 mnt proc run srv tmp var
boot etclibmediaoptrootsbinsysusr

以分离模式启动容器并使用 docker attach

以上示例用附加模式启动 ubuntu 容器,我们也可在分离模式下启动:

复制代码

$ docker run-it -d --name my_ubuntu_2 ubuntu:latest bash
75b28b7208359137b3e1dc2843387918e28b4c6c4860ef0cdeac79c205f5cbc4

验证容器是否正在运行:

复制代码

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
75b28b720835        ubuntu:latest       "bash"                   3 minutes ago       Up3 minutes                               my_ubuntu_2
a19c770b8621        ubuntu:latest       "bash"                   15 minutes ago      Up15 minutes                              my_ubuntu
6162daed25da        nginx               "nginx -g 'daemon of…"   2 hours ago         Up2 hours          0.0.0.0:8080->80/tcp   hardcore_torvalds

使用 docker attach 命令获取 docker exec bash-like 效果:

复制代码

$docker attach my_ubuntu_2
root@75b28b720835:/#

检查 Docker 镜像历史

Docker 社区镜像是分层创建的,可使用 Docker history 命令查看镜像创建方式。先看看有哪些镜像:

复制代码

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04              5e8b97a2a082        2 weeks ago         114MB
ubuntu              latest              113a43faa138        2 weeks ago         81.2MB
nginx               latest              cd5239a0906a        2 weeks ago         109MB

查看 nginx 镜像历史:

复制代码

$ docker history nginx
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
cd5239a0906a        2 weeks ago         /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop)  STOPSIGNAL [SIGTERM]         0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop)  EXPOSE 80/tcp                0B                  
<missing>           2 weeks ago         /bin/sh -c ln -sf /dev/stdout /var/log/nginx…   22B                 
<missing>           2 weeks ago         /bin/sh -c set -x  && apt-getupdate && apt…   53.7MB              
<missing>           2 weeks ago         /bin/sh -c #(nop)  ENV NJS_VERSION=1.15.0.0.…   0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop)  ENV NGINX_VERSION=1.15.0-…   0B                  
<missing>           7 weeks ago         /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B                  
<missing>           8 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B                  
<missing>           8 weeks ago         /bin/sh -c #(nop) ADD file:ec5be7eec56a74975…   55.3MB

使用镜像历史命令查找最近更改,如果在新版本镜像中发现问题,则此命令可帮助找到原因,也可用以下命令:

复制代码

$docker imagehistorynginx

Docker 检查容器

可以使用 docker inspect 命令查找有关系统的信息,运行 docker ps 命令列出 Docker 容器:

复制代码

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
6162daed25da        nginx               "nginx -g 'daemon of…"   2 hours ago         Up2 hours          0.0.0.0:8080->80/tcp   hardcore_torvalds

使用 CONTAINER ID 检查容器(也可使用容器名称):

复制代码

$ docker inspect6162daed25da
[
{
"Id":"6162daed25da50b98afca5f7ed8caca2289bf309b2547d87ae8674b899d604a4",
"Created":"2018-06-25T05:46:37.902211302Z",
"Path":"nginx",
"Args": [
…
…
…
"DriverOpts":null
}
}
}
}
]

该命令将以 JSON 格式提供大量信息,以下是查找容器 IP 地址的技巧:

复制代码

$ docker inspect6162daed25da |grep "IPAddress"
            "SecondaryIPAddresses":null,
            "IPAddress":"172.17.0.2",
                    "IPAddress":"172.17.0.2",

使用 docker cp 将文件从本地复制到容器

再次列出 Docker 容器:

复制代码

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
6162daed25da        nginx               "nginx -g 'daemon of…"   3 hours ago         Up3 hours          0.0.0.0:8080->80/tcp   hardcore_torvalds

NGINX 容器在端口 8080 上运行。因此,如果转到 http:// localhost:8080,将看到以下内容:

复制代码

"Welcome to nginx!"

如果看到此页面,则 nginx Web 服务器已成功安装并正常运行,需要进一步配置。

首先,在本地目录中创建 index.html:

复制代码

<html>
<Header><title>My Website</title></header>
<body>
Hello world
</body>
</html>

使用带有 ls 的 docker exec 命令检查 NGINX 容器中具有 index.html 的文件夹:

复制代码

$ docker exec -it hardcore_torvalds ls /usr/share/nginx/html
50x.htmlindex.html

使用创建的本地文件覆盖容器 index.html 文件:

复制代码

$ docker cp index.htmlhardcore_torvalds:usr/share/nginx/html/

如果再次检查 http://localhost: 8080,应该可以看到问候语“Hello world”。

可使用 docker cp 命令在本地计算机和创建容器间移动文件,此方法可用于覆盖配置文件。

创建 Docker 镜像

如果想复制更多“Hello World”容器,必须将当前容器保存为镜像。

首先,停止容器:

复制代码

$ docker stop hardcore_torvalds

列出所有 Docker 容器:

复制代码

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS               NAMES
75b28b720835        ubuntu:latest       "bash"                   Aboutanhour ago   Exited (0)Aboutanhour ago                       my_ubuntu_2
a19c770b8621        ubuntu:latest       "bash"                   2 hours ago         Exited (0)Aboutanhour ago                       my_ubuntu
6162daed25da        nginx               "nginx -g 'daemon of…"   3 hours ago         Exited (0) 27 seconds ago                          hardcore_torvalds

从 STATUS 中,可以看到 NGINX’corecore_torvalds’容器已停止。使用 docker commit 命令创建新镜像:

复制代码

$ docker commit6162daed25da nginx_hello_world_template
sha256:117d060587a316035ed5a776e613d9cfbeee9fbfe202c6edc9203820c7da987b

如果现在检查,将看到新镜像:

复制代码

$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
nginx_hello_world_template   latest              117d060587a3        40 seconds ago      109MB
ubuntu                       16.04              5e8b97a2a082        2 weeks ago         114MB
ubuntu                       latest              113a43faa138        2 weeks ago         81.2MB
nginx                        latest              cd5239a0906a        2 weeks ago         109MB

可以使用此镜像并启动新 Docker 容器,新创建容器将具有“Hello world”页面,而不是“Welcome NGINX”页面。示例如下:

复制代码

$ docker run -it -d -p 8886:80nginx_hello_world_template
4e042d76c39125471951626ba42cd609a65c73f041943298f74f4fc43dc5596a
$

删除 Docker 容器和镜像

Docker 容器和镜像会占用硬盘空间,因此最好定期清理。首先停止所有容器,然后列出所有容器,使用以下 Docker 命令执行操作:

复制代码

$ docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                         PORTS               NAMES
4e042d76c391        nginx_hello_world_template   "nginx -g 'daemon of…"   2 minutes ago       Exited (0)8 seconds ago                           boring_keldysh
75b28b720835        ubuntu:latest                "bash"                   2 hours ago         Exited (0) About an hour ago                       my_ubuntu_2
a19c770b8621        ubuntu:latest                "bash"                   2 hours ago         Exited (0) About an hour ago                       my_ubuntu
6162daed25da        nginx                        "nginx -g 'daemon of…"   3 hours ago         Exited (0)11 minutes ago                          hardcore_torvalds

如上,有 4 个处于停止状态的容器,可使用 docker rm 命令删除容器:

复制代码

$ docker rm 4e042d76c39175b28b720835 a19c770b86216162daed25da
4e042d76c391
75b28b720835
a19c770b8621
6162daed25da

可使用 NAMES 代替 CONTAINER ID,容器列表现在应该是干净的:

复制代码

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

列出 Docker 镜像:

复制代码

$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
nginx_hello_world_template   latest              117d060587a3        11 minutes ago      109MB
ubuntu                       16.04              5e8b97a2a082        2 weeks ago         114MB
ubuntu                       latest              113a43faa138        2 weeks ago         81.2MB
nginx                        latest              cd5239a0906a        2 weeks ago         109MB

可使用 docker rmi 命令和 IMAGE ID 删除 docker 镜像:

复制代码

$ docker rmi117d060587a35e8b97a2a082113a43faa138 cd5239a0906a

最后,Docker 镜像列表应该是干净的:

复制代码

$ docker images
REPOSITORYTAGIMAGEID CREATED SIZE

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Practical Algorithms for Programmers

Practical Algorithms for Programmers

Andrew Binstock、John Rex / Addison-Wesley Professional / 1995-06-29 / USD 39.99

Most algorithm books today are either academic textbooks or rehashes of the same tired set of algorithms. Practical Algorithms for Programmers is the first book to give complete code implementations o......一起来看看 《Practical Algorithms for Programmers》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具