Rubin's Blog

  • 首页
  • 关于作者
  • 隐私政策
享受恬静与美好~~~
分享生活的点点滴滴~~~
  1. 首页
  2. Docker
  3. 正文

Docker之常用命令

2021年 12月 28日 665点热度 0人点赞 0条评论

Docker命令分类

Docker命令分类如下:

  • Docker环境信息 — docker [info|version]
  • 容器生命周期管理 — docker [create|exec|run|start|stop|restart|kill|rm|pause|unpause]
  • 容器操作管理 — docker [ps|inspect|top|attach|wait|export|port|rename|stat]
  • 容器rootfs命令 — docker [commit|cp|diff]
  • 镜像仓库 — docker [login|pull|push|search]
  • 本地镜像管理 — docker [build|images|rmi|tag|save|import|load]
  • 容器资源管理 — docker [volume|network]
  • 系统日志信息 — docker [events|history|logs]

官网地址:https://docs.docker.com/engine/reference/run/。

从Docker命令使用出发,梳理出如下命令结构图:

Docker镜像常用命令

Docker Hub地址

Docker Hub类似Maven远程仓库地址:https://hub.docker.com/。

作为一名研发人员,则可以将镜像理解为类(Class),是一个应用程序。

首先需要先从镜像仓库服务中拉取镜像。常见的镜像仓库服务是Docker Hub,但是也存在其他镜像仓库服务。

拉取操作会将镜像下载到本地Docker主机,可以使用该镜像启动一个或者多个容器。

镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。

因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。

镜像就像停止运行的容器(类)。实际上,可以停止某个容器的运行,并从中创建新的镜像。

在该前提下,镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(run-time)结构,如下图所示:

pull命令

  • 下载镜像的命令。镜像从远程镜像仓库服务的仓库中下载。默认情况下,镜像会从Docker Hub的仓库中拉取
  • 通过下载过程,可以看到,一个镜像一般是由多个层组成,类似f7e2b70d04ae这样的串表示层的唯一ID

问题一:小伙伴们可能会想到,如果多个不同的镜像中,同时包含了同一个层,这样重复下载,岂不是导致了存储空间的浪费么?

实际上,Docker并不会这么傻会去下载重复的层,Docker在下载之前,会去检测本地是否会有同样ID的层,如果本地已经存在了,就直接使用本地的就好了。

问题二:另一个问题,不同仓库中,可能也会存在镜像重名的情况发生,这种情况咋办?

从严格意义上讲,我们在使用pull命令时,还需要在镜像前面指定仓库地址(Registry),如果不指定,则Docker会使用您默认配置的仓库地址。例如上面,由于我配置的是国内docker.io的仓库地址,我在pull的时候,Docker会默认为我加上docker.io/library的前缀。

例如:当我执行docker pull tomcat:9.0.20-jre8命令时,实际上相当于docker pull docker.io/tomcat:9.0.20-jre8,如果您未自定义配置仓库,则默认在下载的时候,会在镜像前面加上Docker Hub的地址。Docker通过前缀地址的不同,来保证不同仓库中,重名镜像的唯一性。

实际上完整的ID包括了256个 bit,64 个十六进制字符组成的。

https://hub.docker.com/_/tomcat
docker pull tomcat:9.0.20-jre8
docker pull tomcat:9.0.20-jre8-slim
docker pull tomcat:9.0.20-jre8-alpine

https://hub.docker.com/_/centos
docker pull centos:7.8.2003

https://hub.docker.com/_/ubuntu
docker pull ubuntu:20.04

https://hub.docker.com/_/debian
docker pull debian:10.6
docker pull debian:10.6-slim

https://hub.docker.com/_/alpine
docker pull alpine:3.12.1

常用参数

  • -a, --all-tags=true|false:是否获取仓库中所有镜像,默认为否
  • --disable-content-trust:跳过镜像内容的校验,默认为true

images命令

通过使用如下两个命令,列出本机已有的镜像:

docker images
docker image ls

各个选项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

save命令

一个镜像

mkdir -p /data
cd /data

docker save tomcat:9.0.20-jre8-alpine -o tomcat9.tar
docker save tomcat:9.0.20-jre8-slim > tomcat9.slim.tar

常用参数

  • -o:输出到的文件

多个镜像

mkdir -p /data
cd /data

docker save \
ubuntu:20.04 \
alpine:3.12.1 \
debian:10.6-slim \
centos:7.8.2003 \
-o linux.tar

docker save \
tomcat:9.0.20-jre8-alpine \
tomcat:9.0.20-jre8-slim \
tomcat:9.0.20-jre8 \
-o tomcat9.0.20.tar

load命令

