Docker环境搭建与使用:docker的简介与架构以及安装docker
Posted @李思成
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker环境搭建与使用:docker的简介与架构以及安装docker相关的知识,希望对你有一定的参考价值。
文章目录
Docker环境搭建与使用
一、Docker简介
1、什么是Docker
-
Docker
是一个开源的应用容器引擎,基于Go
语言 并遵从Apache2.0
协议开源。 -
Docker
可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux
机器上,也可以实现虚拟化。 -
容器是完全使用沙箱机制,相互之间不会有任何接口(类似
iPhone
的app
),更重要的是容器性能开销极低。
Docker
从17.03
版本之后分为CE
(Community Edition
: 社区版) 和EE
(Enterprise Edition
: 企业版),本次内容使用ce
版进行学习。
2、优点
-
快速,一致地交付您的应用程序
Docker
允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。容器非常适合持续集成和持续交付(
CI
/CD
)工作流程。 -
响应式部署和扩展
Docker
是基于容器的平台,允许高度可移植的工作负载。Docker
容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。Docker
的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。 -
在同一硬件上运行更多工作负载
Docker
轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker
非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
二、Docker
架构
1、三个基本概念
Docker
包括三个基本概念:
-
镜像(
Image
):Docker
镜像(Image
),就相当于是一个root
文件系统。比如官方镜像ubuntu:16.04
就包含了完整的一套Ubuntu16.04
最小系统的root
文件系统。 -
容器(
Container
):镜像(Image
)和容器(Container
)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 -
仓库(
Repository
):仓库可看成一个代码控制中心,用来保存镜像。
Docker
使用客户端-服务器(C/S
)架构模式,使用远程API
来管理和创建Docker
容器。
Docker
容器通过Docker
镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
2、运行原理
docker_host
是一个物理或者虚拟的机器用于执行Docker
守护进程和容器。
操作用户可以通过Docket
客户端完成从Registry
通过命令下载镜像到docker_host
。然后创建容器并运行容器。同时也可以通过Dockerfile文件来构建新的镜像,并将构建的镜像上传到远程仓库。
一个Docker Registry
中可以包含多个仓库(Repository
);每个仓库可以包含多个标签(Tag
);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>
:<标签>
的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest
作为默认标签。
repository
的完整格式为:[registry-host]:[port]/[username]/xxx
Docker远程仓库是开源的,我们还可以创建本地仓库,将自已创建镜像上传到本地仓库。
三、安装Docker
1、由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本:
$ sudo apt-get remove docker docker-engine docker-ce docker.io
2、更新apt包索引:
$ sudo apt-get update
3、安装以下包以使apt可以通过HTTPS使用存储库(repository):
$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
4、添加Docker官方的GPG密钥:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
5、使用下面的命令来设置stable存储库:
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
6、再更新一下apt包索引:
$ sudo apt-get update
7、安装最新版本的Docker CE:
$ sudo apt-get install -y docker-ce
8、查看docker服务是否启动:
$ systemctl status docker
若未启动,则启动docker服务:
$ sudo systemctl start docker
9、经典的hello world
:
$ sudo docker run hello-world # hello-world是一个测试镜像,直接可以运行
也可以下载centos容器镜像,然后使用命令输出指定文字
docker run ubuntu:20.04 /bin/echo '你好世界'
说明
docker
:Docker
的二进制执行文件run
: 与前面的docker
组合来运行一个容器。ubuntu:20.04
:指定要运行的镜像。Docker
首先从本地主机上查找镜像是否存在,如果不存在,Docker
就会从镜像仓库DockerHub
下载公共镜像并创建容器执行。/bin/echo
“你好世界”: 在启动的容器里执行的命令
10、将用户加入的docker
组中
sudo usermod -aG docker $USER # $USER获取当前用户
newgrp docker # 需更新docker用户组
Docker简介与搭建
Docker定义
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker的作用主要在于:让程序的运行环境得到充分虚拟与隔离的同时, 轻巧化.
我是不推崇过分详细阐述如何安装某一个软件的.首先版本不同,安装的命令,参数,方式本就不同,其次,不同的操作系统,不同的系统现有设置也会有影响..安装这种事儿,是非常容易过期的,再详尽的介绍也不一定适合自己.我只推荐一个地方:官网. 只需要选对自己的操作系统,基本都会很顺利
在这里梳理几个官网安装链接:
Docker的其他信息:
Docker(左)和传统虚拟化(右)的体系架构有这样2张经典的图解释:
显然,同样是为了虚拟化,解耦,第二种方式需要支撑起不同的操作系统运行,消耗较大.而docker仅仅是在Docker服务(由Docker引擎支撑)之下,使得程序在虚拟化环境中运行.
Docker产生的目的:
- 环境管理复杂,有各种各样的OS,中间件,App,一款产品能够成功发布,开发者需要关注过多琐碎的细节,管理困难,部署麻烦.
- 云计算时代的到来:(如AWS BPM的成功),引导开发者将应用转移到云上,这个虽然能大部分的解决硬件管理问题,然而软件配置和管理问题依然存在,Docker可以尝试新的软件管理办法解决这个问题.
- 虚拟化手段变化:云时代为了解决上述问题,采用标配硬件降低成本,采用虚拟化手段满足用户按需分配的资源需求和保证可用性和隔离性.但是这种虚拟化,往往用的是OS,GuestOS,对于Docker来说,这些虚拟化手段对资源的浪费是不小的.
Docker的4个性质:
- 隔离性: 每个用户实例时间相互隔离,互不影响. 一般的硬件虚拟化给出的方法是VM,而LXC给出的方法是container,更细一些讲就是kernel namespace.其中pid、net、ipc、mnt、uts、user等namespace将container的进程、网络、消息、文件系统、UTS("UNIX Time-sharing System")和用户空间隔离开。
- 可配额/可度量: 提供类似文件的接口,在文件夹中新建task文件,写入相关配置可以实现对进程的资源控制.
- 便携性:支持将不同目录挂在到同一个虚拟文件系统下. 例如将宿主机器的硬盘挂载到容器上,使得在不改变image的基础上,允许用户进行读写操作.
- 安全性:实现的Linux系统固有的安全标准, Docker Deamon的安全接口,
比较传统虚拟化和docker,两种方式还有2个比较大的不同:
- 传统虚拟化方式并没有严格要求在一个虚拟操作系统中只运行一个程序,是相对自由的一整个生态系统,里面不严格地有许多程序在运行.
- Docker在启动镜像的时候,无论是在命令的设置上,还是其根本的理念上,都希望用户使得一个容器只运行一个应用程序,可以形象理解成,一个鱼缸里只养一条鱼.因此,大家也可以参考这里十项Docker不该做的事儿
但是这2种虚拟化方式其实还是有些类似的地方的,比如:都是以镜像(images)为启动基础的,不同的镜像保存不同的系统/状态. 需要的时候,只需要读取某个镜像即可.
镜像和容器是2个很关键的概念.镜像可以理解为某种用以加载的资源,而容器,是运行着的镜像的实例.一个镜像可以有多个容器.
参考:[镜像(image)是动态的容器的静态表示(specification),包括容器所要运行的应用代码以及运行时的配置。Docker 镜像包括一个或者多个只读层( read-only layers ),因此,镜像一旦被创建就再也不能被修改了。一个运行着的Docker 容器是一个镜像的实例( instantiation )。]
我们可以在利用docker的commit命令将容器固化,将动态的镜像实例变成该瞬间的一个新的镜像.
生成镜像的两种方法:
- 利用一个已有的(来自本地/hub的)镜像创建一个容器,进入容器运行一些命令,利用docker commit生成新镜像.
- 在某个自己的目录,创建Dockerfile,在其中指挥一系列动作,直接用docker build利用已有的(来自本地/hubd)镜像创建一个镜像. // 这是更被推崇的方式
生成镜像的2种方法可以参考这篇文章
- 可以得到从一个基础镜像,最终生成自己想要的镜像: 或者是对元数据的修改,或者是对文件系统的修改.
- Docker在执行指令之后会创建临时镜像存储在cache中
- Docker镜像是基于基础镜像的多层叠加. 当Docker创建一个容器时,它会在基础镜像的容器层上添加一层可写容器层,接下来对容器的话是在这个层是进行的.
附10件使用容器时应避免的做法:
- 不要在容器中保存数据(Don’t store data in containers)
- 将应用打包到镜像再部署而不是更新到已有容器(Don’t ship your application in two pieces)
- 不要产生过大的镜像 (Don’t create large images)
- 不要使用单层镜像 (Don’t use a single layer image)
- 不要从运行着的容器上产生镜像 (Don’t create images from running containers )
- 不要只是使用 “latest”标签 (Don’t use only the “latest” tag)
- 不要在容器内运行超过一个的进程 (Don’t run more than one process in a single container )
- 不要在容器内保存 credentials,而是要从外面通过环境变量传入 ( Don’t store credentials in the image. Use environment variables)
- 不要使用 root 用户跑容器进程(Don’t run processes as a root user )
- 不要依赖于IP地址,而是要从外面通过环境变量传入 (Don’t rely on IP addresses )
参考资料:
以上是关于Docker环境搭建与使用:docker的简介与架构以及安装docker的主要内容,如果未能解决你的问题,请参考以下文章
Docker搭建漏洞靶场(VulhubVulnappVulfocus)
windows 11 搭建 TensorFlow GPU 开发环境RTX 3060:2 -- 基于WSL2 docker 方式的使用