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

【Docker】有用的命令

文章目录

  • Docker
    • Docker 镜像与容器的差异
    • Docker的好处
    • Hypervisor
    • 运维
  • 一、安装docker
  • 二、启动docker
  • 三、获取docker镜像
  • 四、创建镜像
    • 使用命令行创建镜像
    • 使用dockerfile创建镜像
  • 五、docker报错

Docker

  1. docker镜像(Image)
    docker镜像类似于虚拟机镜像,可以将其理解为一个只读模板。除了提供容器运行时所需的程序、库、资源、配置等文件外,docker镜像还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
    镜像是创建docker容器的基础,它可以通过版本管理和增量的文件系统,如Docker Hub。

  2. docker容器(container)
    docker容器(container)类似于轻量级的沙箱,docker利用容器来运行和隔离应用。
    容器是从镜像创建的应用运行实例, 可以将其启动、开始、停止、删除,但是所有的容器是相互隔离的,互不可见的,这就提供了一个实体机可以安装多个容器,且很轻量级相对于虚拟机。镜像本身是只读的,容器从镜像启动的时候,docker会在镜像的最上层创建一个可写层,镜像本身保持不变。

  3. docker仓库(repository)
    docker仓库(repository)类似于代码库,是docker集中存放镜像的场所。 实际上,注册服务器是存放仓库的地方,其上往往存放着很多仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。
    根据存储的镜像公开分享与否,docker仓库可以分为公开仓库(Public)和私有仓库(Private)两种形式。目前,最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载,国内的公开镜像包括Docker Pool,可以提供稳定的国内访问,与GitHub类似。

  4. Dockerfile
    Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明

Docker 镜像与容器的差异

Docker 容器和镜像是 Docker 技术中两个不同的概念,它们代表了不同的层次和功能。

  1. Docker 镜像:

    • Docker 镜像是 Docker 容器的基础。它是一个包含了应用程序运行所需的一切的只读模板。镜像可以包含操作系统、运行时环境、应用程序代码、依赖关系和配置等。镜像是通过 Docker 镜像构建命令(比如 docker build)或者从 Docker Hub 等镜像仓库中下载的。
    • 镜像的特点是不可更改和只读的,它可以被用来创建多个可运行的 Docker 容器。镜像是多层存储结构,每个层都可以复用和共享,这使得镜像可以高效地分发和部署。
  2. Docker 容器:

    • Docker 容器是由 Docker 镜像创建的可运行实例。容器是在镜像层之上(镜像是只读的),添加一个可写的容器层。容器可以被启动、停止、删除和重新启动。每个容器都是相互隔离的,具有自己的文件系统、网络和进程空间。容器可以在不同的主机和不同的 Docker 引擎中运行,具有高度的可移植性和可复制性。
    • 容器通常用来运行单个应用程序或者服务,每个容器都有自己的运行环境和运行时配置。

总结来说,Docker 镜像是一个只读的模板,用于创建 Docker 容器。镜像具有不变性和可重用性的特点。而容器是由镜像创建的可运行实例,具有自己的文件系统和运行环境,通常用于运行应用程序或者服务。在 Docker 中,镜像与容器之间是父子关系,镜像是容器的基础。

Docker的好处

  1. 更便捷的应用交付和部署
    在这里插入图片描述

  2. 更便捷的升级和扩缩容
    在这里插入图片描述

  3. 更简单的系统运维
    在这里插入图片描述

  4. 更高效的计算资源利用
    在这里插入图片描述

Hypervisor

Hypervisor(虚拟机监视器)是一种软件、硬件或者组合形式,用于虚拟化计算机资源,并管理多个虚拟机的创建、运行和监控。

Hypervisor可以分为两种类型:

  1. Type 1 Hypervisor(裸金属/直接运行型):直接运行在物理硬件上,也称为裸金属或裸机型Hypervisor。它具有更高的性能和直接的硬件访问能力。Type 1 Hypervisor负责管理裸机资源,将其划分为多个虚拟机,每个虚拟机可以运行自己的操作系统。常见的Type 1 Hypervisor有VMware ESXi和Microsoft Hyper-V。

  2. Type 2 Hypervisor(主机操作系统运行型):运行在主机操作系统之上,也称为主机型Hypervisor。Type 2 Hypervisor在主机操作系统上创建和管理虚拟机,并提供对虚拟机的资源分配和监控。它通常用于开发和测试环境。常见的Type 2 Hypervisor有VMware Workstation和Oracle VirtualBox。

