当前位置: 首页 > news >正文

Docker的常用命令及简单使用

1、docker的常用命令

1.1、帮助命令

docker version              # 显示docker的版本信息
docker info                 # 显示docker的系统信息,包括镜像和容器的数量
docker 指令 --help         # 查看某个指令的帮助命令

可以通过docker --help查看docker常用命令,也可以在官网查看。

docker命令官网查询地址:Reference | Docker Docs

1.2、镜像命令

docker images            # 查看本机的镜像信息
docker search 镜像名      # 搜索镜像
docker pull 镜像名[:tag]    # 下载镜像,可以指定镜像的版本tag,默认是最新版本
docker rmi -f 镜像名或镜像id      # 删除镜像
docker rmi -f 镜像id1 镜像id2 镜像id3      # 删除多个镜像
docker rmi -f $(docker images -aq)    # 删除所有的镜像

1.docker images        # 查看本机的镜像信息

字段解释:

REPOSITORY:镜像的仓库源

TAG:镜像的标签

IMAGE ID:镜像的id

CREATED:镜像的创建时间

SIZE:镜像的大小

2.docker search 镜像名      # 搜索镜像

也可以通过DockerHub官网搜索:https://hub.docker.com/search?q=

3.docker pull 镜像名[:tag]      # 下载镜像,可以指定镜像的版本tag,默认是最新版本

从DockerHub上看一下mysql的版本,下载指定的版本:

4. 删除镜像

docker rmi -f 镜像名或镜像id      # 删除镜像
docker rmi -f 镜像id1 镜像id2 镜像id3      # 删除多个镜像
docker rmi -f $(docker images -aq)    # 删除所有的镜像

1.3、容器命令

docker run [可选参数] 镜像名      # 运行镜像,创建容器
docker ps [可选参数]      # 查看正在运行的容器
exit    # 容器停止并退出
Ctrl + P + Q    # 退出容器,但容器并未停止
docker rm 容器id    # 删除指定的容器,不能删除正在运行的容器,可使用-f强制删除
docker rm [-f] $(docker ps -aq)    # 删除所有的容器,-f 表示强制删除,包括运行的容器
docker ps -aq | xargs docker rm   # 删除所有的容器
docker start 容器id    # 启动容器
docker restart 容器id    # 重启容器
docker stop 容器id    # 停止当前正在运行的容器
docker kill 容器id    # 强制杀死当前容器

1.docker run [可选参数] 镜像名      # 运行镜像,创建容器

可选参数说明:

--name    # 给容器起个名字,用于区分容器

-d         # 以后台方式运行

-it         # 以交互方式运行,进入容器查看内容

-p   #指定容器端口,如-p 8080,常用的是将主机端口与容器端口进行映射,即-p 主机端口:容器端口,如-p 8090:8090。还有一种方式指定主机ip,-p 主机ip:主机端口:容器端口。

-P   # 随机指定端口

只有有了镜像,才可以创建容器,运行镜像,就是创建了一个容器。

先下载一个centos镜像:

再运行镜像,创建容器:

2.docker ps [可选参数]      # 查看正在运行的容器

可选参数说明:

-a     # 查看所有容器,包括曾经运行的容器

-n=?   # 查看最近创建的容器,例如查看最近创建的两个容器:-n=2

-q     # 只显示容器的编号CONTAINER ID

3.退出容器

exit    # 容器停止并退出

Ctrl + P + Q    # 退出容器,但容器并未停止

4.删除容器

docker rm 容器id    # 删除指定的容器,不能删除正在运行的容器,可使用-f强制删除

docker rm [-f] $(docker ps -aq)    # 删除所有的容器,-f 表示强制删除,包括运行的容器

docker ps -aq | xargs docker rm   # 删除所有的容器

5.启动和停止容器

docker start 容器id    # 启动容器

docker restart 容器id    # 重启容器

docker stop 容器id    # 停止当前正在运行的容器

docker kill 容器id    # 强制杀死当前容器

1.4、其他常用命令

docker run -d 镜像名  #容器启动后,docker发现该容器没有提供服务,就会自动停止容器
docker logs -tf --tail 10 容器id    # 查看指定容器的日志信息
docker top 容器id      # 查看容器中进程信息
docker inspect 容器id   # 查看容器的元数据
docker exec -it 容器id /bin/bash    # 进入当前正在运行的容器,开启一个新的终端
docker attach 容器id    # 进入容器,并使用正在运行的终端,不会开启新的终端
docker cp 容器id:容器内路径 主机路径
docker stats 容器id    # 查看容器占用CPU和内存信息

1.后台启动容器

docker run -d 镜像名  #容器启动后,docker发现该容器没有提供服务,就会自动停止容器

2.查看容器日志

docker logs -tf --tail 10 容器id    # 查看指定容器的日志信息

参数说明:--tail 10 表示查看10条日志,不加tail表示查看所有日志。

3.查看容器中进程信息

docker top 容器id      # 查看容器中进程信息

docker inspect 容器id   # 查看容器的元数据

4.进入当前正在运行的容器

通常容器都是以后台方式运行的,如果需要进入容器,修改一些配置,则可以使用docker exec命令。

docker exec -it 容器id /bin/bash    # 进入当前正在运行的容器,开启一个新的终端

