用了很久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]
其命令结构图如下:
1. 查看环境信息
docker info //用于检查docker是否安装正确,一般结合docker version使用docker version // 查看当前docker的版本号
2. 运维操作
docker inspect // 用于查看镜像和容器的详细信息,默认会列出全部信息,可以通过--format参数来指定输出的模版格式,以便输出特定信息
查看容器的信息container(ps)
docker ps命令可以查看容器的CONTAINER ID,NAME,IMAGE NAME,端口开启及绑定,容器启动后执行的COMMNAD。最常见的功能是通过ps来找到CONTAINER_ID,以便对特定容器进行操作
docker ps // 默认显示当前运行的containerdocker ps -a // 查看包括已经停止的所有容器docker ps -l // 显示最新启动的一个容器(包括已停止的)
3. 列出机器上的镜像(images)
其中我们可以根据REPOSITORY来判断这个镜像是否来自哪个服务器,如果没有“/”则表示官方镜像。类似于username/repos_name表示github的个人公共库。image id其实是缩写,如果要完整则带上—no-trune选项。
docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEubuntu 14.10 2185fd50e2ca 13 days ago 236.9 MB
还有就是search指令,可以搜索images
docker search seanloNAME DESCRIPTION STARS OFFICIAL AUTOMATEDseanloook/centos6 sean's docker repos 0
4. 从docker registry server中下拉image或者repository(pull)
docker pull centosdocker pull centos:centos6 // docker pull [OPTIONS] NAME[:TAG]docker pull dl.dockerpool.com:5000/mongo:latest // 私服下拉镜像
5. 推送一个image或repository到registry(push)
docker push seanlook/mongo
6. 从image启动一个container(run)
docker run 命令首先会从特定的image之上create一层可写的container,然后通过start命令来启动它。
当利用docker run来创建容器时,docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在的就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个ip地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器终止
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
docker run ubuntu echo "hello world" // 使用image创建container并执行相应命令,然后停止// 打印 “hello world”
6.1 使用image创建container并执行相应命令,然后停止
# docker run ubuntu echo "hello world"# 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
# 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常用命令详解
