Docker(四)常用命令

帮助命令

1
2
3
4
5
docker version	#查看docker客户端和服务端的版本

docker info #查看docker客户端和服务端的基本信息

docker --help #查看docker命令的帮助信息

镜像命令

镜像操作的命令有点类似Git。

1.搜索镜像

1
docker images	#列出本地主机上的所有镜像

显示信息包括:

  • REPOSITORY:表示镜像的仓库源名字
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用 : 来唯一地确定一个镜像。

这个命令也可以在后面加参数,查看本地是否存在指定的镜像:

1
docker images ${镜像名字}

2.搜索镜像

1
docker search ${镜像名字}	#搜索镜像


这个命令和在https://hub.docker.com上搜索镜像是一样的功能。

3.下载镜像

1
docker pull ${镜像名字}	#将镜像从仓库拉取到本地

默认将拉取TAG=’latest’的镜像,如果要指定TAG,则使用如下命令:

1
docker pull ${镜像名字}:${TAG}

因为在启动容器的时候,如果本地没有镜像就会先从仓库下载一个latest版本的镜像,所以其实这一步不是必须的。

4.删除镜像

1
docker rmi ${镜像名字}		#删除本地镜像

其它命令还有:

1
2
docker rmi -f ${镜像ID}		#删除单个镜像
docker rmi -f ${镜像名1}:${TAG} ${镜像名2}:${TAG} #删除指定的多个镜像

5.commit

commit命令是用来提交容器副本使之成为一个新的镜像。

1
docker commit -m=${提交的描述信息} -a=${作者} ${容器ID} ${要创建的目标镜像名}:${标签名}

演示示例:

1.从Docker Hub上下载tomcat镜像到本地并成功运行。
1
docker run -it -d -p 8888:8080 tomcat

-p是用来指定主机端口和docker容器端口的映射关系。例如上面的命令docker容器的tomcat端口8080会映射到主机端口8888上。

在浏览器访问看到如下:

是什么原因导致的呢?我们进入到容器内,可以看到容器内tomcat目录下的webapps目录是空的,而有一个webapps.dist的目录,包含了通常我们应该在webapps目录下看到的文件。

其原因可能是因为docker推荐将webapps下的文件挂载在宿主机下,否则删除tomcat容器的时候服务文件会全部丢失,为了让用户主动将webapps挂载出来,维护者将最近更新的tomcat镜像全部改成webapps为空。

2.复制webapps.dist目录下的文件到webapps下

在容器中,将webapps.dist下的所有文件复制到webapps目录下。

这样浏览器能正常打开tomcat的欢迎页面了。

3.将当前修改过的tomcat容器提交为新的镜像

通过Ctrl+P+Q不停止容器退出,在宿主机执行commit命令,通过当前tomcat容器得到一个新的镜像。

4.启动新镜像的容器和旧镜像的容器

将刚才的容器关闭,启动新镜像的和旧镜像的容器,可以看到,新镜像容器中webapps目录下不为空,而旧镜像启动的容器webapps目录下仍是什么也没有。
修改过的tomcat:

原始的tomcat:

容器命令

本节的演示过程使用了centos的镜像来创建容器,所以先通过docker pull centos命令下载一个centos的镜像。

1.新建并启动容器

1
docker run [OPTIONS] $[镜像名字] [COMMAND] [ARG...]

OPTIONS是可选参数,有些是一个减号,有些是两个减号。

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


上图中是在前台启动了一个centos的容器,并进入到容器内的交互会话,docker run -it centos 命令等于docker run -it centos /bin/bash,后面的/bin/bash可省略,原因是centos镜像的dockerfile文件最后是CMD ["/bin/bash"],关于dockerfile是什么将在后面章节中讲解。

启动容器报错:WARNING: IPv4 forwarding is disabled. Networking will not work.

在启动容器时,看到有如下报错:

启动后,如果通过宿主机ip和容器映射到宿主机的端口去访问tomcat容器或reids容器时,会访问不了,解决办法:

1
vim  /usr/lib/sysctl.d/00-system.conf

加入一行

1
net.ipv4.ip_forward=1

然后重启服务器的网卡服务:

1
systemctl restart network

再重新启动容器就不会报这个异常了。

2.列出当前正在运行的容器

1
docker ps [OPTIONS]


OPTIONS说明:

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

3.退出容器

两种退出方式:

1
2
exit		#容器停止退出
ctrl+P+Q #容器不停止退出

4.启动容器

这个容器是已经存在过的,通过docker ps -a是能查到的,不像run是新建一个容器。

1
docker start ${容器ID或者容器名}

5.重启容器

1
docker restart ${容器ID或者容器名}

6.停止容器

1
docker stop ${容器ID或者容器名}

7.强制停止容器

1
docker kill ${容器ID或者容器名}

8.删除容器

1
docker rm ${容器id或者容器名}

删除所有停止的容器,则执行:

1
docker rm -f $(docker ps -a -q)

删除之后通过docker ps -a命令不会再展示。

其它重要命令

1.启动守护式容器

1
docker run -d ${镜像名字}

使用镜像centos:latest以后台模式启动一个容器:docker run -d centos

问题:然后docker ps -a进行查看, 会发现容器已经退出。
原因:Docker容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行。

2.查看容器日志

1
docker logs -f -t --tail ${行数} ${容器ID}

三个参数:

  • -t:是加入时间戳
  • -f:跟随最新的日志打印
  • –tail ${数字}:显示最后多少条

示例:以守护进程启动一个centos容器,并执行一个shell打印命令docker run -d centos /bin/sh -c "while true;do echo hello docker;sleep 2;done",再查看打印的日志。

3.查看容器内运行的进程

1
docker top ${容器ID}

4.查看容器内部细节

1
docker inspect ${容器ID}

这是一个非常重要的命令,可以查看容器内的很多配置参数,后面会有用到这个命令。

5.重新进入容器,并以命令行交互

当容器以守护式进程在后台运行时,可以通过如下两种方式进入容器并重新交互。
第一种方式:

1
docker attach ${容器ID}

第二种方式:

1
docker exec -it ${容器ID} ${bashShell}

bashShell:是交互时使用的Linux Shell命令。/bin/bash是各种Linux发行版标准配置的Shell命令。

这两种方式的区别:

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

6.从容器内拷贝文件/文件夹到主机上

1
docker cp ${容器ID}:${容器内路径} {目的主机路径}

用法示例:

1
2
3
docker cp d63a86064a0c:/tmp/ /usr/local/	#拷贝文件夹
docker cp d63a86064a0c:/tmp/a.txt /usr/local/ #拷贝文件
docker cp d63a86064a0c:/tmp/a.txt /usr/local/b.txt #拷贝文件,并指定拷贝后的文件名


------ 本文完 ------