帮助启动类命令

  • 启动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 [OPTIONS] [镜像名字]

[root@aliyun /]# docker search mysql

image-20220703221446284

列名说明

列名 含义
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

image-20220703222157704

没什么用,建议删除,Docker构建时出现问题可能会产生。

容器命令

有镜像才能创建容器,这是根本前提(下载一个CentoS或者ubuntu镜像演示)

[root@aliyun ~]# docker pull ubuntu

docker run

新建容器并启动:docker run [OPTIONS] ==IMAGE== [COMMAND] [ARG…]

#测试,启动并进入容器
[root@aliyun ~]# docker run -it ubuntu /bin/bash

image-20220703223418860

参数说明

  • --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]

image-20220704122741440

查看容器内运行的进程

docker top [容器ID]

image-20220704122843730

查看容器内部细节

docker inspect [容器ID]

可以看大好大一段的JSON字符串,其中包含着容器的各种信息

image-20220704123000072

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

  • docker exec -it [容器ID] [bashShell]
  • docker attach [容器ID]

exec直接执行命令

image-20220704123514203

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

image-20220704123653945

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

image-20220704124106719

区别

  • attach直接进入容器启动命令的终端,不会启动新的进程。用 exit 退出,会导致容器的停止。
  • exec是在容器中打开新的终端,并且可以启动新的进程。用exit退出,不会导致容器的停止。

==推荐大家使用docker exec命令,因为退出容器终端,不会导致容器的停止。==

从容器内拷贝文件到主机上

docker cp 容器ID或容器名称:容器内路径 目的主机路径

测试

在容器内创建一个文件,使用命令将其拷贝出来。

image-20220704143903557

容器的导入和导出

备份做好的镜像

  • export 导出容器的内容留作为一个tar归档文件[对应import命令]
  • import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]

案例

$ docker export 容器ID > 文件名.tar
$ docker import [导出的文件路径] [容器名称]:[TAG]

导入后的容器文件会成为一个镜像,我们可以为它指定新的名称,==如果存在同名镜像,原有的名称会被剥夺,赋给新的镜像,原有的变成了名称和TAG都是<none>的镜像了==。

image-20220704150031173

export和import的应用场景主是要用来制作基础镜像,比如我们从一个ubuntu镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export保存为一个基础镜像。然后把这个镜像分发给其他人使用,比如作为基础的开发环境。

镜像的导入导出

镜像的导入我们通常使用docker savedocker 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载入。

696874-c330864ff76722d8