一 Docker常用命令

1. docker帮助命令

  • (1) 查看docker版本:
    docker version
  • (2) 查看docker信息:
    docker info
  • (3) docker帮助命令:
    docker --help

2. docker镜像命令

2.1 列出所有镜像

  • docker images:列出本地主机上的镜像,镜像由镜像名:tag唯一标记,tag可认为是版本号。
  • docker images -a:列出本地所有的镜像(含中间映像层)。
  • docker images -q:只显示镜像的id。
  • docker images --digests:显示镜像的摘要信息。
  • docker images --no-trunc:显示完整的镜像信息。

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

2.2 在github搜索镜像

  • docker search 镜像名:在docker hub上搜索某个镜像。
    选项:
  • –automated:弃用,只列出自动构建类型的镜像。
  • –filter , -f:基于给定条件过滤输出。
  • –format:使用模板格式化显示输出。
  • –limit:Max number of search results ,默认值25。
  • –no-trunc:禁止截断输出。
  • –stars , -s:弃用,只显示收藏数不小于几颗星的镜像,移到–filter中使用。

部分例子:

# 1. 只列出automated build类型的镜像。
docker search --automated tomcat					# 低版本
docker search --filter is-automated=true tomcat		# 高版本

# 2. 限制搜索输出个数
docker search redis --limit 5

# 3. 显示完整的镜像描述,即不截断。
docker search --no-trunc tomcat

# 4. 列出starts数不小于30的镜像。
docker search -s 30 tomcat							# 低版本
docker search --filter=stars=30 tomcat				# 高版本,例如我的是20.10.7,执行上面的-s会报错。

2.3 下载镜像

  • docker pull 镜像名:TAG:下载指定TAG的镜像,不加TAG默认为latest。
    例如 docker pull tomcat。

2.4 删除未在使用的镜像

  • docker rmi 镜像名:删除未在使用镜像,若在使用则不能删除,默认删除latest的。
  • docker rmi -f 镜像名:强制删除,即使在使用也可以删除。
  • docker rmi -f 镜像名1:TAG 镜像名2:TAG:删除多个。
  • docker rmi -f $(docker images -qa):删除全部。

3. docker容器命令

docker pull ubuntu

3.1 新建并启动容器

docker run [options] 镜像名|镜像ID [command] [arg...]:新建并启动容器

常用optins:
--name:为容器指定一个名称。
-i:以交互模式运行容器,通常与-t同时使用。
-t:为容器重新分配一个伪输入终端,通常与-i同时使用。
-d:后台运行容,即启动守护式容器。
-P: 随机端口映射,端口由系统自行随机分配。
-p: 指定端口映射,有以下四种格式:
	1)ip:hostPort:containerPort
	2)ip::containerPort
	3)hostPort:containerPort
	4)containerPort
例如,/bin/bash代表command:
docker run -it --name=myubuntu0311 ubuntu /bin/bash

docker 定义tag docker的tag命令_容器

3.2 列出正在运行的容器

此时新开一个终端输入以下命令,可以看到上面的容器正在运行。

docker ps

docker 定义tag docker的tag命令_容器_02


其它选项:

docker ps -a:列出当前所有正在运行的容器+历史上运行过的容器。
docker ps -l:显示最近创建的容器。
docker ps -n 数字:显示最近创建的n个容器。
docker ps -q:静默模式,只显示容器编号。
docker ps --no-trunc:不截断输出。

3.3 退出容器

exit:容器停止退出。
Ctrl+P+Q:容器不停止退出。

注意,进入容器后,Ctrl+C不会退出容器,可以认为没有影响,Ctrl+C只是中断某个操作而已。

演示exit,首先docker ps看到容器正在运行,然后第2步使用exit退出,在使用docker ps看到,容器已经停止退出。

docker 定义tag docker的tag命令_容器_03

演示Ctrl+P+Q。

# 1. 首先把原来停止的容器重新启动。
docker start myubuntu0311

# 2. 查看是否启动。
docker ps

# 3. 进入容器。f36b4f7e7614是容器ID,由docker ps获取。
docker exec -it  f36b4f7e7614 /bin/bash

# 4. 按下Ctrl+P+Q。xshell也是可以的,我的环境就是在xshell测试的。

# 5. 再次查看容器,可以看到容器并未退出。
docker ps

如下图:

docker 定义tag docker的tag命令_运维_04

但是需要注意,如果创建容器的时候是以守护进程即-d选项创建的话,那么即使你使用exit退出,容器也不会停止的,此时docker ps还是能看到该容器正在运行。

docker 定义tag docker的tag命令_ubuntu_05

3.4 启动/重启/停止容器

# 1. 启动容器。
docker start 容器ID或者容器名

# 2. 重启容器。
docker restart 容器ID或者容器名

# 3. 停止容器,类似于电脑关机。
docker stop 容器ID或者容器名

# 4. 强制停止,类似于电脑拔电源关机。
docker kill 容器ID或者容器名

3.5 删除容器

# 1. 删除已停止的容器,若未停止则不删除。
docker rm 容器名

# 2. 强制停止并删除容器。
docker rm -f 容器名

# 3. 删除所有容器。
docker rm -f $(docker ps -aq)

