一.什么是容器?
容器是一种轻量级、可移植的软件打包和隔离技术。它将应用程序及其所有依赖项(如库、配置文件、二进制文件等)打包在一个独立的单元中,以确保应用程序可以在任何环境中一致地运行。容器利用了操作系统的虚拟化功能,但比传统的虚拟机更高效和轻量。
容器的特点
轻量级:
与虚拟机不同,容器不需要包含一个完整的操作系统。它们共享主机操作系统的内核,从而减少了开销和启动时间。
可移植性:
容器封装了应用程序及其所有依赖项,确保在不同环境中运行时保持一致性。这意味着你可以在开发环境中创建一个容器,并将其无缝地移植到测试或生产环境中。
隔离性:
每个容器都是独立的,具有自己的文件系统、进程空间和网络接口。这种隔离确保了一个容器中的应用程序不会干扰其他容器中的应用程序。
快速启动:
容器的启动速度非常快,通常在几秒钟内就能启动并运行,这比启动一个虚拟机快得多。
资源利用效率高:
由于容器共享主机操作系统的内核,它们比虚拟机更节省资源,能够在同一台主机上运行更多的应用实例。
容器对比虚拟机有什么区别?
虽然容器和虚拟机都提供了应用程序隔离的能力,但它们的工作原理和资源利用方式有很大的不同。
虚拟机(VM):
每个虚拟机都有自己的完整操作系统,包括内核,这使得虚拟机比较重,启动时间较长,占用更多的资源。
容器:
容器共享主机操作系统的内核,不需要独立的操作系统,这使得容器更轻量、启动更快、资源利用更高效。
容器的工作原理
镜像(Image):
容器镜像是一个只读的模板,包含了应用程序及其运行所需的所有内容。镜像可以看作是容器的蓝图,从中可以创建一个或多个容器。
容器(Container):
容器是镜像的一个运行实例。它从镜像中创建,并包含了运行应用程序所需的所有内容。在运行时,容器可以有自己的文件系统、网络接口、进程空间等。
Docker 引擎:
Docker 引擎是一个轻量级的容器运行时,用于创建、运行和管理容器。它包括一个守护进程(daemon),一个 REST API,以及一个命令行界面(CLI)。
容器的主要技术
Namespace:
Namespace 提供了一个隔离的执行空间,让每个容器都有自己的进程空间、网络接口、文件系统等,从而实现容器间的隔离。
namespace有六个他们分别是
pid namespace(进程隔离)
net namespace(网络隔离)
ipc namespace(进程间交互隔离)
mnt namespace(文件系统隔离)
uts namespace(主机名、域名隔离)
user namespace(用户隔离)
Control Groups(cgroups):
cgroups 控制和限制容器使用的资源,如 CPU、内存、磁盘 I/O 等,确保每个容器都能公平地使用系统资源。
Union File System(UnionFS):
UnionFS 是一种分层的文件系统,允许将多个文件系统叠加在一起形成一个统一的文件系统。Docker 使用 UnionFS 来构建容器镜像和容器,使得镜像可以由多个层组成,每一层都可以共享和复用。
最后了解一下使用容器的优势
一致性和可移植性:
无论是开发、测试还是生产环境,容器中的应用程序运行效果一致,减少了环境配置带来的问题。
高效的开发和部署:
开发人员可以快速构建、测试和部署应用程序,缩短了开发周期。
更好的资源利用:
通过共享操作系统内核和使用 cgroups,容器能够更高效地利用系统资源。
简化的管理:
容器化应用程序的管理更加简单,可以轻松地启动、停止、重启和监控容器。
二、容器部署nginx
实验环境
centos7.9
已安装docker-ce-20.10.20版本
实验步骤
经过上面的了解,我们知道镜像是容器运行的基础,所以我们需要先下载镜像
我们可以先搜索nginx的镜像
[root@vm1 ~]# docker search nginx
可以看到有很多版本,后面带OK的则是官方版本
本次下载的版本为1.20,比较稳定
[root@vm1 ~]# docker pull nginx:1.20
然后查看一下
[root@vm1 ~]# docker images
可以看到我们刚刚下载好的nginx
以下信息分别是
名称 标签 id 创建时间 大小
我这里创建时间长是因为我之前已经下载过了
让我们运行容器
[root@vm1 ~]# docker run -d -p 80:80 nginx:1.20
docker run:这部分指示Docker运行一个新的容器。
-d:这是一个选项,代表“detached”(分离模式),它告诉Docker在后台运行容器。这意味着容器将在后台运行,并且不会占据当前终端的控制权。
-p 80:80:这也是一个选项,用于指定端口映射。这里的80:80表示将容器内部的80端口映射到宿主机(即宿主操作系统)的80端口,这样外部请求就可以通过宿主机的80端口访问到运行在容器内的Nginx服务。
nginx:1.20:这是指定要运行的镜像名称及版本标签。在这里,它指示Docker运行一个名为nginx的镜像,版本为1.20。
查看容器
[root@vm1 ~]# docker ps -a
看到up就是运行成功了!
让我们创建一个测试页面并拷贝进容器内
[root@vm1 ~]# echo "nginx is running" > index.html
[root@vm1 ~]# docker cp index.html 96:/usr/share/nginx/html/
docker cp 复制文件到容器内
格式
docker cp 文件 容器id:路径
最后用浏览器查看一下结果
记得关闭防火墙关闭沙盒和开启路由转发
临时关闭防火墙
[root@vm1 ~]# systemctl stop firewalld
临时关闭沙盒
[root@vm1 ~]# setenforce 0
开启路由转发
[root@vm1 ~]# echo "net.ipv4.ip_forward" >> /etc/sysctl.conf
[root@vm1 ~]# sysctl -p
最后用浏览器查看结果就行了
直接访问你这台服务器的ip,我这里是192.168.10.11
实验完成
如果对您有帮助就点个赞吧