帮助命令
1 | docker version #查看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
2docker 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
2exit #容器停止退出
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
3docker cp d63a86064a0c:/tmp/ /usr/local/ #拷贝文件夹
docker cp d63a86064a0c:/tmp/a.txt /usr/local/ #拷贝文件
docker cp d63a86064a0c:/tmp/a.txt /usr/local/b.txt #拷贝文件,并指定拷贝后的文件名