虚拟机下如何使用Docker(完整版)

Docker详细介绍:

Docker 是一款开源的应用容器引擎,由Docker公司最初开发并在2013年发布。Docker的核心理念源自于操作系统级别的虚拟化技术,尤其是Linux上的容器技术(如LXC),它为开发人员和系统管理员提供了一种标准化、轻量级的方式来打包、分发和运行应用程序及其依赖环境。

**Docker的三大核心概念:**

1. **镜像(Images)**:

  • Docker镜像是构建容器的基础,是一种只读模板。它可以看作是一个包含了运行应用程序所需的所有文件、依赖库和其他配置信息的文件系统层次结构。镜像不包含动态数据,且通常是基于先前镜像层叠加创建的,具有存储效率高、易于分发的特点。

2. **容器(Containers)**:

  • Docker容器是从镜像启动的运行实例,它是对操作系统资源的隔离和限制的虚拟化单元。容器之间互不影响,各自运行在一个独立的环境中,共享宿主机内核,但拥有自己的文件系统、CPU、内存、网络资源等,从而实现了轻量级的虚拟化效果。

3. **仓库(Registries)**:

  • Docker仓库是用来存储和分发Docker镜像的地方,其中最知名的是Docker Hub。用户可以上传自己的镜像,或者下载其他人分享的镜像。企业级场景下,也会搭建私有仓库以满足安全性和合规性需求。

**Docker的主要优势:**

  • **便携性**:开发人员可以在本地创建包含应用及其全部依赖的镜像,确保这个镜像能在任何支持Docker的环境中一致地运行。

  • **资源高效**:相比于传统的虚拟机,Docker容器不需要额外的Hypervisor开销,因此启动更快、占用资源更少。

  • **一致性**:确保应用在开发、测试和生产环境间的一致性,简化部署流程,减少环境差异导致的问题。

  • **隔离与安全性**:容器之间相互隔离,通过控制组(cgroups)和命名空间等机制确保资源管理和安全隔离。

**Docker生态工具**:

  • `docker run`:用于启动容器的命令,可以从镜像创建并运行一个新容器。

  • `docker-compose`:用于定义和运行多容器应用程序,通过YAML文件(docker-compose.yml)集中管理多个容器及其依赖关系和服务编排。

  • Docker Swarm:原生的集群管理工具,用于在多台主机上部署容器化的应用作为单一的虚拟系统。

由于Docker带来的便利性和标准化,它极大地推动了微服务架构的发展,成为现代云计算和持续集成/持续部署(CI/CD)工作流中的重要组成部分。

Docker使用教程:

sudo -i 提升权限

Ubuntu: apt install docker.io

Centos: yum install docker.io

ubuntu举例:

安装成功后输入 docker --version 查看版本 如果显示信息则代表安装成功

docker run hello-world

这个命令相当于从仓库拉取一个helloworld镜像并运行,也是docker经典的测试镜像。

成功。

接下来我们可以随便拉取一个镜像,这边选择centos7,大家也可以自行选择。

拉取成功

查看全部镜像

这就是我们刚刚拉取的hello-world和centos7镜像。接下来我们把它做成容器,这样才能供我们使用

相信大家看到这可能会疑惑这些-it -d 的意思。以下是解释

复制代码
-d 或 --detach:后台运行容器,并打印容器ID。容器将在后台运行,而非直接进入容器的命令行。

-i 或 --interactive:使容器的标准输入保持打开,通常与 -t 结合使用,允许用户与容器的命令行进行交互。

-t 或 --tty:为容器分配一个伪TTY,为容器分配一个终端,适合运行需要终端交互的命令行应用。

--name:指定容器的名称,如果不指定,Docker会随机生成一个名称。

-p 或 --publish:端口映射,格式为 <主机端口>:<容器端口>,将容器内部的服务端口暴露给主机。

-v 或 --volume:数据卷挂载,格式为 <主机路径>:<容器路径>,用于将主机目录或文件映射到容器内。

-e 或 --env:设置环境变量,格式为 <环境变量名>=<值>,用来向容器传递环境变量。

--restart:设置容器重启策略,如 always、unless-stopped、on-failure[:max-retries] 等,决定当容器停止或退出时如何自动重启容器。

