Docker 常用命令

该文章已生成可运行项目,

一、操作镜像


1. 查找镜像


在 Docker Hub 中查找符合名字的镜像(通常需要魔法上网),常规用法:docker search 镜像名,如果想使用更多参数可以通过 docker search --help 查看。

以 nginx 为例,通过 docker search nginx 可以在 Docker Hub 中找到所有名字里包含 nginx 的镜像,查询结果的结构大概为:

  • NAME:镜像名称
  • DESCRIPTION:镜像描述
  • STARS:镜像受欢迎程度
  • OFFICIAL:是否为官方镜像

通过这种方式虽然可以找到镜像,但是不能查找镜像的具体版本,想使用镜像的最新版本通过这种方式查询是可以的,如果想使用指定的镜像版本,还是需要登录 Docker Hub 官网 查看(同样需要魔法上网)。

2. 拉取镜像


从 Docker Hub 中拉取镜像到本地(最好魔法上网,国内镜像仓库都不太好用),常规用法 docker pull 镜像名[:版本号],如果想使用更多参数可以通过 docker pull --help 查看。

如果不指定版本号,默认下载 latest 版本(最新版),以 nginx 为例,通过 docker pull nginx 会下载最新版,指定版本的话为:docker pull nginx:1.29.1

3. 查看本地镜像列表


列出已下载到本地的所有镜像,常规用法 docker images,如果想使用更多参数可以通过 docker images --help 查看。

执行结果的结构大概为:

  • REPOSITORY:镜像名
  • TAG:版本
  • IMAGE ID:镜像ID
  • CREATED:镜像发布时间
  • SIZE:镜像大小

4. 删除本地镜像


常规用法 docker rmi -f 镜像名:版本号,如果想使用更多参数可以通过 docker rmi --help 查看。以 nginx 为例,通过 docker rmi -f nginx:1.29.1 删除。

另外,删除所有镜像的简便写法为 docker rmi -f $(docker images -a -q)

5. 将本地镜像以压缩包形式存储


可以将已经下载好的本地镜像,以压缩包的形式保存到本地磁盘,以便发送给其他人引用。常规用法 docker save -o /存储路径/文件名.tar|zip 镜像名:版本号,如果想使用更多参数可以通过 docker save --help 查看

以 nginx 为例,可以通过 docker save -o /Users/ougaii/dev-tools/nginx.zip nginx:1.29.1 将 nginx 镜像保存到本地。

6. 将压缩包格式的镜像导入到 Docker


常规用法 docker load -i 文件路径,如果想使用更多参数可以通过 docker load --help 查看。

以存储在本地 Users/ougaii/dev-tools/nginx.zip 的文件为例,可以通过 docker load -i /Users/ougaii/dev-tools/nginx.zip 导入

7. 查看镜像的构建层次

镜像是分层的,一个镜像的内部可能引用另一个镜像(一般称为基础镜像),想查看一个镜像的全部层次,可以使用这个命令。常规用法 docker history 镜像ID(前四位即可),如果想使用更多参数可以通过 docker history --help 查看。

以 nginx 为例,假设其镜像ID为 d5f28ef21aab,可以通过 docker history d5f2 查看 nginx 镜像的全部构建层次。执行结果的结构大概为:

  • IMAGE:当前层次的镜像ID
  • CREATED:当前层的镜像的构建时间
  • CREATED BY:构建当前层镜像的 Dockerfile 中的指令
  • SIZE:当前层占用的大小
  • COMMENT:注释

8. 通过容器生成镜像


有的时候通过镜像创建容器后,我们会修改容器中的内容,让容器更满足我们的业务需求。为了实现复用,可以通过修改后的容器生成新的镜像后,我们就可以将这个新的镜像导出成压缩包,或上传到 Docker Hub。

常规用法 docker commit -a 作者名 -m "本层镜像的注释" 容器名或容器ID(容器ID只需要写四位即可) 自定义镜像名:自定义版本号,如果想使用更多参数可以通过 docker commit --help 查看。

假设本地有一个容器,容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker commit -a ougaii -m "change content" fcf3 new-ougaii-nginx:1.0docker commit -a ougaii -m "change content" sweet_shockley new-ougaii-nginx:1.0 都可以生成名字为 new-ougaii-nginx,版本号为 1.0 的新镜像。

二、操作卷(数据外挂到宿主机)


1. 数据卷的作用


数据卷的作用就是把容器内的数据存储到宿主机上(也可以存储在云服务器或远程主机),就算容器被误删除了,数据仍然可以保留,算是一种数据的持久化方案。数据卷和容器的关系是一对多,一个数据卷可以被多个容器共享使用。