mkdir -p /data
cd /data

docker load -i linux.tar
docker load < tomcat9.0.20.tar

常用参数

  • --input , -i:指定导入的文件
  • --quiet , -q:精简输出信息

search命令

不推荐使用search命令查找镜像,不够直观。

docker search tomcat

常用参数

  • -f, --filter filter:过滤输出的内容
  • --limit int:指定搜索内容展示个数
  • --no-index:不截断输出内容
  • --no-trunc:不截断输出内容

inspect命令

  • 通过docker inspect命令,我们可以获取镜像的详细信息。其中,包括创建者,各层的数字摘要等
  • docker inspect返回的是JSON格式的信息,如果您想获取其中指定的一项内容,可以通过-f来指定,如获取镜像大小
docker inspect tomcat:9.0.20-jre8-alpine
docker inspect -f {{".Size"}} tomcat:9.0.20-jre8-alpine

history命令

从前面的命令中,我们了解到,一个镜像是由多个层组成的,那么,我们要如何知道各个层的具体内容呢?

通过docker history命令,可以列出各个层的创建信息。例如:查看tomcat:9.0.20-jre8-alpine的各层信息:

docker history tomcat:9.0.20-jre8-alpine

tag命令

标记本地镜像,将其归入某一仓库。

docker tag tomcat:9.0.20-jre8-alpine rubin/tomcat:9

rmi命令

通过如下两个都可以删除镜像:

docker rmi tomcat:9.0.20-jre8-alpine
docker image rm tomcat:9.0.20-jre8-alpine

常用参数

  • -f, -force:强制删除镜像,即便有容器引用该镜像
  • -no-prune:不要删除未带标签的父镜像

通过ID删除镜像

除了通过标签名称来删除镜像,我们还可以通过制定镜像ID,来删除镜像。一旦制定了通过ID来删除镜像,它会先尝试删除所有指向该镜像的标签,然后在删除镜像本身。

docker rmi ee7cbd482336
  • 推荐通过image的名称删除镜像
  • image的ID在终端长度未完全显示,ID值会出现重复

删除镜像的限制

删除镜像很简单,但也不是我们何时何地都能删除的,它存在一些限制条件。当通过该镜像创建的容器未被销毁时,镜像是无法被删除的。

docker run -itd --name tomcat9 tomcat:9.0.20-jre8-alpine

可以看到提示信息,无法删除该镜像,因为有容器正在引用他!同时,这段信息还告诉我们,除非通过添加 -f 子命令,也就是强制删除,才能移除掉该镜像!

但是,我们一般不推荐这样暴力的做法,正确的做法应该是:

  1. 先删除引用这个镜像的容器
  2. 再删除这个镜像

清理镜像

我们在使用Docker一段时间后,系统一般都会残存一些临时的、没有被使用的镜像文件,可以通过以下命令进行清理。执行完命令后,还会告诉我们释放了多少存储空间!

docker image prune

常用参数

  • -a, --all:删除所有没有用的镜像,而不仅仅是临时文件
  • -f, --force:强制删除镜像文件,无需弹出提示确认

Docker容器常用命令

Docker容器(container)

容器是镜像的运行时实例。正如从虚拟机模板上启动 VM 一样,用户也同样可以从单个镜像上启动一个或多个容器。虚拟机和容器最大的区别是容器更快并且更轻量级——与虚拟机运行在完整的操作系统之上相比,容器会共享其所在主机的操作系统/内核。下图为使用单个Docker镜像启动多个容器的示意图。

Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是镜像的一个运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。

容器是基于镜像启动起来的,容器中可以运行一个或多个进程。镜像是Docker生命周期中的构建或打包阶段,而容器则是启动或执行阶段。镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。

新建并启动容器

语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

运行容器

docker run -it --rm -p 8080:8080 tomcat:9.0.20-jre8-alpine

常用参数

docker run命令常用参数比较多,这里仅仅列出开发岗常用参数,请小伙伴们自行查找资料获得更多参数信息:

  • -d, --detach=false:后台运行容器,并返回容器ID
  • -i, --interactive=false:以交互模式运行容器,通常与-t同时使用
  • -P, --publish-all=false:随机端口映射,容器内部端口随机映射到主机的端口。不推荐各位小伙伴使用该参数
  • -p, --publish=[]:指定端口映射,格式为:主机(宿主)端口:容器端口,推荐各位小伙伴们使用
  • -t, --tty=false:为容器重新分配一个伪输入终端,通常与-i同时使用
  • --name="nginx-lb":为容器指定一个名称
  • -h , --hostname="rubin":指定容器的hostname
  • -e , --env=[]:设置环境变量,容器中可以使用该环境变量
  • --net="bridge":指定容器的网络连接类型,支持bridge、host、none、container四种类型
  • --link=[]:添加链接到另一个容器。不推荐各位小伙伴使用该参数
  • -v, --volume:绑定一个卷
  • --privileged=false:指定容器是否为特权容器,特权容器拥有所有的capabilities
  • --restart=no:指定容器停止后的重启策略。no:容器退出时不重启;on-failure:容器故障退出(返回值非零)时重启;always:容器退出时总是重启(推荐各位小伙伴们使用)
  • --rm=false:指定容器停止后自动删除容器,不能以docker run -d启动的容器