docker attach 容器id    # 进入容器,并使用正在运行的终端,不会开启新的终端

5、将容器内的文件复制到主机上

docker cp 容器id:容器内路径 主机路径

6、docker stats 容器id    # 查看容器占用CPU和内存信息

1.5、命令小结

练习:使用docker安装nginx、tomcat

练习1:使用docker安装nginx

1、搜索nginx镜像,docker search nginx,建议到DockerHub官网上搜索,可以看到版本

2、下载nginx镜像,docker pull nginx[:tag]

3、运行nginx镜像,启动容器,docker run -d --name nginx01 -p 8090:80 nginx

启动命令参数说明:-d 以后台方式运行,--name 给容器命名,-p 8090:80将主机端口8090与容器端口80进行映射。

端口映射:

在浏览器上输入虚拟机ip:主机映射端口号,并且防火墙开通主机映射端口号。

练习2:使用docker部署tomcat

docker run -it --rm tomcat:9.0

--rm 表示容器用完退出之后就删除,一般用来测试,不建议这样使用。

练习3:使用docker安装elasticsearch

docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.7.0

由于elasticsearch运行非常耗内存,所以通过-e ES_JAVA_OPTS参数限制其占用内存大小。

启动elasticsearch容器之后,通过curl localhost:9200进行测试是否启动成功。

ElasticSearch启动时,会占用两个端口9200和9300。

9200 是ES节点与外部通讯使用的端口。它是http协议的RESTful接口,各种CRUD操作都是走的该端口。

9300是ES节点之间通讯使用的端口。它是tcp通讯端口,集群间和TCPclient都用此接口。

练习4:使用docker安装portainer可视化界面

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

2、docker镜像讲解

镜像是什么?

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。

所有的应用,直接打包docker镜像,就可以直接跑起来!

得到镜像的方式:

·从远程仓库下载

·朋友拷贝给你

·自己制作一个镜像 DockerFile

2.1、docker镜像加载原理

1. UnionFS(联合文件系统)

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

2. Docker镜像加载原理

docker镜像实际由一层一层的文件系统(UnionFS)组成,基础的镜像都会包含bootfs和rootfs。

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux则启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs(root file system)在bootfs之上,包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu、Centos等。

[root@localhost ~]# docker images centos
REPOSITORY  TAG   IMAGE ID     CREATED     SIZE
centos         latest   470671670cac  3 months ago   237MB

平时安装虚拟机的centos都是好几个GB,为什么使用Docker拉取的镜像才200MB?

这是因为对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。

举一个简单的例子,假如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的简单例子)。

在添加额外的镜像层的同时,镜像始终保持是当前所有镜像层的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。

Docker镜像的特点:

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!这一层就是通常说的容器层,容器之下的都叫镜像层!

2.2、提交镜像

提交容器成为一个新的镜像:

docker commit -m= "描述信息" -a= "作者" 容器id 目标镜像名:[tag]

下面首先通过默认的tomcat镜像启动一个容器,接着修改容器中的webapps,然后将修改后的容器提交成为一个新的tomcat镜像。

http://www.xdnf.cn/news/1387927.html

相关文章:

  • 微积分 | 积分代换
  • 探索永洪vividime的超链接功能:数据分析的桥梁
  • C# NET5.0及以上版本中如何处理MySQL大数据查询
  • 数据防泄与最小可见:ABP 统一封装行级安全(RLS)+ 列级脱敏
  • Go对接全球期货数据源指南:基于StockTV API实现多品种实时监控
  • whisper-large-v3 模型
  • Rust Tokio异步任务实战教程(高级功能)
  • 【前端教程】二维数组排序实战:按需封装才是最优解——拒绝冗余,精简代码
  • Rust语言能干什么
  • PHP的uniqid() 函数分析
  • LangChain实战(二):环境搭建与Hello World(国内开源模型版)
  • 嵌入式Linux驱动开发 - 并发控制机制
  • 【开题答辩全过程】以 基于Spring Boot的网上家庭烹饪学习系统的设计与实现为例,包含答辩的问题和答案
  • 不止 ChatGPT:多模态 AI(文本 + 图像 + 音频)正重构内容创作全流程
  • 以技术赋能强化消费者信任,助推餐饮服务质量提质增效的明厨亮灶开源了
  • [密码学实战]基于SM2实现协同签名(四十五)
  • 微算法科技(NASDAQ:MLGO)一种基于FPGA的Grover搜索优化算法技术引领量子计算
  • QT5.14.2、CMake 扩展openCV
  • JVM_JMM
  • 面试八股文之——JVM与并发编程/多线程
  • Python Imaging Library (PIL) 全面指南:PIL基础入门-构建简易图像编辑器
  • LSTM实战:回归 - 实现交通流预测
  • 在Windows系统上将Java的.jar文件部署为服务
  • stylelint在项目中使用
  • 构筑沉浸式3D世界:渲染、资源与体验的协同之道
  • 牛客网 DP35 二维前缀和
  • 【算法】链表专题
  • C#连接SQL-Server数据库超详细讲解以及防SQL注入
  • 零基础json入门教程(基于vscode的json配置文件)
  • 序列化和反序列的学习