Hypervisor的主要功能包括:

  • 资源虚拟化:将物理计算机的CPU、内存、存储等资源划分成多个虚拟机,并为每个虚拟机提供一定的资源配额。
  • 虚拟机管理:创建、启动、停止和删除虚拟机,提供虚拟机的管理接口和操作。
  • 资源调度:根据虚拟机的需求和主机资源的可用性,动态调整资源分配,以实现更好的性能和利用率。
  • 安全隔离:对不同虚拟机之间提供隔离性,确保一台虚拟机的故障或安全问题不影响其他虚拟机。
  • 监控和报告:监控虚拟机的性能指标、资源利用率和运行状态,并生成报告或提供警报。

Hypervisor的作用是实现虚拟化技术,使得一台物理计算机能同时运行多个虚拟机,并将它们隔离开来,从而提供更高的资源利用率、灵活性和可靠性。它是构建虚拟化环境和云计算基础设施的关键组件之一。

运维

运维,全称为运营和维护(Operations and Maintenance),是指对计算机系统、网络设施以及软件应用进行有效运行和稳定维护的工作。

在信息技术领域中,运维是一项重要的工作,它涵盖了硬件设备、网络设施、操作系统、数据库、服务器等各个方面。运维人员负责监控系统运行状态、处理系统故障、进行性能优化、部署更新和维护安全等工作。Docker是运维人员部署项目的高效工具。

一、安装docker

查看centos版本信息,centos7以上已内置docker安装比较方便,参考

cat /etc/redhat-release

centos 7下安装docker

# 安装Docker所需的一些依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 安装最新版本的Docker
sudo yum install docker-ce docker-ce-cli containerd.io

sudo yum install -y docker这条命令中,-y是一个命令行选项,表示在安装过程中自动应答"yes"到所有的确认提示。

这个选项对于在服务器环境中使用尤其有用,因为在这种环境中,可能需要进行大量的包安装和配置,如果每次都手动确认,会非常麻烦。使用-y选项可以自动应答所有的确认提示,大大简化操作。

启用并启动Docker服务

sudo systemctl enable docker
sudo systemctl start docker

验证docker是否安装成功

docker run hello-world
# 或者
sudo docker --version

二、启动docker

启动Docker服务,并设置为开机启动

systemctl start docker.service
systemctl enable docker.service

如果启动docker失败,可以先卸载再重装

查看docker的版本

docker version

在这里插入图片描述

修改镜像网址

创建daemon文件

vi /etc/docker/daemon.json

输入一下内容

{		"registry-mirrors":["https://registry.docker-cn.com"],"live_restrore":true}

然后esc键返回,并输入:wq保存退出文件

重启docker,并验证镜像是否安装成功

systemctl restart docker
docker search redis

三、获取docker镜像