容器日志

语法

docker logs [OPTIONS] CONTAINER

执行命令

docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine
docker logs -f tomcat9

常用参数

  • -f:跟踪日志输出
  • --tail:仅列出最新N条容器日志

删除容器

语法

docker rm [OPTIONS] CONTAINER [CONTAINER...]

执行命令

docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine

需要先停止运行中的容器再删除,否则无法删除容器
docker stop tomcat9

按照容器名称删除
docker rm tomcat9

按照容器ID删除
docker rm 8dd95a95e687

常用参数

  • -f:通过SIGKILL信号强制删除一个运行中的容器
  • -l:移除容器间的网络连接,而非容器本身
  • -v:删除与容器关联的卷

列出容器

语法

docker ps [OPTIONS]

执行命令

docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine

查看运行中的容器
docker ps tomcat9

查看所有容器
docker ps -a tomcat9

输出详情介绍:

  • CONTAINER ID:容器 ID
  • IMAGE:使用的镜像
  • COMMAND:启动容器时运行的命令
  • CREATED:容器的创建时间
  • STATUS:容器状态
  • PORTS:容器的端口信息和使用的连接类型(tcp\udp)
  • NAMES:自动分配的容器名称

状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

常用参数

  • -a:显示所有的容器,包括未运行的
  • -q:只显示容器编号

实用技巧

停止所有运行容器
docker stop $(docker ps -qa)

删除所有的容器
docker rm $(docker ps -aq)
docker rm $(docker stop $(docker ps -q))

删除所有的镜像
docker rmi $(docker images -q)

创建容器

语法

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

执行命令

docker create -it --name tomcat9 -p 8080:8080 9.0.20-jre8-alpine

常用参数

大部分参数用法与docker run命令参数相同。

启动、重启、终止容器

语法

docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker restart [OPTIONS] CONTAINER [CONTAINER...]

执行命令

docker start tomcat9
docker stop tomcat9
docker restart tomcat9

进入容器

语法

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

执行命令

有bash命令的linux系统:例如centos
docker run -it --name tomcat9.1 -p 8080:8080 tomcat:9.0.20-jre8-slim
docker exec -it tomcat9.1 /bin/bash

没有bash命令的linux系统:例如alpine系统
docker run -it --name tomcat9.2 -p 8081:8080 tomcat:9.0.20-jre8-alpine
docker exec -it tomcat9.2 sh

常用参数

  • -i:即使没有附加也保持STDIN打开
  • -t:分配一个伪终端

查看容器

语法

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

执行命令

docker run -it --name tomcat9 -p 8081:8080 tomcat:9.0.20-jre8-alpine
docker inspect tomcat9

常用参数

  • -f:指定返回值的模板文件
  • -s:显示总的文件大小
  • --type:为指定类型返回JSON

更新容器

语法

docker update [OPTIONS] CONTAINER [CONTAINER...]

执行命令

docker run -it --name tomcat9 -p 8081:8080 tomcat:9.0.20-jre8-alpine

更新容器restart策略
docker update --restart always tomcat9

注意:该命令可以动态地更新容器配置。可以更新一个或多个容器配置。多个容器名称或ID之间使用空格分隔。但update命令不是很成熟,有很多配置项不能动态更新。推荐大家还是rm容器后,再重新run一个新的镜像。

杀掉容器

语法

杀掉一个运行中的容器
docker kill [OPTIONS] CONTAINER [CONTAINER...]

执行命令

docker run -it --name tomcat9 -p 8081:8080 tomcat:9.0.20-jre8-alpine
docker kill tomcat9
docker ps
docker ps -a
docker start tomcat9

常用参数

  • -s:向容器发送一个信号

docker常用命令汇总

使用示例

安装Nginx

Docker官网地址:https://hub.docker.com/_/nginx。

拉取镜像:

docker pull nginx:1.19.3-alpine

备份镜像:

docker save nginx:1.19.3-alpine -o nginx.1.19.3.alpine.tar

导入镜像:

docker load -i nginx.1.19.3.alpine.tar

