还在用虚拟机?是时候开始用Docker了

本文详细介绍Docker的基础概念及其与传统虚拟机的区别,并提供基于CentOS的Docker安装配置流程及常用命令,帮助读者快速掌握Docker的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker是啥?

如果有人问起了你这个问题,你可以这样回答他:Docker就是一个轻量型的虚拟机,可以充分利用服务器性能。

如果你的这个回答被怼了?

  • 爱怼怼用户A:什么轻量型的虚拟机,跟虚拟机本质上是有区别的好吧?虚拟机多了一层guest OS,同时Hypervisor会对硬件资源进行虚拟化,运行在虚拟机上的应用程序在进行数值计算时是运行在Hypervisor虚拟的CPU上的(如果你使用过win10的hyper-v虚拟机工具,你就会发现如果要开启虚拟机就要在bios开启cpu的虚拟化)。而docker直接使用硬件资源虚拟机增加了一层虚拟硬件层,所以资源利用率相对docker低。

  • 爱怼怼用户B: Docker其实也是类似于虚拟机的。至少在作用目的上是一致的。用一个“经典”的例子来作对比就是:将部署应用比作鸣人来搓螺旋丸,虚拟机类似于鸣人的影分身之术,每个分身(虚拟机)都拥有同样的身体(OS,环境),但是在查克拉(CPU)的使用上,每个分身的查克拉会均分自真身(真正的主机),这个行为也可以称之为CPU虚拟化,但是这里浪费了分身,用分身来搓一个小螺旋丸,太浪费了……而对于docker来说,就像是九尾模式的鸣人,我直接利用我体内的九尾查克拉(硬件资源),分成九只爪子,每只爪子相互独立,也可以搓小螺旋丸……

  • 爱怼怼用户C: 楼上菜鸡,直接看官方介绍不就行了,Docker官方介绍Docker集装箱

  • ……

对于这些,你只需回答:看来你不是都知道么……

那么使用Docker有哪些好处呢?

用Docker有啥好处?

  • 速度飞快以及优雅的隔离框架: 每个Docker之间互相隔离。
  • 物美价廉: 服务器一台多贵晓得不,省了不少经费了。
  • CPU/内存的低消耗:少了大部分虚拟机的没太大作用的硬件资源占用,自然消耗少了。
  • 快速开/关机: 相对于虚拟机肉鸡开机速度而言。
  • 跨云计算基础构架: 就是云计算喽。

简单操作:搭建 Docker 环境

以下上手基于 CentOS ,所以你首先需要一个Linux的系统主机。

安装与配置 Docker

安装 Docker

Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令:

yum install docker-io -y
直接yum安装,安装成功后查看版本

docker -v
启动docker

service docker start
设置开机启动

chkconfig docker on
配置 Docker

因为国内访问 Docker Hub 较慢, 可以使用腾讯云提供的国内镜像源, 加速访问 Docker Hub

依次执行以下命令

echo "OPTIONS='--registry-mirror=https://mirror.ccs.tencentyun.com'" >> /etc/sysconfig/docker

systemctl daemon-reload

service docker restart
Docker 上手

下载镜像

下载一个官方的 CentOS 镜像到本地

docker pull centos
下载好的镜像就会出现在镜像列表里

docker images
运行容器

这时我们可以在刚才下载的 CentOS 镜像生成的容器内操作了。

生成一个 centos 镜像为模板的容器并使用 bash shell

docker run -it centos /bin/bash

这个时候可以看到命令行的前端已经变成了 [root@(一串 hash Id)] 的形式, 这说明我们已经成功进入了 CentOS 容器。

在容器内执行任意命令, 不会影响到宿主机, 如下

mkdir -p /data/simple_docker
可以看到 /data 目录下已经创建成功了 simple_docker 文件夹

ls /data
退出容器

exit
查看宿主机的 /data 目录, 并没有 simple_docker 文件夹, 说明容器内的操作不会影响到宿主机

ls /data
保存容器

查看所有的容器信息, 能获取容器的id

docker ps -a
然后执行如下命令[?],保存镜像:

docker commit -m="备注" 你的CONTAINER_ID 你的IMAGE

请自行将 -m 后面的信息改成自己的容器的信息