当把容器中的路径映射到数据卷时,称为数据卷中的一个挂载点,一个数据卷可以有很多挂载点。数据卷可以看作是宿主机中的一个根目录,每个挂载点就是一个子目录。

2. 创建数据卷


常用命令 docker volume create 自定义数据卷名,如果想使用更多参数可以通过 docker volume create --help 查看。假设创建一个名字为 test 的数据卷,命令为 docker volume create 自定义数据卷名

3. 查看本地数据卷


通过 docker volume ls 可以查看本地的所有数据卷,如果想使用更多参数可以通过 docker volume ls --help 查看。

命令执行后的结果结构大概如下:

  • DRIVER:数据卷的存储方式,通常为 local 代表存储到宿主机
  • VOLUME NAME:数据卷名称

想查看指定数据卷的详细信息,可以通过 docker volume inspect 数据卷名称 查看,如果想使用更多参数可以通过 docker volume inspect --help 查看。

命令执行后的结果是一个JSON格式的字符串,其结构大概如下:

  • CreatedAt:数据卷的创建时间
  • Driver:数据卷的存储方式,如 local 宿主机存储
  • Labels:用户给数据卷设置的标签,可以用来组织、分类数据卷
  • Mountpoint:数据卷在宿主机上的实际存储路径
  • Name:数据卷名称
  • Options:创建数据卷时指定的选项。对于 local 宿主机存储,这个字段通常为空。
  • Scope:指定数据卷作用域范围是单节点Docker,还是集群Docker。

Mountpoint 这个属性要特别强调一下,因为 Docker 的运行需要依赖 Linux,所以当我们在 Windows 或者 Mac 中使用 Docker 时一般会有两种做法:

  • 在系统中安装一个虚拟机,然后在虚拟机中安装 Linux 操作系统,最后在 Linux 操作系统中安装 Docker。
  • 在系统中安装 Docker 官方的 Docker Desktop(本质就是一个帮我们预装好了 Linux 系统和 Docker 的虚拟机)。

因为 Docker 在 Windows 和 Mac 中,并不是直接安装在真实主机中,所以 Mountpoint 显示的数据卷存储路径,并不是我们真实主机中操作系统的存储路径,而是虚拟机中操作系统的路径。

4. 删除数据卷


常规用法 docker volume rm 数据卷名,如果想使用更多参数可以通过 docker volume rm --help 查看。

假设本地有数据卷名为 test,可以使用 docker volume rm test 删除数据卷。

三、操作网络


1. 网络的作用


在同一个 Docker 中,两个容器是不能直接访问的。假设 容器1 的内部想访问 容器2,我们需要在容器1 中通过 宿主机的IP:容器2的暴露端口 的方式才能访问,很麻烦,也很绕,而且 宿主机IP 还可能会变。

通常这种同一 Docker 中,容器互相访问的情况,我们都会创建一个网络,然后将两个容器加入到同一网络,这样同一网络中的容器可以直接通过 容器名:容器暴露端口 的方式访问,既方便,也不怕 宿主机IP 变化。

2. 创建网络


常用命令 docker network create 网络名,如果想使用更多参数可以通过 docker network create --help 查看。

假设创建一个名字为 test 的网络,命令为 docker network create test

3. 查看已有网络


列出当前 Docker 中的全部网络,常用命令 docker network ls,如果想使用更多参数可以通过 docker network ls --help 查看。

命令执行后的结果结构大概为:

  • NETWORK ID:网络ID
  • NAME:网络名
  • DRIVER:网络的实现方式。默认是 bridge(桥接)
  • SCOPE:指定网络的作用域范围是单节点Docker,还是集群Docker。

如果想查看指定网络的详细信息,比如网络中的容器等,可以通过 docker network inspect 网络名 的方式,如果想使用更多参数可以通过 docker network inspect --help 查看。

假设查看名字为 test 的网络,命令为 docker network inspect test

4. 将容器添加到网络


常用命令 docker network connect 网络名 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker network connect --help 查看。

假设想把一个容器ID为 fcf3650f5c4f 的容器加入到名为 test 的网络,可以通过 docker network connect test fcf3 实现。

5. 将容器移出网络


常用命令 docker network disconnect 网络名 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker network disconnect --help 查看。

假设想把一个容器ID为 fcf3650f5c4f 的容器从名为 test 的网络中移除,可以通过 docker network disconnect test fcf3 实现。

6. 删除网络


常用命令 docker network rm 网络名,如果想使用更多参数可以通过 docker network rm --help 查看。

假设想删除名为 test 的网络,可以通过 docker network rm test 实现。

