一起来学Docker(三)

前言

目前正在出一个Docker系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

Docker大家应该都听说过,特别是在当今云原生爆火的时代,更值得我们去学习,下面会带大家系统性的认识一下Docker,并结合一些例子,让大家快速上手~

好了, 废话不多说直接开整吧~

TAG 标记镜像

有时候,我们需要将镜像进行归档,可以使用tag命令

语法:

shell 复制代码
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

示例:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker images
REPOSITORY                                          TAG                 IMAGE ID            CREATED             SIZE
docker.io/hello-world                               latest              feb5d9fea6a5        2 years ago         13.3 kB

[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker tag feb5d9fea6a5 hello-world:test
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker images
REPOSITORY                                          TAG                 IMAGE ID            CREATED             SIZE
hello-world                                         test                feb5d9fea6a5        2 years ago         13.3 kB
[root@iZ2ze5vrnucj8nu52fq932Z ~]# 

这里的SOURCE_IMAGE也可以使用image id替换,效果是一样的,因为有时候镜像的名字可能很长,会显得很冗长

history 查看镜像历史

用来查看某一个镜像的创建历史,也就是镜像的提交记录

语法:

shell 复制代码
docker history [OPTIONS] IMAGE

示例:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker history -H=true hello-world
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
feb5d9fea6a5        2 years ago         /bin/sh -c #(nop)  CMD ["/hello"]               0 B                 
<missing>           2 years ago         /bin/sh -c #(nop) COPY file:50563a97010fd7...   13.3 kB             
[root@iZ2ze5vrnucj8nu52fq932Z ~]# 
  • -H: 已可读的格式打印日期和大小,默认为true

save & 将镜像打包成文件

save命令可以把一个镜像或多个镜像打包到一个文件中,包含镜像的所有信息

语法:

shell 复制代码
docker save [OPTIONS] IMAGE [IMAGE...]

示例:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker save hello-world > hello-world-docker.tar
[root@iZ2ze5vrnucj8nu52fq932Z ~]# ls
hello-world-docker.tar
[root@iZ2ze5vrnucj8nu52fq932Z ~]#
  • 这里的>也可以替换成-o,效果是一样的

感兴趣的小伙伴可以解包看看有啥内容~

load & 从指定文件中加载镜像

从指定文件中加载镜像,该文件需要是save命令保存的文件

语法:

shell 复制代码
docker load [OPTIONS]
  • -i: 指定文件的路径
  • -q:安静模式输出

示例:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker load -i hello-world-docker.tar -q
Loaded image: hello-world:test
[root@iZ2ze5vrnucj8nu52fq932Z ~]# 

容器相关命令

run & 创建一个容器并运行

创建一个容器并运行,如果创建容器的镜像不存在则会从远程镜像仓库下载,运行容器的同时还能给容器发送一个命令

语法:

shell 复制代码
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

介绍一下相关的参数:

  • OPTIONS:可选参数
  • IMAGE:镜像
  • COMMAND:需要运行的命令
  • ARG:命令的参数

OPTIONS的常用值:

这里只选常用的一些参数,大家也可以使用docker run ---help可以查看run命令的所有可用参数

  • -i: 以交互模式运行,通常与-t一起使用
  • -t: 为容器分配一个伪终端,通常与-i一起使用
  • -d: 后台模式运行容器,并返回容器id
  • -p list: 指定端口映射,格式为宿主机端口:容器端口
  • -P: 随机分配端口映射
  • ---name string: 给容器指定一个名称
  • -m bytes: 限制容器可以使用的内存大小,单位可选b、k、m、g
  • -v list: 把宿主机的磁盘路径挂载到容器的某个路径
  • ---volumes-from list: 绑定别的容器某个路径到此容器的某个路径
  • -w: 指定容器的工作目录,默认是根目录
  • ---rm: 当容器停止运行时自动删除
  • ---hostname string: 指定容器的主机名

示例:

shell 复制代码
docker run -it -d ---name my-app -p 8888:8080 -v /logs/:/logs/ -m 500M my-app

上述示例(假设这个镜像存在,是一个web服务的镜像,大家不要直接拿过去就执行~),使用了my-app镜像创建并运行了my-app容器,并映射到了主机端口8888,挂载了主机目录/logs/,限制内存大小为500M,并且在后台运行

这里可以理解为linux中的nohup,如果不指定-d,容器运行的时候不会退出终端,如果强行退出,容器也会随之停止,指定了,容器就可以在后台运行,一般部署服务的时候都会指定-d

start & 启动容器

可以启动一个或多个已经停止的容器

语法:

shell 复制代码
docker start [OPTIONS] CONTAINER [CONTAINER...]

这里的CONTAINER可以是指定的container name也可以是container id

  • -a: 将容器的标准输出或标准错误附加到终端
  • -i: 为容器附加一个标准输入终端

示例:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker start 3f2d1dd782f1 -a

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

[root@iZ2ze5vrnucj8nu52fq932Z ~]# 

上述示例运行了已经停止的hello-world的容器,并向终端输出了相关日志

restart && 重启容器

可以对一个或多个容器进行重启。如果容器是未启动的则会启动,如果是正在运行中的,则会重启

语法

shell 复制代码
docker restart [OPTIONS] CONTAINER [CONTAINER...]
  • CONTAINER:容器

OPTIONS:可选参数:

  • -t int: 在重启之前等待几秒,默认10秒

示例:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker restart -t 3 3f2d1dd782f1
3f2d1dd782f1
[root@iZ2ze5vrnucj8nu52fq932Z ~]# 

上述示例在3秒之后重启hello-world容器

stop & 停止容器

可以停止一个或多个正在运行的容器

kill命令也可以用来停止容器,不同的是stop命令允许容器在停止之前有一定的时间来进行额外操作,如释放链接、关闭请求等 kill命令则会直接强制杀死容器

语法

shell 复制代码
docker stop [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS的常用值:

  • -t int: 等待n秒后如果还没停止,直接杀死,默认10秒

示例:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker stop -t 3 3f2d1dd782f1
3f2d1dd782f1
[root@iZ2ze5vrnucj8nu52fq932Z ~]# 

上述示例,3秒之后停止容器

kill & 杀死容器

杀死一个或多个正在运行的容器

语法

shell 复制代码
docker kill [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS的常用值:

  • -s string: 给容器发送一个信号,信号编号和linux原生命令kill的信号编号一致,默认值9,下文列出一些常用值

-s参数信号编号常用值:

shell 复制代码
1:杀死并重新加载,也可用HUP表示
9:强制杀死,也可用KILL表示,默认值
15:正常停止,也可用TERM表示

示例:

shell 复制代码
docker kill -s 9 3f2d1dd782f1

ps & 查看容器列表

前边学习了运行,停止等命令,那如何判断一个容器是否已经被停止了或者正在运行呢,或者查看所有的容器信息呢。

使用ps命令,可以列出所有容器的列表,查看容器的基本信息。不加任何参数的情况下,默认只展示正在运行的容器

语法:

shell 复制代码
docker ps [OPTIONS]

OPTIONS的常用值:

  • -a: 显示所有容器,默认只显示正在运行的
  • -f filter: 根据条件过滤容器,过滤条件详见下文
  • -n int:显示最后创建的n个容器,包含所有状态
  • -l: 显示最新创建的容器,包含所有状态
  • -q: 只显示容器id
  • -s: 显示容器大小,默认不显示该列
  • ---no-trunc:显示内容不截断,默认情况下显示的容器是截断后的信息

-f参数表示根据条件过滤搜索出来的镜像,语法如下

shell 复制代码
docker ps -f KEY=VALUE

KEY的可选值如下:

  • id: 根据容器id过滤
  • name: 查看容器名称中包含给定字段的容器
  • exited: 根据容器退出的错误码进行过滤
  • status: 根据容器的状态进行过滤,状态可选值有:created、paused、exited、dead、running、restarting、removing
  • before: 只显示在某个容器之前创建的容器
  • since: 只显示在某个容器之后创建的容器
  • volume: 过滤绑定了某个目录的容器,只针对运行中的容器
  • publish: 根据宿主机端口过滤,只针对运行中的容器
  • expose: 根据容器端口过滤,只针对运行中的容器

示例:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker ps -a
CONTAINER ID        IMAGE              COMMAND       CREATED        STATUS                       PORTS    NAMES
3f2d1dd782f1        hello-world       "/hello"       7 days ago     Exited (0) 13 minutes ago             clever_mcnulty  
[root@iZ2ze5vrnucj8nu52fq932Z ~]# 

列含义如下 :

shell 复制代码
CONTAINER ID | IMAGE | COMMAND | CREATED | PORTS | NAMES | 
容器id | 对应的镜像 | 容器启动时运行的命令 | 创建时间 | 绑定的的端口 | 容器名称 |

学到这里, 基本命令够用了,使用上应该不会有太大问题,大家可以尝试部署一下nginx,redis之类的第三方镜像了~

总之,多去尝试,没有那么难~

结束语

本节到这里就结束了,docker命令很多,大家不要去背,如果忘了可以使用docker -h进行查看,多动手,多尝试,多踩坑,下节继续给大家讲解它的用法~

本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注鼓励一下呗~

Docker教程相关文章

往前Shell脚本编程相关文章

往期Linux相关文章

往期面试题相关文章

项目源码(源码已更新 欢迎star⭐️)

往期设计模式相关文章

设计模式项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)

相关推荐
骆晨学长20 分钟前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
小的~~22 分钟前
k8s使用本地docker私服启动自制的flink集群
docker·flink·kubernetes
AskHarries25 分钟前
利用反射实现动态代理
java·后端·reflect
Flying_Fish_roe1 小时前
Spring Boot-Session管理问题
java·spring boot·后端
诚诚k1 小时前
docker存储
运维·docker·容器
sorel_ferris1 小时前
Ubuntu-24.04中Docker-Desktop无法启动
linux·ubuntu·docker
多多*2 小时前
OJ在线评测系统 登录页面开发 前端后端联调实现全栈开发
linux·服务器·前端·ubuntu·docker·前端框架
hai405872 小时前
Spring Boot中的响应与分层解耦架构
spring boot·后端·架构
NiNg_1_2342 小时前
使用Docker Compose一键部署
运维·docker·容器
萠哥啥都行3 小时前
Linux安装Docker以及Docker入门操作
运维·docker·容器