如VMware, VisualBox, KVM, XEN之类的传统虚拟机,需要在宿主机上模拟整台电脑的硬件,然后在这个虚拟的硬件上安装我们需要的操作系统。虚拟机开启后,预先分配给它的资源(如CPU time, Memory, 磁盘空间等)将全部占用。
容器类似我们理解的瓶瓶罐罐,或者说是集装箱。传统的hypervisor(KVM, XEN)环境中,每个虚拟机都需要运行一个完整的操作系统以及其中安装好的大量应用,这让每次的发布部署任务变得很重,运行性能低下。往往实际使用时,我们更多关注的是我们需要部署的应用程序本身。例如,我们需要部署一个IPSec VPN Service, 但我不想去关心底层的操作系统和环境等等这些和我应用无关的东西(就是不想每次都去创建一个虚拟机,安装系统、调试环境变量,安装依赖库等等),而是做好这个IPSec VPN Service(可执行程序、依赖库、配置文件等)后,封装在一个集装箱里,在任何其他主机上,只要将这个集装箱装载,就可在它本地主机开始IPSec VPN Service服务。
Linux Container(LXC)容器技术因此而诞生, 它是一种内核轻量级OS虚拟技术,通过namespace和cgroup两大机制来保证我们的应用集装箱能共享宿主机的操作系统和依赖环境。 Namespace技术实现隔离,cgroup技术实现资源的管理(如何共享,使用多少内存、什么能用,什么不能用等)。
名字空间
Namespace ---- 隔离内容
cgroup的四大功能:
cgroup的特点:
docker是一个开源的应用容器引擎,基于go语言开发并遵循apache2.0开源协议。docker可以让开发者打包他们的应用、依赖包等到一个轻量级、可移植的容器中,然后发布到任何流行的Linux服务器,也可以实现虚拟化。容器完全使用沙箱机制,相互之间不会有任何接口,并且容器开销极其低。
通过镜像启动一个容器(镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,库、环境变量、和配置文件等)。
容器是镜像的运行实例(镜像与容器的关系,类似于面向对象中class和instance之间的关系),当镜像运行时有镜像状态和用户进程,可以使用docker ps 查看。
docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作
Docker的安装
在docker的文档中,安装写的非常的详细(安装步骤也非常的简单)
https://docs.docker.com/install/linux/docker-ce/centos/
启动docker
systemctl start docker
Hello world测试
docker run hello-world
查看当前所有创建的container
rm –rf /var/lib/docker
卸载docker
rm –rf /var/lib/docker
删除docker下载文件和下载的镜像
rm –rf /var/lib/docker
image镜像
docker镜像可以看做是一个特殊的只读文件模板,出了包含容器运行时所需要的程序、库、资源、配置等文件外,还包含了一些为运行时准备的配置参数(如匿名卷、环境变量、用户等), 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
我们可以通过docker images,查看系统当前的镜像信息
其中Repository是镜像的获取途径和名称,TAG标注着Image的版本信息(最新镜像为latest), IMAGE ID是IMAGE的唯一标识。
container容器
docker利用容器来运行应用,容器是根据镜像创建的运行实例,它可以被启动,开始、停止、删除、每个容器都是互相隔离的,保证安全的平台,可以把容器看做是要给简易版的Linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序
Container与Image的关系
镜像(Image)就是一堆只读层(read-only layer)的统一视角。统一文件系统 (union file system) 技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。我们可以在图片的右边看到这个视角的形式。
容器 (container) 的定义和镜像 (image) 几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
repository仓库
仓库是集中存储镜像文件的位置。仓库分为两种,公有参考,和私有仓库,最大的公开仓库是docker Hub,存放了数量庞大的镜像供用户下载,国内的docker pool,这里仓库的概念与Git类似,registry可以理解为github这样的托管服务, 每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
docker安装完成后,我们可以通过查看或修改其仓库位置,或是创建新的仓库(pull register)
cat /etc/yum.repos.d/docker-ce.repo
Docker镜像执行
简单的镜像执行过程描述图
Docker的一些基本操作
docker image
查看本地image信息
docker images (docker image ls)
pull从镜像仓库中下载镜像
docker image pull (push)
上传镜像到仓库
docker image push
获得镜像的详细信息
docker image inspect
docker image inspect ipsec-vpn-server:version4
删除镜像
docker rmi
[root@localhost ~]# docker rmi hello-world
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container f494b6e46cf5 is using its referenced image fce289e99eb9
出现此错误时因为镜像已经创建了容器,需要先删除应用的容器(docker ps –a 查看所有的容器),然后再执行docker rmi
[root@localhost ~]# docker rmi hello-world
Docker container
删除container
查看当前所有的container信息(包括正在运行的和创建但未启动的)
根据container ID删除容器
删除正在运行的container会提示错误,需要运行docker stop container-id方式先停止运行,然后通过docker ps查看是否已停止运行,再运行docker rm删除container.
docker commit
将容器中的修改保存并创建新的image(可通过tag: version4与原有的镜像进行区别)
docker commit 084bc4bdc5a0 ipsec-vpn-server:version4
保存后,将原有的容器停止并删除容器,使用新的镜像启动,可见加载有,所有的修改都存在。
docker run
--name ipsec-vpn-server
--env-file ./vpn.env
--restart=always
-p 500:500/udp
-p 4500:4500/udp
-d --privileged
ipsec-vpn-server:version4
docker exec
进入容器并执行命令
如,进入容器的CLI交互界面
docker exec -it ipsec-vpn-server env TERM=xterm bash -l
执行容器内的命令:
docker exec -it ipsec-vpn-server ipsec whack --trafficstatus
在容器内安装应用程序
apt-get update && apt-get -y install nano
页面更新:2024-05-07
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号