3.6 后台运行容器

# 启动守护式容器,运行在后台,用docker ps查看看不到,因为docker容器想在后台运行,就必须要有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(例如top、tail、或者自己的程序一直在前台运行),那么容器就会自动退出,这种是docker的机制问题。
docker run -d 容器名

# 例如:
# 1. 只加-d参数或者加上--name参数创建容器,docker ps都不会看到这些创建的容器,因为会自动停止了。
docker run -d ubuntu
docker ps
# 不过可以通过-a选项查看以前运行过的容器,证明这些容器确实是有启动过的。
docker ps -a

# 2. 但是注意,如果加上-it,那么表示程序前台运行交互,并启动后台运行。
docker run -it -d --name=myubuntu2 ubuntu
# 此时ps可以看到myubuntu2这个容器是有在运行的。
docker ps

例子的第一点截图:

docker 定义tag docker的tag命令_ubuntu_06

例子的第二点截图:

docker 定义tag docker的tag命令_docker_07

上面说到,如果只加-d启动容器,如果没有前台进程,那么这个容器会停止运行。
解决方法我一般会使用以下两种:

  • 1)就是在启动容器时,额外添加-it参数,而不能只使用-d参数。这也是比较常用的方法。
例如:docker run -it -d --name=myubuntu2 ubuntu
  • 2)将你要运行的程序以前台的形式运行即可。不过这种比较取巧,一般很少这样用。
例如:docker run -d ubuntu /bin/bash -c "while true;do echo hello world;sleep 2;done"

docker 定义tag docker的tag命令_ubuntu_08

3.7 容器日志相关

docker logs [options] 容器ID|容器名:查看容器日志
选项:
-t:加入时间戳。
-f:跟随最新的日志打印(动态打印)。
--tail 数字 容器名:显示最后多少条。
# 如果这个容器继续运行即docker run -d ubuntu /bin/bash -c "while true;do echo hello world;sleep 2;done"
# 1. 那么我们可以查看它的日志。
docker logs 55126741aefc

# 2. 假设时间戳
docker logs -t 55126741aefc

# 3. 动态打印
docker logs -t -f 55126741aefc

# 4. 显示最后多少条。
docker logs -t -f --tail 5 55126741aefc

docker 定义tag docker的tag命令_docker_09


加上时间戳后:

docker 定义tag docker的tag命令_运维_10


动态打印:

docker 定义tag docker的tag命令_容器_11


显示多少条,不过这个只针对一开始显示5条,后续依然会显示多条打印。

docker 定义tag docker的tag命令_容器_12

3.8 查看容器内的进程

相当于在容器里面运行了top。

docker top 容器ID|容器名

docker 定义tag docker的tag命令_容器_13

3.9 查看容器内部细节

# 查看容器内部细节,返回是json串
docker inspect 容器ID|容器名

由于后面很多内容,所以只截图一小部分。

docker 定义tag docker的tag命令_docker_14

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

进入正在运行的容器有两种方法。

  • 1)docker attach 容器ID|容器名。 直接进入容器启动命令的终端,不会启动新的进程,表示有什么操作进去容器再说。
  • 2)docker exec -it 容器ID|容器名 bash命令。 在容器中打开新的终端,并可以启动新的进程。

例如我们使用attach想要在容器执行某个命令,需要进入以后才能操作。而exec可以不用进入容器就可以操作。

docker 定义tag docker的tag命令_容器_15


下面直接在容器外就可以看到结果。

docker 定义tag docker的tag命令_ubuntu_16

但是注意,如果使用attach进入容器时,如果使用exit退出,则会导致容器停止运行,不管该容器是否以-d后台运行。而使用Ctrl+P+Q则不会。

下面测试看到,不管是否以后台运行,只要attach进入容器后,exit退出后,ps看到容器都停止了。而使用Ctrl+P+Q则不会,这里就不测试这个了,本人已经测试过。

docker 定义tag docker的tag命令_docker 定义tag_17

而使用exec进入容器:
如果非后台运行,那么exit退出会导致容器停止,Ctrl+P+Q则不会。
如果后台运行,那么exit退出不会导致容器停止,Ctrl+P+Q同样不会。
这一点在停止容器时已经测试,这里不再测试。

总结:
attach、exec进入正在运行的容器,exit、Ctrl+P+Q的退出方式 以及 容器是否后台启动 这三者对容器是否会造成退出的影响:

  • 1)若以attach方式进入容器,以exit退出容器,不管是否后台启动,容器都会停止。
  • 2)若以exec方式进入容器,以exit退出容器,若是后台启动,则容器不会停止。若不是后台启动,则容器会停止。
  • 3)不管以attach还是exec进入容器,然后不管是否是后台启动,只要使用Ctrl+P+Q退出容器,都不会停止容器。

3.11 容器与本机的内容相互拷贝

  • 1)本机内容拷贝到容器:docker cp 本机路径 容器ID|容器名:容器中文件的路径。
  • 2)容器拷贝内容到本机,只需要将参数调换一下即可:docker cp 容器ID|容器名:容器中文件的路径 本机路径。

例如把容器下/lib/os-release文件拷贝到宿主机下。

docker 定义tag docker的tag命令_运维_18