四、操作容器


1. 查看本地已有容器


查看正在运行的容器:docker ps,查看全部容器 docker ps -a,如果想使用更多参数可以通过 docker ps --help 查看。

执行结果的结构大概为:

  • CONTAINER ID:容器ID
  • IMAGE:创建容器的镜像,格式为:镜像名:版本号
  • COMMAND:容器启动时要执行的命令,对应制作 Dockerfile 镜像文件时的 CMD 和 ENTRYPOINT
  • CREATED:容器创建时间
  • STATUS:容器当前状态是运行中还是停止
  • PORTS:和宿主机的端口映射
  • NAMES:容器名字

2. 创建容器


通过本地已有镜像创建容器,常规用法 docker create --name 自定义容器名 --network 要加入的网络名 -p 宿主机端口:对应的容器内端口 -v 数据挂载信息 镜像名:版本号,如果想使用更多参数可以通过 docker create --help 查看。

常规用法中的参数,除了 《镜像名: 版本号》 是必须的,其他都是按需添加,参数含义如下:

  • name:给创建的容器起个名字,不加该参数时,默认是一个随机名
  • network:指定这个容器需要加入的网络,不加该参数时,会加入一个默认的桥接网络中,但是这个网络中,容器间不能直接访问。
  • p:宿主机端口和容器端口的对应关系,格式为 宿主机端口:容器端口,当使用桥接模式网络时(bridge),容器会有自己的一套IP体系,且容器的IP不能直接被外部访问,外部只能访问宿主机的IP,然后通过端口映射关系把请求转发到容器内部对应端口的应用上。当使用主机网络模式时(host),容器会沿用主机的IP,所以主机网络模式时不需要这个参数。
  • v:把容器内的数据保存到宿主机中,参数值有两种格式,并分别对应两种叫法和两种原理,所以使用时要注意,以免数据丢失:
    • 数据挂载: 格式为 宿主机中的路径:容器内的路径,这种方式是以宿主机中的内容作为初始数据来源(启动容器时,会直接覆盖容器中的内容),启动后宿主机中的数据和容器内的数据是双向同步的。
    • 卷映射:数据卷名:容器内的路径,这种方式还要区分数据卷内的挂载点是否为空,当挂载点为空时,以容器中的内容作为初始数据来源(启动容器时,会把内容直接写到数据卷的挂载点中),如果挂载点不是空,以数据卷中挂载点的内容作为初始数据来源(启动容器时,会把数据卷中挂载点的数据写到容器中)。但不论是哪种,启动后数据卷中挂载点的数据和容器内的数据是双向同步的。
  • e:这个参数我在常规用法中没有罗列出来,这个参数用来给容器传递环境变量,有些镜像创建出来的容器,需要传入一些环境变量,这个时候就可以用这个参数传递。格式为 -e 环境变量名=环境变量值,比如用 MySQL的镜像创建容器时,就必须指定 MYSQL_ROOT_PASSWORD 环境变量来设置初始密码,这个时候就可以通过 -e MYSQL_ROOT_PASSWORD=123456 来传递。

假设现在要根据 nginx:1.29.1 镜像来创建一个容器,要求这个容器名为 ougaii-nginx、容器要加入到名为 ougaii-net 的网络、容器中的路径 /usr/share/nginx/html 要挂载到名为 ougaii-data 的数据卷中、访问宿主机的80端口时,要转发到容器中的80端口上,我们就可以通过 docker create --name ougaii-nginx --network ougaii-net -p 80:80 -v ougaii-data:/usr/share/nginx/html nginx:1.29.1 实现。

3. 启动容器


启动本地已经存在的容器,常规用法 docker start 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker start --help 查看。

以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker start fcf3 docker start sweet_shockley 都可以启动容器。

4. 停止容器

关闭正在运行的容器,常规用法 docker stop 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker stop --help 查看。

以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker stop fcf3 docker stop sweet_shockley 都可以关闭容器。

5. 重启容器

不管是正在运行的容器,还是已经停止的容器,都可以通过重启容器来再次运行,常规用法 docker restart 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker restart --help 查看。

以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker restart fcf3 docker restart sweet_shockley 都可以重启容器。

6. 查看容器对于宿主机的资源使用情况


查看容器对于宿主机的资源使用情况,常规用法 docker stats 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker stats --help 查看。

以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker stats fcf3 docker stats sweet_shockley 都可以查看容器对于宿主机资源的使用情况,如果命令中不指定容器名或容器ID,则会查看所有正在运行的容器。

