Docker命令
帮助启动类命令
- 启动docker:
systemctl start docker - 停止docker:
systemctl stop docker - 重启docker:
systemctl restart docker - 查看docker状态:
systemctl status docker - 开机启动:
systemctl enable docker - 查看docker概要信息:
docker info - 查看docker总体帮助文档:
docker --help - 查看docker命令帮助文档:
docker [具体命令] -help
镜像命令
docker images
列出本地主机上的镜像
[root@aliyun /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0d120b6ccaa8 2 weeks ago 215MB
hello-world latest bf756fb1ae65 8 months ago 13.3kB
列名说明
| 列名 | 含义 |
|---|---|
| REPOSITORY | 镜像的仓库源 |
| TAG | 镜像的标签 |
| IMAGE ID | 镜像的id |
| CREATED | 镜像的创建时间 |
| SIZE | 镜像的大小 |
同一仓库源可以有多个TAG版本,代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG来定义不同的镜像。
如果你不指定一个镜像的版本标签,例如你只使用ubuntu,docker将默认使用ubuntu:latest镜像。
OPTIONS说明
-a:列出本地所有的镜像(含历史映像层)。-q:只显示镜像 ID。
docker search
搜索镜像:
docker search [OPTIONS] [镜像名字]
[root@aliyun /]# docker search mysql

列名说明
| 列名 | 含义 |
|---|---|
| NAME | 镜像名称 |
| DESCRIPTION | 镜像说明 |
| STARS | 点赞数量 |
| OFFICIAL | 是否是官方的 |
| AUTOMATED | 是否是自动构建的 |
OPTIONS说明
--limit:只列出N个镜像,默认25个docker search --limit 5 redis
--filter:根据指定条件过滤docker search mysql --filter=stars=3000 #过滤掉stars小于3000
docker pull
下载镜像:docker pull 镜像名字[:TAG]
- 没有TAG就是最新版
docker pull mysql等价于docker pull mysql:latest
[root@aliyun /]# docker pull mysql #默认下载最新版本
Using default tag: latest
[root@aliyun /]# docker pull mysql:5.7 #指定版本下载
docker rmi
删除镜像
-
删除单个(根据镜像id删除指定镜像):
docker rmi [镜像ID]- 强制删除(加上
-f参数就是强制删除,不建议使用):docker rmi -f [镜像ID]
- 强制删除(加上
-
删除多个:
docker rmi -f 镜像名1:TAG 镜像名2:TAG -
==删除全部(禁止使用)==:
docker rmi -f $(docker images -aq)
Docker虚悬镜像是什么
仓库名、标签都是<none>的镜像,俗称虚悬镜像
dangling image

没什么用,建议删除,Docker构建时出现问题可能会产生。
容器命令
有镜像才能创建容器,这是根本前提(下载一个CentoS或者ubuntu镜像演示)
[root@aliyun ~]# docker pull ubuntu
docker run
新建容器并启动:docker run [OPTIONS] ==IMAGE== [COMMAND] [ARG…]
#测试,启动并进入容器
[root@aliyun ~]# docker run -it ubuntu /bin/bash

参数说明
-
--name="Name":为容器指定一个名称,例如 tomcat1 tomcat2 用来区分容器。 -
-d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行)。 -
-i:以交互模式运行容器,通常与-t同时使用。 -
-t:为容器重新分配一个伪输入终端,通常与-i同时使用,也即启动交互式容器(前台有伪终端,等待交互)。 -
-p(小写):==指定==容器的端口 -p 8080:8080参数 说明 -p hostPort:containerPort 端口映射 -p 8080:80 -p ip:hostPort:containerPort 配置监听地址 -p 10.0.0.100:8080:80 -p ip::containerPort 随机分配端口 -p 10.0.0.100::80 -p hostPort:containerPort:udp 指定协议 -p 8080:80:tcp -p 81:80 -p 443:443 指定多个 -
-P(大写):==随机==指定端口
docker ps
列出所有运行中的容器
[root@aliyun ~]# docker ps
参数说明
-a:列出当前正在运行的容器+历史运行过的容器-l:显示最近创建的容器。-n:显示最近N个创建的容器-q:静默模式,只显示容器编号。
退出容器
exit:run进去容器,exit退出,容器停止。ctrl+p+q:run进去容器,ctrl+p+q退出,容器不停止。
删除容器
docker rm [容器id]:删除指定的容器,不能删除正在运行中的容器,如果强制删除rm -f- ==一次性删除多个容器实例==:
docker rm -f $(docker ps -a -q)docker ps -a -q | xargs docker rm -f
启动和停止容器操作
- 启动已停止运行的容器:
docker start [容器ID或容器名] - 重启容器:
docker restart [容器ID或容器名] - 停止容器:
docker stop [容器ID或容器名] - 强制停止容器:
docker kill [容器ID或容器名]
重要
有镜像才能创建容器,这是根本前下载一个 Redis 6.0.8 镜像演示)
启动守护式容器(后台服务器)
- 在大部分的场景下,我们希望docker的服务是在后台运行的,我们可以过
-d指定容器的后台运行模式。
docker run -d 容器名
使用镜像centos:latest以后台模式启动一个容器 :
docker run -d centos
问题
然后docker ps -a进行查看,会发现容器己经退出
很重要的要说明的一点:==Docker容器后台运行,就必须有一个前台进程==,容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。
这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如
service nginx start但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀,因为他觉得他没事可做了。
所以,最佳的解决方案是,==将你要运行的程序以前台进程的形式运行==,==常见就是命令行模式,表示我还有交互操作,别中断,O(∩_∩)O哈哈~==
启动方式
- 前台交互式启动:
docker run -it redis:6.0.8 - 后台守护式启动:
docker run -d redis:6.0.8
查看容器日志
docker logs [容器ID]

