Docker入门:常用命令汇总(备忘),并理解记忆
一、帮助启动类命令
1. 启动docker
systemctl start docker
2. 停止docker
systemctl stop docker
3. 重启docker
systemctl restart docker
4. 查看docker状态
systemctl status docker
5. 开机启动
systemctl enable docker
6. 查看docker概要信息
docker info
7. 查看docker总体帮助文档
docker --help
8. 查看docker命令帮助文档
docker 具体命令 --help
二、镜像命令
2.1 docker images
功能:列出主机上的镜像。
上图红框中内容的具体参数含义如下所示:
(1)REPOSITORY:表示镜像的仓库源;
(2)TAG:镜像的标签;
(3)IMAGE ID:镜像ID;
(4)CREATED:镜像创建时间;
(5)SIZE:镜像大小。
注意:
(1)同一个仓库源可以有多个TAG版本,代表这个仓库源的不同版本,比如,我们使用REPOSITORY:TAG来表示不同的镜像。
(2)如果不制定一个镜像的版本标签,比如只使用docker、ubuntu,则会默认的使用最新的版本。
另外,该命令可以设置选项参数,常用的如下所示:
(1)docker -a images
:列出本地所有的镜像(含历史影像层);
(2)docker -q images
:只显示镜像ID。
2.2 docker search 某个镜像
docker search docker_name
该命令是查找某个镜像是否存在于docker hub远程仓库中,如下图所示以hello-world
为例:
上图红框中参数的含义如下所示:
(1)NAME:镜像名称;
(2)DESCRIPTION:镜像描述;
(3)STARS:点赞数量;
(4)OFFICIAL:是否是官方仓库;
(5)AUTOMATED:是否是自动构建的。
常用的选项为--limit n
:之罗列出n个镜像,默认25个。通常情况下,我们只根据排名罗列出前五个足够了。以redis
为例,输入指令docker search --limit 5 redis
:
2.3 docker rmi 某个镜像
删除某个docker镜像,假设我们要删除redis
本地镜像,输入docker rmi redis
,可以看出本来本地是存在redis镜像的,执行该指令后,就不存在了。
注意:
(1)我们不仅可以使用镜像名称删除,还可以使用镜像ID进行镜像删除。
(2)有时候使用docker rmi redis
出现下图所示的情况,表示该镜像某些文件还被调用,这时候我们可以添加-f
选项进行强制删除:docker rmi -f redis
。
如果想强制删除所有本地docker镜像,输入命令docker rmi -f $(docker images -qa)
。然后再使用命令docker images
查看本地docker镜像已经为空了:
2.4 docker pull 某个镜像
docker pull docker_name[:TAG]
该命令是下载docker hub远程仓库中某个镜像:
(1)docker pull docker_name
表示下载最新版本,也就是说下载镜像的TAG
为latest;
(2)docker pull docker_name[:TAG]
下载指定TAG
版本的镜像。
为了直观地给出该指令的示例,我们首先强制删除所有本地docker镜像,输入命令docker rmi -f $(docker images -qa)
。然后,输入指令docker pull hello-world
从docker hub上下载最新版本的hello-world镜像:
输入指令docker pull ubuntu:16.04
就能从docker hub上下载指定版本16.04的ubuntu:
再输入docker images
命令就可以查看本地是否存在镜像hello-world了,下载成功:
2.5 docker system df
该指令用于查看某个镜像/容器/数据卷所占的空间信息:
三、容器命令
有了镜像才能创建容器,这是我们创建容器的根本前提。
3.1 新建并启动一个容器
docker可以使用run
根据镜像来创建具有指定特性的容器:
docker run [option] IMAGE [COMMAND][ARG...]
其实,我们完全可以在终端输入docker run --help
,查看该指令的详细信息。
-i
:以交互模式运行容器,通常与下面的-t
配合使用;-t
:为容器重新分配一个伪输入终端;-it
:启动交互式容器(前台有伪终端,等待交互);
我们输入命令docker images
,可以看出本地有一个ubuntu16.04的ubuntu镜像。
需要注意的是:上面都是在ubuntu20.04系统上运行的,所以指令前面显示的是liang@liang
,即计算机liang
上面的用户liang
在操作。如果我们使用docker run -it ubunt:16.04 /bin/bash
后,计算机名和用户名就变成了root@0ff79c4b31d3
,需要留意的是@
后面的这串数字0ff79c4b31d3
就是是我们后面对该容器进行操作的容器ID,这个容器ID是系统随即定义的。在终端我们就可以使用一些Linux命令交互式地操作这个docker容器了。
另外,如果想从ubuntu16.04容器中退出,可以在终端输入exit
,这样我们就退出到liang@liang的系统中了。
--name=容器的新名字
:为容器指定一个名称;
为了说明--name
这个选项的具体含义,我们首先应用上面的指令docker run -it ubunt:16.04 /bin/bash
创建两个容器。使用指令docker ps -a
显示系统中创建的docker容器,如下图所示有两个容器。
这两个容器的NAMES
如上图红框中所示,他们是在创建的时候随即起的。如果我们想创建指定名字liang_new
的容器,就需要使用--name=容器的新名字
,在终端输入指令:
docker run -it --name='liang_new' ubunt:16.04 /bin/bash
这个时候,就在docker容器列表中生成一个名为liang_new
的容器:
3.2 列出容器列表
docker ps [Option]
对于Option
选项,的具体含义,我们可以使用docker ps --help
查看,这里只罗列常用的几个选项命令:
- (1)不加选项,直接输入
docker ps
,则只显示启动的容器。如下图所示,只有liang_new
容器启动(STATUS
参数为Up
):
这个时候,如果输入docker ps
,则只会显示容器liang_new
:
- (2)
-a
:列出当前所有正在运行的容器和历史上运行过的docker容器信息:
输入docker ps -a
:
- (3)
-l
:显示最近创建的容器:
输入docker ps -l
,则从所有创建的docker容器中显示最新创建的一个:
- (4)
-n
:显示最近n个创建的容器:
输入docker ps -n 2
,则根据时间的先后,显示最新创建的两个docker容器:
- (5)
-q
:静默模式,只显示容器ID:
输入docker ps -aq
则只显示创建的docker容器ID:
需要注意的是,-q
需要与-a
配合使用,不然不会输出结果。
3.3 容器的常规操作
1、退出容器:
- (1)
exit
:用该指令退出容器,容器会自动停止:
如下图所示,使用exit
命令退出容器liang_new
后,使用docker ps -a
列出所有镜像,容器liang_new
的状态就变成了Exited (0) 7 seconds ago
,表示已经关闭了容器。
- (2)
ctrl+p+q
:用该指令退出容器,容器不会停止。
如下图所示,使用该命令退出容器liang_new
,使用命令docker ps -a
显示所有容器,容器liang_new
的状态为Up
,说明使用ctrl+p+q
命令退出容器,并不会停止容器。
注意在按住
ctrl
命令后,要先按p
,然后再按q
,才能退出。
2、启动已停止运行的容器:
容器处于停止运行时,其STATUS
标志为Exited (0) 多长时间之前
:
通过启动容器命令:
docker start 容器ID或容器NAME
可以启动已经停止的容器,比如输入:
docker start liang_new
则容器liang_new
的STATUS
由原来的Exited (0)
变为Up 3 seconds
,则表示该容器已被启动。
3、进入容器:
docker attach 容器ID或容器名
该命令是进入容器终端,比如下图
4、重启容器:
docker restart 容器ID或容器名
5、停止容器:
docker stop 容器ID或容器名
6、强制停止容器:
docker kill 容器ID或容器名
7、删除已停止的容器:
docker rm 容器ID或容器名
注意,上面这个命令是删除停止的容器,如果我们删除正在运行的容器,则会出现下面的错误,表示不能删除:
错误提示指出,我们可以通过两个方式删除运行的容器:
- (1)首先停止容器(使用命令
docker stop 容器ID或者名字
),然后在执行docker rm liang_new
。 - (2)也可以使用带选项
-f
的删除容器命令docker rm -f liang_new
。
8、一次性删除多个容器:
删除所有容器:docker rm -f $(docker ps -a -q)
或docker ps -a -q | xargs docker rm
3.4 容器的实际操作的一些重要概念及指令
3.4.1 Docker后台运行模式(守护式运行模式)
通常在Docker容器的实际应用中,我们通常希望docker的服务是在后台运行的,我们可以使用-d
指定容器的后台运行模式:
docker run -d --name='自定义的docker容器名' docker镜像
下面以加载redis6.0.8镜像为后台容器为例,代码为:
docker run -d --name='my-redis' redis:6.0.8
运行后,就创建了一个后台docker容器my-redis
。
3.4.2 监控Docker后台日志
docker logs 容器ID或者容器名字
比如监控上面创建的后台运行的容器my-redis
,输入如下的指令:
docker logs my-redis
3.4.3 查看容器内运行的进程
docker top 容器ID或容器名
3.4.4 查看容器内部细节
docker inspect 容器ID或容器名
这个命令在docker高级应用中经常被用到。
3.4.5 进入正在运行的容器并以命令行交互
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入(实际应用中推荐第二种):
- (1)docker attach
以正在运行的容器my-redis
为例,使用下面的命令进入,由下图可以看出在退出容器的时候,容器由原来的运行状态转变为关闭状态。
docker attach my-redis
- (2)docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。以正在运行的
my-redis
后台容器为例子,输入如下指令以交互式进入容器:
docker exec -it my-redis /bin/bash
如下图所示进入容器后,输入exit
命令,退出容器后,使用docker ps
查看容器状态,容器还是处于启动状态。
3.4.6 从容器内拷贝文件到主机上
指令格式:
docker cp 容器ID或容器名:容器内路径 目的主机路径
这个指令对于我这种初学者,有很多坑需要踩,这里先给出指令格式,具体的应用后续深入学习。其实,下面的导入导出容器更加适合于docker容器的备份与保存。
3.4.7 导入导出容器
1、导出容器:如果要导出本地某个容器,可以使用命令:
docker export 容器ID或者容器名 > 自定义名字.tar
export
导出容器的内容留作为一个.tar
归档文件,默认存储在当前目录下,也可以指定存储目录。下面的例子将容器ubuntu-new
导出到本地的/home/tmp
(需要建立文件夹)下,并且需要输入sudo chmod -R 777 tmp/
命令修改该文件夹的权限。导出ubuntu容器到本地目录/home/tmp
下的代码为:
docker export ubuntu-new > /home/tmp/ubuntu-new.tar
这样就将容器ubuntu-new
导出到本地的/home/tmp
文件夹下了。
解压后,就是一个ubuntu系统:
2、导入容器快照:
cat 文件名.tar | docker import - 镜像用户(自定义)/镜像名(自定义):镜像版本号(自定义)
下面以上面导出的ubuntu-new.tar
为容器快照导入docker中。首先使用命令docker rm -f $(docker ps -a -q)
删除docker中的所有容器,这样容器中就没有容器了。下面使用下面命令导入ubuntu-new.tar
为容器快照:
cat /home/tmp/ubuntu-new.tar | docker import - liang/ubuntu-new:1.0
由上图可以看出,导入的并不是docker容器,而是docker镜像。
附录A:从面向对象、镜像容器角度理解Docker
1、从对象角度理解Docker
容器就是镜像创建的运行实例。容器为镜像提供了一个标准化的隔离运行环境,我们可以随意启动、开始、停止、删除每个容器,而不影响其他容器的运行。Docker利用容器独立运行多个应用,应用服务运行在容器内部,因此容器就像一个虚拟运行环境一样。
2、从镜像角度理解Docker
如果我们已经能够熟练应用Docker的常用命令后,我们就可以深刻理解到容器其实就是一个简易版的Linux系统,它包括:root用户权限、进行空间、用户空间和网络空间等,以及运行在容器上的应用程序等。这也就是为什么在学习Docker之前,一定要学习Linux系统的原因。