Docker容器的基本操作

docker [命令名] --help 查看命令介绍
docker run 创建并启动一个容器,在run后面加上-d参数,则会创建一个守护式容器在后台运行。
docker ps -a 查看已经创建的容器
docker ps -s 查看已经启动的容器
docker start con_name 启动容器名为con_name的容器
docker stop con_name 停止容器名为con_name的容器
docker rm con_name 删除容器名为con_name的容器
docker rename old_name new_name 重命名一个容器
docker attach con_name 将终端附着到正在运行的容器名为con_name的容器的终端上面去,前提是创建该容器时指定了相应的sh
执行这个命令后,按下回车键,会进入容器的命令行Shell中。
docker logs con_name 获取容器名为con_name的容器日志
docker inspect 查看容器的详细信息
docker top con_name 查看容器名为con_name的容器内部的进程
docker exec 可以用来在容器中运行一个进程

Docker的详细操作

不造轮子,请戳菜鸟教程。

shell脚本部署到Docker的一个小栗子

参考链接:

  • echo -e "\033[40;37m 黑底白字 \033[0m" 此方法是输入带上颜色
  • 清理镜像的操作是一系列的。具体情况具体分析。例如另一个例子:
  • $ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm,来自How to remove old Docker containers
  • awk是一个文本分析工具,找出文本指定位置的内容并print出来(解释不当)
# 声明变量
SERVER_HOST="root@xx.x.xxx.xx"
SERVER_PATH="/home/test/src"
BUILD_TIME=`date "+%Y%m%d%H%M"`
IMAGE_NAME="xxxx(docker镜像)"

# 传输之后特殊文件的修改
rsync -cavzP --delete-after ./ --exclude-from='.rsync-exclude' $SERVER_HOST:$SERVER_PATH
rsync -cavzP --delete-after ./node_modules/ftp-client $SERVER_HOST:$SERVER_PATH/node_modules


ssh $SERVER_HOST "\
  cd $SERVER_PATH; \
  echo "安装依赖"; \
  npm install; \
  echo "清理过时的测试镜像"; \
  docker images | awk '{ print \$3 }' | xargs docker rmi ; \
  echo "构建docker镜像 $IMAGE_NAME"; \
  docker build -t $MAGE_NAME . ;\
  echo "发布docker镜像"; \
  docker push $IMAGE_NAME ;\
  exit; \
  "

echo "\033[40;32m\n"
echo "Sync to Server: $MARKET_SERVER_HOST"
echo "Build source code path: $MARKET_SERVER_PATH"
echo "Image: $MARKET_IMAGE_NAME"
echo "Image deploy success"
echo "\033[0m"

Docker实践,利用DaoCloud来部署应用

该部分内容过多,请直接参考我的另一篇博客:Docker实践,利用DaoCloud来部署应用

如果感觉文章帮到你了,记得点赞哦!