运行镜像:

docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine

进入容器
docker exec -it nginx sh

查看html目录
cd /usr/share/nginx/html

配置文件目录
cat /etc/nginx/nginx.conf

浏览器测试:http://192.168.198.100/。

安装MySQL

Docker官网地址:https://hub.docker.com/_/mysql。

拉取镜像:

docker pull mysql:5.7.31

备份镜像:

docker save mysql:5.7.31 -o mysql.5.7.31.tar

导入镜像:

docker load -i mysql.5.7.31.tar

运行镜像

学习docker run -e参数:

  • -e , --env=[]:设置环境变量,容器中可以使用该环境变量
  • 官网中给出进入容器的第三种方式,前边我们使用了/bin/bash,sh
  • 向my.cnf文件中追加相关配置项
docker run -itd --name mysql --restart always --privileged=true -p 3306:3306 -e
 MYSQL_ROOT_PASSWORD=admin mysql:5.7.31 --character-set-server=utf8 --collation-
server=utf8_general_ci

privileged参数

我们大多数熟悉Unix类系统的人,都习惯于通过使用sudo来随意提升自己的权限,成为root用户。我们在使用 Docker容器的过程中知道,Docker提供了一个--privileged的参数,其实它与随意使用sudo有很大的不同,它可能会让你的应用程序面临不必要的风险,下面我们将向你展示这与以root身份运行的区别,以及特权的实际含义。

作为root运行

Docker允许在其宿主机上隔离一个进程、capabilities和文件系统,但是大多数容器实际上都是默认以root身份运行。

避免以root运行

虽然在容器内以root身份运行是很正常的,但如果你想加固容器的安全性,还是应该避免这样做。

特权模式

--privileged可以不受限制地访问任何自己的系统调用。在正常的操作中,即使容器内有root,Docker也会限制容器的Linux Capabilities的,这种限制包括像CAP_AUDIT_WRITE这样的东西,它允许覆盖内核的审计日志--你的容器化工作负载很可能不需要这个Capabilities。所以特权只应该在你真正需要它的特定设置中使用,简而言之,它给容器提供了几乎所有主机(作为root)可以做的事情的权限。

本质上,它就是一个免费的通行证,可以逃避容器所包含的文件系统、进程、sockets 套接字等,当然它有特定的使用场景,比如在很多CI/CD系统中需要的Docker IN Docker模式(在Docker容器内部需要Docker守护进程),以及需要极端网络的地方。

以上就是本文的全部内容。欢迎小伙伴们积极留言交流~~~

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Docker
最后更新:2022年 6月 9日

RubinChu

一个快乐的小逗比~~~

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章目录
  • Docker命令分类
  • Docker镜像常用命令
    • Docker Hub地址
    • pull命令
      • 常用参数
    • images命令
    • save命令
      • 一个镜像
      • 常用参数
      • 多个镜像
    • load命令
      • 常用参数
    • search命令
      • 常用参数
    • inspect命令
    • history命令
    • tag命令
    • rmi命令
      • 常用参数
      • 通过ID删除镜像
      • 删除镜像的限制
      • 清理镜像
  • Docker容器常用命令
    • Docker容器(container)
    • 新建并启动容器
      • 语法
      • 运行容器
      • 常用参数
    • 容器日志
      • 语法
      • 执行命令
      • 常用参数
    • 删除容器
      • 语法
      • 执行命令
      • 常用参数
    • 列出容器
      • 语法
      • 执行命令
      • 常用参数
      • 实用技巧
    • 创建容器
      • 语法
      • 执行命令
      • 常用参数
    • 启动、重启、终止容器
      • 语法
      • 执行命令
    • 进入容器
      • 语法
      • 执行命令
      • 常用参数
    • 查看容器
      • 语法
      • 执行命令
      • 常用参数
    • 更新容器
      • 语法
      • 执行命令
    • 杀掉容器
      • 语法
      • 执行命令
      • 常用参数
  • docker常用命令汇总
  • 使用示例
    • 安装Nginx
    • 安装MySQL
      • 运行镜像
      • privileged参数
最新 热点 随机
最新 热点 随机
问题记录之Chrome设置屏蔽Https禁止调用Http行为 问题记录之Mac设置软链接 问题记录之JDK8连接MySQL数据库失败 面试系列之自我介绍 面试总结 算法思维
问题记录之设置普通maven工程的编译级别 Netty源码环境搭建 Tomcat之性能优化 Kafka高级特性之物理存储 SpringBoot解决中文乱码问题 手写Spring之集成手写MyBatis

COPYRIGHT © 2021 rubinchu.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

京ICP备19039146号-1