执行结果的结构大概为:

  • CONTAINER ID:容器 ID
  • NAME:容器名
  • CPU %:容器进程占用的宿主机 CPU 百分比
  • MEM USAGE / LIMIT:当前容器的内存使用量以及容器的内存限制
  • MEM %:容器在宿主机物理内存中的实际占用百分比
  • NET I/O:容器网络接口在宿主机上的流量(显示的是从容器启动后的累积数据),I:接收的流量,O:输出的流量。
  • BLOCK I/O:容器文件系统对宿主机磁盘的读写(显示的是从容器启动后的累积数据),I:读入的大小,O:输出的大小。
  • PIDS:容器内运行的进程数量

7. 查看容器的日志


查看容器中主进程的日志,简单说就是打印容器内部控制台中的信息。假设容器中运行的是一个 Java 程序,则会打印出所有输出到容器控制台的信息。常规用法 docker logs 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker logs --help 查看。

以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker logs fcf3 docker logs sweet_shockley 都可以查看容器日志。


8. 删除容器


删除本地容器,常规用法 docker rm -f 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker rm --help 查看。

以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker rm -f fcf3 docker rm -f sweet_shockley 都可以删除容器。

9. 进入容器内部


进入正在运行的容器内部,然后像访问 Linux 系统一样,访问容器。常规用法 docker exec -it 容器名或容器ID(容器ID只需要写四位即可) 命令行解释器,如果想使用更多参数可以通过 docker exec --help 查看。

命令参数中的 《命令行解释器》 比较复杂,因为这个是需要根据基础镜像来决定的,可以通过上面介绍的 docker history 命令分析出镜像中基础镜像使用的系统类型,然后通过系统类型来决定 《命令行解释器》的具体值。 《命令行解释器》和操作系统的对应关系如下:

  • /bin/bash:Ubuntu、Debian、CentOS、RHEL
  • /bin/sh:Alpine Linux

其实可以通过对应关系看到,常见的《命令行解释器》基本上就这两种,所以可以直接依次尝试一下,这样可以避免使用 docker history 命令分析基础镜像。

以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker exec -it fcf3 /bin/bashdocker exec -it sweet_shockley /bin/bash 都可以进入到容器内部。

10. docker run 命令


docker run 是一个基于 docker pull + docker create + docker start 的复合命令,当执行 docker run 时,如果镜像不存在就去 Hub 下载,然后根据镜像创建容器,最后启动容器。常规用法为 docker run -d --name 自定义容器名 --network 要加入的网络名 -p 宿主机端口:对应的容器内端口 -v 数据挂载信息 镜像名:版本号,如果想使用更多参数可以通过 docker run --help

常规用法中罗列出来的参数,基本和前文中 docker create 记载的一样,可以参考前文中对 docker create 的记载。

和前文 docker create 部分相比,唯一多出来的参数就是 -d,作用是让容器在后台启动。当我们用 docker start 启动容器时,容器默认就是后台启动,但是当使用 docker run 启动容器时,它会在前台启动,并阻塞命令行。

假设想下载 nginx:1.29.1 镜像,并创建和启动容器,要求这个容器后台启动,容器名为 ougaii-nginx、容器要加入到名为 ougaii-net 的网络、容器中的路径 /usr/share/nginx/html 要挂载到名为 ougaii-data 的数据卷中、访问宿主机的80端口时,要转发到容器中的80端口上,我们就可以通过 docker run -d --name ougaii-nginx --network ougaii-net -p 80:80 -v ougaii-data:/usr/share/nginx/html nginx:1.29.1 实现。

这个命令每执行一次,就会创建一次容器,所以当容器停止后,最好用 docker start 或 docker restart 再次启动,这个命令只适合第一次构建时使用(拉取、创建、启动容器),第一次构建时,可以通过这个复合命令来简化我们的工作。

三、将镜像推送到 Hub 仓库


将自己的镜像推送到 Docker Hub 官网 (需要魔法上网)。

先使用 docker login -u Docker账号 在命令行中登录 Docker,然后再使用 docker push 镜像名 将本地镜像推送到 Docker Hub。一定要注意,命令中的 《镜像名》部分,必须满足格式 Dokcer用户名/镜像名:版本号

假设我在 Docker 官网的用户名是 ougaii,那么我要推送的镜像名必须以 ougaii/ 开头,现在我自定义了一个镜像,名字为 ougaii/new-ougaii-nginx,版本是 3.0,这时的推送命令就是 docker push ougaii/new-ougaii-nginx:3.0,推送后,就可以在自己的 Docker Hub 中 Repositories 里看见这个镜像了, 然后其他人就可以下载了。

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值