<think>嗯,用户想了解Docker虚拟机上是怎样运行的。首先,我得理清楚Docker虚拟机的基本概念,以及它们之间的关系。Docker容器和虚拟机都是虚拟化技术,但它们的实现方式不同。虚拟机通过Hypervisor模拟完整的硬件环境,每个虚拟机都有自己的操作系统,而Docker则利用宿主机的内核,通过容器实现进程隔离,更轻量级。 接下来,用户可能想知道为什么要在虚拟机里运行Docker。可能的情况是用户在使用云服务,比如AWS EC2或者Azure VM,这些本身就是虚拟机,然后在里面部署Docker容器。这时候,Docker实际上是运行在虚拟机的客户操作系统上,而虚拟机又运行在宿主机上。这种情况下,层次结构是怎样的呢?应该是物理机 -> Hypervisor -> 虚拟机操作系统 -> Docker引擎 -> 容器。 需要解释这种架构的优势和潜在问题。优势可能包括环境隔离和跨平台兼容性,比如在Windows的虚拟机里运行Linux容器。但性能方面,由于多了一层虚拟化,可能会有额外的开销,比如网络和存储的延迟。不过现代虚拟化技术如KVM、Hyper-V对硬件虚拟化支持较好,可能性能损失不大。 另外,用户可能对具体的使用场景感兴趣,比如开发测试环境或者在云服务器中部署应用。这时候,Docker虚拟机里提供了一层更灵活的环境管理,同时利用虚拟机的资源隔离。可能还需要提到嵌套虚拟化的支持,有些环境可能需要开启特定的选项才能运行。 还需要注意Docker虚拟机中的配置,比如网络设置、存储卷的映射,以及资源分配(CPU、内存)的问题。比如,在虚拟机中分配给Docker的资源不能超过虚拟机本身分配的资源,否则会导致性能瓶颈。 可能用户也会混淆容器和虚拟机的区别,这时候需要强调Docker容器是进程级别的隔离,而虚拟机是操作系统级别的隔离。但两者可以结合使用,比如在虚拟机中运行容器,既利用虚拟机的强隔离性,又享受容器的轻量级优势。 最后,总结一下,Docker虚拟机上的运行方式,层次结构,优缺点,以及适用场景。确保解释清晰,结构合理,用例子帮助理解,比如开发者在本地用VirtualBox虚拟机Docker,或者在云服务器中使用Docker部署微服务。</think>### Docker虚拟机上的运行机制分步解析 --- #### 1. **基础架构分层** **物理机层** $$\text{物理服务器} \xrightarrow{\text{硬件资源}} \text{Hypervisor(虚拟化层)}$$ 例如:VMware ESXi、KVM、Hyper-V。 **虚拟机层** $$\text{Hypervisor} \xrightarrow{\text{分配资源}} \text{虚拟机(Guest OS)}$$ 虚拟机通过虚拟硬件(vCPU、虚拟内存、虚拟磁盘)运行完整的操作系统(如Ubuntu、CentOS)。 **Docker层** $$\text{Guest OS} \xrightarrow{\text{安装Docker引擎}} \text{容器(Container)}$$ Docker引擎直接调用虚拟机操作系统的内核,容器共享Guest OS内核,进程级隔离。 --- #### 2. **关键区别:容器 vs 虚拟机** | 特性 | Docker容器 | 虚拟机 | |-------------------|----------------------------|----------------------------| | 虚拟化对象 | 进程级隔离 | 操作系统级虚拟化 | | 启动速度 | 秒级(如$1\text{-}5s$) | 分钟级(如$30\text{-}60s$) | | 资源占用 | 低(仅需容器进程资源) | 高(需预分配完整OS资源) | | 镜像大小 | MB级(如$100\text{MB}$) | GB级(如$10\text{GB}$) | --- #### 3. **典型场景:虚拟机中运行Docker** **示例:开发环境搭建** 1. 物理机:MacBook(macOS系统) 2. 虚拟机:通过VirtualBox安装Ubuntu 3. Docker:在Ubuntu中运行MySQL容器 ```bash docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0 ``` **层级关系** $$\text{macOS} \rightarrow \text{VirtualBox} \rightarrow \text{Ubuntu VM} \rightarrow \text{Docker容器}$$ --- #### 4. **性能影响分析** - **CPU/内存**:容器直接使用虚拟机分配的vCPU和内存,无额外虚拟化开销。 - **网络**:需穿透两层虚拟化(虚拟机网络 + 容器网络),延迟可能增加$10\text{-}20\%$。 - **存储**:若使用虚拟机磁盘文件(如.vmdk),IO性能下降显著;建议挂载物理机目录到虚拟机,再映射到容器。 --- #### 5. **适用场景与注意事项** **适用场景** - 跨平台开发(如Windows/Mac通过Linux虚拟机运行容器)。 - 云服务器部署(如AWS EC2虚拟机中运行Docker集群)。 **注意事项** 1. 嵌套虚拟化需开启(如Azure VM需启用`嵌套虚拟化`选项)。 2. 资源分配:虚拟机至少需$2\text{GB}$内存 + $2\text{vCPU}$以流畅运行Docker。 3. 网络配置:建议使用`桥接模式`或`host`网络模式减少性能损失。 --- #### 6. **总结** Docker虚拟机中的本质是**双层虚拟化**: 1. 虚拟机提供操作系统级隔离环境。 2. Docker虚拟机内实现轻量级进程隔离。 优势是兼容性与安全性,代价是轻微的性能损耗。适合需要强隔离性但需快速部署的场景。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值