-w 或 --workdir:设置容器内部的工作目录。

--network:指定容器的网络模式,可以是预创建的网络或默认网络。

--rm:容器退出后自动删除容器文件系统和网络配置。

-u 或 --user:指定运行容器的用户或UID。

<image>:必须参数,指定要运行的镜像名称。

[command]:容器启动时执行的命令和参数,如果不指定,则使用镜像的默认ENTRYPOINT和CMD。

--privileged=true:它用于赋予容器更多的权限。当设置为 --privileged=true(或者简写为 -privileged)时,容器内的进程将获得几乎与宿主机相同的访问权限,包括但不限于:

所有设备的访问:容器可以访问宿主机的所有设备,比如硬件设备、内核模块等。

CAP_SYS_ADMIN能力集:容器可以获得完整的Linux能力集,允许对系统进行高级操作,如修改网络接口、挂载文件系统、改变系统时间等。

安全设定绕过:容器可以不受seccomp、AppArmor等安全机制的限制。

其他内核资源完全控制:包括内核命名空间、cgroups等系统的完整控制权。

创建成功

进入容器

接下来我们就可以在容器里尽情释放才华,作者才华不够,就写一个txt文件好了。。。

接下来就是docker的很方便的一个地方,移植性。

退出容器

此时我们要进行的是打包容器,如果是平时我们的使用我们可以选择commit容器,提交成一个镜像,然后把镜像save成tar文件,但是注意,如果是公用考虑产品以后会在docker上迭代更新的话我们可以采用export,因为如果一直commit save的话最后的容器的大小可能会越来越大!这个就涉及到docker的一些底层原因,如果有小伙伴愿意深究可以点下方链接。

docker容器commit之后变得非常大的原因及解决办法_docker commit提交后镜像更大了-CSDN博客

转载于:CrystalheartLi

commit save 流程:

语法:

复制代码
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  • **-a :**提交的镜像作者;

  • **-c :**使用Dockerfile指令来创建镜像;

  • **-m :**提交时的说明文字;

  • **-p :**在commit时,将容器暂停。

commit save方法:

docker commit -a "bbxwg" centos7 mycentos7:1.0

save

导出成功

export 方法:

大家是否会疑惑这两个镜像有何不同呢?如果说是正常使用的话没什么不同

  • save操作镜像,是保存一个完整的镜像,包含分层系统统一打包;
  • export操作容器,是导出容器当前的操作系统,不包含分层系统,仅包含当前系统中的状态。
  • save保存的是镜像(image),export保存的是容器(container)。

接下来就是导入环节。

我们可以换个虚拟机,如果嫌麻烦的话可以直接在本机操作。

注意:我们用save保存的镜像也就是img.tar我们需要用load下载,而export的镜像我们需要用import下载,否则无法下载成功!!

docker load -i img.tar

docker import img2.tar

这样他们就会变成两个镜像,我们可以把镜像做成容器,直接使用。

首先我们删除容器和镜像

完成

这两个都一样其实,接下来创建并打开容器

至此,流程结束。

希望可以帮助到大家~

相关推荐
一水鉴天1 小时前
整体设计 逻辑系统程序 之18 Source 容器(Docker)承载 C/P/D 三式的完整设计与双闭环验证 之2
docker·架构·认知科学·公共逻辑
飞快的蜗牛3 小时前
利用linux系统自带的cron 定时备份数据库,不需要写代码了
java·docker
火星MARK3 小时前
k8s面试题
容器·面试·kubernetes
香吧香4 小时前
Docker Registry 使用总结
docker
赵渝强老师4 小时前
【赵渝强老师】Docker容器的资源管理机制
linux·docker·容器·kubernetes
haicome5 小时前
deepseek部署
docker·ragflow·deepseek 部署
乄bluefox6 小时前
保姆级docker部署nacos集群
java·docker·容器
每天进步一点_JL6 小时前
Docker 是什么?
后端·docker·容器
一叶飘零_sweeeet6 小时前
从 0 到 1 掌控云原生部署:Java 项目的 Docker 容器化与 K8s 集群实战指南
docker·云原生·kubernetes·项目部署
森林猿7 小时前
docker-compose-kafka 4.1.0
docker·容器·kafka