(注:该图来自该博客:(https://blog.csdn.net/qq_39311377/article/details/131730887))

在这里插入图片描述

将image文件从仓库下载到本地, pull获取镜像,library对应的文件组

docker pull library/hello-world

获取目标image_name镜像

docker pull image_name

下载centos7镜像,:7指定了对应的centos版本:

docker pull centos:7

下载python3.9镜像

docker pull python:3.9

查看已有镜像,Docker镜像保存在/var/lib/docker目录下

docker images

运行hello-world镜像

docker run hello-world

修改本地镜像名字(小写)

docker tag centos:7 mycentos:1

删除仓库为 docker.o/tomcat, 标签为7.0.77-jre7的镜像

docker rmi docker.io/tomcat:7.0.77-jre7

删除镜像ID为b39c68b7af30的镜像

docker rmi b39c68b7af30

本地镜像的删除

docker rmi centos:7

查看正在运行的容器

docker ps

查看所有容器,无论是否正在运行

docker ps -a

在这里插入图片描述

CONTAINER ID:容器的唯一表示ID。
IMAGE:创建容器时使用的镜像。
COMMAND:容器最后运行的命令。
CREATED:创建容器的时间。
STATUS:容器状态。
PORTS:对外开放的端口。
NAMES:容器名。可以和容器ID一样唯一标识容器,同一台宿主机上不允许有同名容器存在,否则会冲突。

根据已有的镜像创建容器

docker run -it --name=c2 centos:7

启动python3.9

docker run -it --name=python3.9 python:3.9

参数的解释:
-i表示让容器的标准输入保持打开
-t表示为容器重新分配一个伪输入终端
--name表示为创建出来的容器起一个名称,名称为c2
centos 表示根据镜像的名称
注意:这种方式表示前台运行容器,退出终端之后,容器会关闭,退出之前可以在xshell中打开另个一终端来查看目前正在运行的容器
退出终端之后,可以再次查看,看看容器是否关闭
如果需要在后台启动容器,可以加上参数-d
命令如下:

docker run -d --name=c3 centos:7

但是只加-d 不加-it会导致启动成功之后,容器就直接关闭,所以后台启动的时候通常都是使用-itd的方式运行容器

docker run -itd --name=c3 centos:7

例子

docker run -p localhost:3307:3306 --name scrapersql --privileged=true \-v /database/mysql:/var/lib/mysql \-e "MYSQL_ALLOW_EMPTY_PASSWORD=true" \-d mysql:5.7

说明
localhost的3307端口上创建一个MySQL服务,并将其映射到主机的3306端口
--name 设置镜像名字
-v将主机上的 /database/mysql目录挂载到容器内的 /var/lib/mysql目录
退出容器
-e:该选项用于设置环境变量。-e "MYSQL_ALLOW_EMPTY_PASSWORD=true"表示在容器中设置一个环境变量MYSQL_ALLOW_EMPTY_PASSWORD,并将其值设置为true。这个环境变量的作用是允许空的MySQL密码

exit

设置端口号

docker run -itd -p 8081:8080 tomcat

8081指的是宿主机的端口
8080指的是容器里面tocmat的端口号
-p 表示端口号参数
从客户机上访问容器,需要有端口映射,docker容器默认采用桥接模式与宿主机通信,需要将宿主机的ip端口映射到容器的ip端口上;
桥接模式,也就是将虚拟机的虚拟网络适配器与主机的物理网络适配器进行交接,虚拟机中的虚拟网络适配器可通过主机中的物理网络适配器直接访问到外部网络。简而言之,这就好像在局域网中添加了一台新的、独立的计算机一样。因此,虚拟机也会占用局域网中的一个 IP 地址,并且可以和其他终端进行相互访问。

查看容器的详细信息

docker inspect container_id/container_name

查看容器的日志信息

docker logs container_id/container_name

如果提示FileNotFoundException 则有可能是 容器目录下的conf文件夹没有权限 可以使用 chmod -R递归设置权限

从宿主机复制到容器:docker cp 宿主机本地路径 容器名字/ID:容器路径

docker cp /root/123.txt mycentos:/home/
# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysqldocker run -id \
-p 3366:3306 \
--name=c_mysql \
-v /opt/mysql/conf:/etc/mysql/conf.d \
-v /opt/mysql/logs:/logs \
-v /opt/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mysql:5.7参数说明:-p 3366:3306**:将容器的 3306 端口映射到宿主机的 3307 端口。
-v etc/conf:/etc/mysql/conf.d**:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
-v etc/logs:/logs**:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
-v etc/data:/var/lib/mysql** :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
-e MYSQL_ROOT_PASSWORD=root:**初始化 root 用户的密码。

启动容器

docker start  container_name/container_id

停止容器

docker stop container_name/container_id

重启容器

docker restart container_name/container_id

启动容器后,进入到容器内部

docker attach container_name/containere_id

删除容器

docker rm container_name/container_id

查看当前系统docker信息

docker info

获取最新的centos镜像

docker pull centos:latest

查看镜像信息

sudo docker images

查看docker信息

docker info
docker exec -it xxxxx bash

docker exec -it xxxxx bash,这是用于在运行的 Docker 容器中打开一个交互式终端(bash shell)的命令。

  • docker exec:这是 Docker 命令行工具中用于在运行的容器中执行命令的命令。
  • -it:这是两个选项的结合,-i 代表 interactive(交互式),-t 代表 tty(终端)。这两个选项一起使用,允许你在容器中运行一个交互式命令行会话。
  • xxxx:这是你要在其内部运行命令的 Docker 容器的 ID 或名称。你需要用你实际的容器 ID 或名称替换 xxxx
  • bash:这是你要在容器中运行的命令。在这个例子中,我们正在请求 Docker 在容器中启动一个 bash shell。因此,整个命令的意思是:“在运行的容器 xxxx 中启动一个交互式的 bash shell。”
mysql
create database `scraping` default character set utf8mb4;
create database `projectdb` default character set utf8mb4;
create database `taskdb` default character set utf8mb4;
create database `resultdb` default character set utf8mb4;
quit

通过上述命令进入mysql

docker build -t scraper:latest . # 注意后面的点. 

命令 docker build -t scraper:latest .用于在Docker环境中构建一个新的镜像,并将其标记为 scraper:latest。如果你要运行的程序在Dockerfile中已经定义好了,那么这条命令会从Dockerfile开始构建,然后创建一个包含你程序的新镜像。

如果在运行这个命令时遇到了问题,以下是一些可能的原因:

  1. Dockerfile不存在或者不在当前目录。你需要确保你在包含Dockerfile的目录下运行这个命令,或者使用 -f 参数来指定Dockerfile的位置。
  2. Docker环境没有正确安装或者配置。你可以通过 docker --version 来检查Docker是否正确安装并运行。
  3. 网络问题。在某些情况下,网络问题可能会阻止Docker从Internet下载需要的文件。如果可能的话,尝试更换网络环境或者使用VPN。
  4. Dockerfile有错误或者不完整。你需要检查你的Dockerfile以确保其正确性。

四、创建镜像

使用命令行创建镜像

docker commit 命令用于根据 Docker容器 的更改创建一个新的 Dokcer镜像。该命令后面的 CONTAINER 可以是容器Id,或者是容器名。

docker commit 容器id 镜像名称:版本号

docker save 用来将一个或多个image打包保存。如:将本地镜像库中的image1和image2打包到images.tar中

docker save -o 压缩文件名称 镜像名称:版本号
docker save -o images.tag image1:v1 image2:v1

docker load用于将打包的tar中包含的镜像load到本地镜像库,但不能重命名其中的镜像名。

docker load –i 压缩文件名称
docker load -i images.tar

使用dockerfile创建镜像

dockerfile

FROM centos:7 							#定义父镜像
MAINTAINER  yjf 						#定义作者信息
RUN yum install -y vim					# 执行安装vim命令
WORKDIR /opt 							# 定义默认的工作目录
CMD /bin/bash							# 定义容器启动执行的命令

通过dockerfile构建镜像

docker build -f  my_dockerfile -t xxx:7

五、docker报错

ERROR【docker】报错:Got permission denied while trying to connect to the Docker daemon socket at unix:///var/
需要使用root权限

ERROR docker pull mysql 报missing signature key错误
如果安装docker用的是yum install docker命令的话,下载下来的docker版本未旧版本,所有数字签名有问题
https://blog.csdn.net/Single_for_life/article/details/133653113

su root

https://www.php.cn/faq/506200.html
https://www.modb.pro/db/586199
https://www.bilibili.com/read/cv22443043/

https://blog.csdn.net/m0_73409141/article/details/131425285
https://worktile.com/kb/ask/30572.html
https://blog.csdn.net/swadian2008/article/details/109518783
https://blog.csdn.net/qq_47614329/article/details/130387532
https://blog.csdn.net/weixin_41384860/article/details/128819642
https://blog.51cto.com/u_16099211/6314870

相关文章:

  • Docker Container(容器)
  • django rest framework 学习笔记-实战商城
  • c++的静态多态和动态多态
  • 《艾尔登法环 黄金树幽影》是什么?Mac电脑怎么玩《艾尔登法环》艾尔登法环下载
  • 五个使用Delphi语言进行开发的案例
  • [rust] 11 所有权
  • 网络原理 HTTP _ HTTPS
  • 跨环境前端组件库打包方案(node+esm)
  • 微信小程序 --- 通用模块封装(showToast,showModal ,本地存储)
  • wo-gradient-card是一款采用uniapp实现的透明辉光动画卡片
  • ELK入门(四)-logstash
  • petalinux_zynq7 驱动DAC以及ADC模块之六:qt显示adc波形
  • 十三、集合进阶——单列集合 及 数据结构
  • Java学习——ArrayList和LinkedList
  • 使用向量数据库pinecone构建应用01:相似语义检索 Semantic Search
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • ECS应用管理最佳实践
  • gitlab-ci配置详解(一)
  • Map集合、散列表、红黑树介绍
  • React16时代,该用什么姿势写 React ?
  • SpringBoot几种定时任务的实现方式
  • TypeScript实现数据结构(一)栈,队列,链表
  • underscore源码剖析之整体架构
  • 给Prometheus造假数据的方法
  • 警报:线上事故之CountDownLatch的威力
  • 蓝海存储开关机注意事项总结
  • 悄悄地说一个bug
  • 如何设计一个比特币钱包服务
  • 深度解析利用ES6进行Promise封装总结
  • 双管齐下,VMware的容器新战略
  • 想写好前端,先练好内功
  • 智能网联汽车信息安全
  • nb
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​你们这样子,耽误我的工作进度怎么办?
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (k8s中)docker netty OOM问题记录
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .sys文件乱码_python vscode输出乱码
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @AliasFor注解
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell