用了很久docker, 对很多指令都是一知半解,所以现在来总结归纳一下。

总的来说,docker的命令一般可以分为几种:

  • Docker环境信息 — docker [info|version]
  • 容器生命周期管理 — docker [create|exec|run|start|stop|restart|kill|rm|pause|unpause]
  • 容器操作运维 — docker [ps|inspect|top|attach|wait|export|port|rename|stat]
  • 容器rootfs命令 — docker [commit|cp|diff]
  • 镜像仓库 — docker [login|pull|push|search]
  • 本地镜像管理 — docker [build|images|rmi|tag|save|import|load]
  • 容器资源管理 — docker [volume|network]
  • 系统日志信息 — docker [events|history|logs]

其命令结构图如下:

image.png

1. 查看环境信息

  1. docker info //用于检查docker是否安装正确,一般结合docker version使用
  2. docker version // 查看当前docker的版本号

2. 运维操作

  1. docker inspect // 用于查看镜像和容器的详细信息,默认会列出全部信息,可以通过--format参数来指定输出的模版格式,以便输出特定信息

查看容器的信息container(ps)

docker ps命令可以查看容器的CONTAINER ID,NAME,IMAGE NAME,端口开启及绑定,容器启动后执行的COMMNAD。最常见的功能是通过ps来找到CONTAINER_ID,以便对特定容器进行操作

  1. docker ps // 默认显示当前运行的container
  2. docker ps -a // 查看包括已经停止的所有容器
  3. docker ps -l // 显示最新启动的一个容器(包括已停止的)

3. 列出机器上的镜像(images)

其中我们可以根据REPOSITORY来判断这个镜像是否来自哪个服务器,如果没有“/”则表示官方镜像。类似于username/repos_name表示github的个人公共库。image id其实是缩写,如果要完整则带上—no-trune选项。

  1. docker images
  2. REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
  3. ubuntu 14.10 2185fd50e2ca 13 days ago 236.9 MB

还有就是search指令,可以搜索images

  1. docker search seanlo
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. seanloook/centos6 sean's docker repos 0

4. 从docker registry server中下拉image或者repository(pull)

  1. docker pull centos
  2. docker pull centos:centos6 // docker pull [OPTIONS] NAME[:TAG]
  3. docker pull dl.dockerpool.com:5000/mongo:latest // 私服下拉镜像

5. 推送一个image或repository到registry(push)

  1. docker push seanlook/mongo

6. 从image启动一个container(run)

docker run 命令首先会从特定的image之上create一层可写的container,然后通过start命令来启动它。
当利用docker run来创建容器时,docker在后台运行的标准操作包括:

  1. 检查本地是否存在指定的镜像,不存在的就从公有仓库下载
  2. 利用镜像创建并启动一个容器
  3. 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  4. 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去
  5. 从地址池配置一个ip地址给容器
  6. 执行用户指定的应用程序
  7. 执行完毕后容器终止

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

  1. docker run ubuntu echo "hello world" // 使用image创建container并执行相应命令,然后停止
  2. // 打印 “hello world”

6.1 使用image创建container并执行相应命令,然后停止

  1. # docker run ubuntu echo "hello world"
  2. # hello world

这是最简单的方式,跟在本地直接执行echo ‘hello world’几乎感觉不出任何区别,而实际上它会从本地ubuntu:latest镜像启动一个容器,并执行打印命令后退出。需要注意的是,这条指令后面默认跟了一个—rm=true参数,即完成操作后停止容器并从文件系统移除。因为Docker的容器实在是太轻量级了,很多时候用户都是随时删除和创建容器。

6.2 使用image创建container并进入交互模式,login shell是/bin/bash

# docker run -i -t --name mytest centos:centos6 /bin/bash
bash-4.1#

上面的—name参数可以指定启动后的容器名字,如果不指定则docker会帮我们取一个名字。镜像centos:centos6也可以用IMAGE ID(68edf809afe7) 代替,并且会启动一个伪终端。但是通过ps或者top命令我们只能看到一两个进程,因为容器的核心是所执行的应用程序,所需要的资源都是应用程序运行所必须的。除此之外,并没有其他的资源。可见docker对资源的利用率极高,此时使用exit和Ctrl-D退出了,这个容器也就消失了。

6.3 运行出一个container放在后台运行

# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 2; done"
ae60c4b642058fefcc61ada85a610914bed9f5df0e2aa147100eab85cea785dc

它将直接把启动的container挂起来放在后台运行,并且输出一个container id。通过docker ps可以看到这个容器的消息,可在container外面使用docker logs ae60c4b642058fefcc查看日志信息,也可以通过docker attach ae60c4b64205连接到这个正在运行的终端。此时Ctrl + C退出container就消失了。按照ctrl -p, ctrl -q可以退出到宿主机,而保持container仍然在运行。

另外,如果-d启动但后面的命令执行完就结束了,如/bin/bash, echo test, 则container做完该做的时候依旧会终止,而且-d不能与-rm同时使用。

7.映射host到container的端口和目录

映射主机到容器的端口是很有用的,如果有从其他主机访问memcached的需求,那就可以通过-p选项,形如-p , 可以存在下面几种写法:
-p 11211:11211 这个即是默认情况下,绑定主机所有网卡(0.0.0.0)的11211端口到容器的11211端口上
-p 127.0.0.1:11211:11211 只绑定localhost这个接口的11211端口
-p 127.0.0.1::5000
-p 127.0.0.1:80:8080

目录映射其实就是linux中的“绑定挂载”,目的就是将host路径到container的目录,这对于内外传送文件比较方便,这里的使用比较简单:-v 。 如果需要绑定多个目录,只需要添加多个-v即可。

# docker run --name nginx_test \
> -v /tmp/docker:/usr/share/nginx/html:ro \
> -p 80:80 -d \
> nginx:1.7.6

在主机的/tmp/docker下建立index.html, 就可以通过http://localhost:80或者http://host-ip:80访问了

8.将一个container保存为一个新的image(commit)

当我们在制作自己的镜像的时候,会在container中安装一些工具、修改配置,如果不做commit保存起来,那么container停止以后再启动,这些更改就消失了。

# docker commit af93e849d42c harbor-registry.zjiops.com/es310/alpine:rmq

9. 连接到正在运行中的container(exec)

docker exec -it 9120927942cd /bin/bash

10. 删除一个或者多个container, image(rm, rmi)

# docker rm: 删除一个或者多个容器
# docker rmi: 删除一个或者多个镜像
# docker rmi -f  `docker images | grep 'none' | awk '{print $3}'`// 删除build失败的镜像

11. 给镜像打上标签

 docker tag baaca3151cdb harbor-registry.djiops.com/zjiservice/golang:1.14.7

参考:docker常用命令详解