查看容器内运行的进程
docker top [容器ID]

查看容器内部细节
docker inspect [容器ID]
可以看大好大一段的JSON字符串,其中包含着容器的各种信息

进入正在运行的容器并以命令行交互
- docker exec -it [容器ID] [bashShell]
- docker attach [容器ID]
exec直接执行命令

使用exec 进入容器,使用exit退出,不关闭容器

使用attach进入容器,使用exit退出,容器退出

区别
- attach直接进入容器启动命令的终端,不会启动新的进程。用 exit 退出,会导致容器的停止。
- exec是在容器中打开新的终端,并且可以启动新的进程。用exit退出,不会导致容器的停止。
==推荐大家使用docker exec命令,因为退出容器终端,不会导致容器的停止。==
从容器内拷贝文件到主机上
docker cp 容器ID或容器名称:容器内路径 目的主机路径
测试
在容器内创建一个文件,使用命令将其拷贝出来。

容器的导入和导出
备份做好的镜像
- export 导出容器的内容留作为一个tar归档文件[对应import命令]
- import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
案例
$ docker export 容器ID > 文件名.tar
$ docker import [导出的文件路径] [容器名称]:[TAG]
导入后的容器文件会成为一个镜像,我们可以为它指定新的名称,==如果存在同名镜像,原有的名称会被剥夺,赋给新的镜像,原有的变成了名称和TAG都是<none>的镜像了==。

export和import的应用场景主是要用来制作基础镜像,比如我们从一个ubuntu镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export保存为一个基础镜像。然后把这个镜像分发给其他人使用,比如作为基础的开发环境。
镜像的导入导出
镜像的导入我们通常使用
docker save和docker load命令,save命令将镜像打包成tar文件:
$ docker save img:latest > img.tar
# 或者
$ docker save -o img.tar img:latest
导出镜像尽量使用
镜像名:标签的形式,使用镜像id容易出现导入后镜像名出现<none>的情况。
我们还可以将多个镜像打包到一个文件进行导出:
$ docker save img1:latest img2:latest > img.tar
使用load命令就可以将导出的镜像包加载进来:
$ docker load < img.tar
save和load的应用场景,就是我们上面说的内网部署的情况;同时如果我们的应用还是使用docker compose编排的多个镜像组合,就可以使用save将用到的多个镜像打包,然后拷贝到客户服务器上使用load载入。
