共计 4047 个字符,预计需要花费 11 分钟才能阅读完成。
Docker 与 容器
Docker 是基于 容器技术 实现的,因为 Docker 的炽热风行,可能很多人会认为容器是 Docker 独有的技术。
实际上,容器技术最开始是基于 Linux Container(简称 LXC)技术实现的,通过内核提供的 Namespace
和 Cgroup
机制,实现了对应用程序的 隔离 以及物理资源的 调配。起初随着 Docker 的发展壮大,容器技术越来越被更多的公司承受,才倒退出了规范容器技术。
容器技术和虚拟机(虚拟化)技术有点像,它们两者都提供了 环境隔离 的性能。不同的是。容器是运行在操作系统上的一个过程,它和其余应用程序是共享内核的,由 操作系统 提供虚拟化隔离性能;而虚拟机则是完完全全 另起了个操作系统,将环境隔离的更加彻底。
Docker 在容器根底上倒退出了一个欠缺的生态系统,它将容器视为一种打包格局,将应用程序所需的所有,比方依赖库、运行时环境等都汇合在了在一起,使得 一次构建,到处运行。
这也是 Docker 为什么能发展壮大的起因,它将 开发与运维 很好的交融在一起。开发人员能够很轻松的 构建、打包、推送和运行 应用程序。而且还容许咱们将容器视为部署单元,以 模块化 的形式公布,升高了零碎的运维治理难度。
Docker 基本概念
镜像和容器是 Docker 的外围概念,把握了它们,也就明确了 Docker 在做什么事了。镜像是一个 模板文件,就像咱们以前装置零碎时用到的光盘,有了这张光盘,就能够随时将应用程序跑起来,而不须要本人手动的去构建应用程序所须要的所有,因为它曾经在镜像里安顿的明明白白了。
而容器是镜像的运行实例,咱们能够把镜像看成是一个个的构建块,容器依据这些构建块搭建起了一个隔离的,领有整个包的应用程序。每一个容器都是一个 标准化 单元,确保了在不同机子上也能领有统一的行为。
Docker 的镜像是一个 分层 的文件系统,通过一层层的组合,使得咱们能够复用这些不同粒度的镜像文件,像 Alpine 镜像、Ubuntu 镜像等根底镜像文件。
Docker 也是一个凋谢的程序构建运行平台,当咱们将一个镜像构建实现后,就能够将其上传到一个集中存储、散发的 仓库 了。这样,每当咱们或其他人想要基于镜像构建程序的时候,就能够从仓库对立拉取,进行后续动作。
Docker 的仓库就像 app 的利用商店一样,制作人负责将做好的镜像上传上去,其他人只须要依据下载地址 Download 下来应用就行了。像 Docker 官网的 Docker Hub,还有阿里云的镜像仓库,都提供了此性能。当然,咱们也能够搭建公有仓库,进行访问控制。
Docker 的搭建
好了,是时候开始入手搭建属于咱们的 Docker 服务了,这里咱们的环境为 Ubuntu 操作系统。
卸载旧版本
如果咱们之前装置过 docker , 先卸载:
sudo apt-get remove docker docker-engine docker.io containerd runc
更新 apt 包索引并且增加应用 HTTPS 传输的软件包以及 CA 证书:
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
增加 Docker 官网的 GPG 密钥:
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
设置稳固存储库:
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
装置 Docker 引擎:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
通过运行 hello-world 镜像验证 Docker Engine 是否已正确装置:
sudo docker run hello-world
如果容器运行打印了音讯,则示意装置好了。
Docker 的常用命令:
容器生命周期治理: run、start/stop/restart、kill、rm、pause/unpause
容器操作:ps、inspect、top
镜像仓库:login、pull、push、search
本地镜像治理:images、rmi、tag、build、history
例如,当咱们须要运行一个容器时,则能够执行:
docker run nginx:test
当咱们把握这些常用命令后,就能够间接在 Docker 上构建起咱们的容器程序了。
数据卷
当咱们应用下面的命令 run 了一个容器,前面对其 kill 重启后,就会发现原来在容器里的相干数据、文件操作都会失落,就如同回到最开始的状态一样。
这是因为容器退出后并不能对镜像进行批改操作,所以从新加载后,还是应用原来的镜像构建。
如果咱们想要对数据进行长久化,不随容器完结而完结,那咱们须要将宿主机的某一文件目录挂载到容器里,通过映射的办法来实现 Docker 的 长久化。在 Docker 里提供了三种办法来实现目录的挂载:
volumes
当咱们创立一个 volume
时,将会在 Docker 的主机上创立一个绝对应的目录。这个目录就是用来映射到容器中的。后续容器里对此目录的操作都会反映到主机上,因而也就实现了 Docker 的长久化。
能够应用 docker volume create
来创立卷,一个卷能够同时给几个容器应用,这意味着容器之间能够利用同一个卷来实现数据的 共享.
bind mounts
bind mounts
只须要存在一个实在的目录即可挂载到容器中,当 bind 的目录不存在时会创立一个新的目录。绑定挂载十分高效,但它们依赖于主机的具备特定目录构造的文件系统,比方从 Linux 切换为了 Windows,就会应用不了了。
tmpfs
tmpfs 挂载
仅存储在主机零碎的 内存 中,不会长久保留在磁盘上。容器能够应用它来共享简略状态或非敏感的信息。
咱们能够通过上面的图来看看三种的区别:
咱们重点来看下 volumes 的相干操作。
当咱们应用 docker volume create
创立卷之后,默认会在 /var/lib/docker/volumes
里有其对应的目录构造。
接着,咱们就能够在 run 命令里应用卷了,例如
docker volume create my-vol
docker run -d \
--name devtest \
-v my-vol:/app \
nginx:latest
这样的话,就会将卷挂载到容器对应的目录了,实现长久化了。
当咱们不应用时,能够应用 docker volume rm my-vol
来删除卷。但如果咱们删除容器,并不会同时删除卷,如果想在删除容器时也同时删除卷,则须要执行 docker rm -v my-vol
命令。
网络
因为 Docker 上的容器是互相隔离的,所以当咱们想要进行容器之间的通信时,并不能简略的像过程通信那样。
Docker 在装置时,默认会为咱们创立三种类型的网络,咱们能够通过这个命令看到对应的网络类型:
docker network ls
NETWORK ID | NAME | DRIVER | SCOPE |
---|---|---|---|
a1a862a7c667 | bridge | bridge | local |
bec784838efe | host | host | local |
cdc833fa220a | none | null | local |
bridge 模式
Docker 在主机上会创立一个 docker0
的网桥,每当有容器要创立时,便会为容器调配一个独立的网卡,而后桥接到虚构网桥上。
这其实就是一对虚构网卡,一端放在容器里,另一端放在 docker0
网桥里。当一端有数据达到时,就会把数据包转发到另一端上,这就实现了网络通信。
在 Docker 里是容许咱们自建网络的,比方应用上面的命令就能够创立一个 bridge 的网络了:
# 创立自定义网络
docker network create my-net
而后,咱们在创立一个容器时,就能够这么应用了:
# 应用自定义网络
docker run -d --name tomcat-my-net --net my-net tomcat
host 模式
咱们晓得,Docker 应用了 Linux 的 Namespaces 来进行资源的隔离,包含了 网络隔离。所以咱们创在建一个容器时,个别会为容器调配一个独立的 Network Namespace 以进行网络隔离。
如果咱们应用了 Host
模式,则不再调配 Network Namespace,而是和 宿主机 共用一个 Network Namespace。此时容器将不再领有本人的虚构网卡、IP 和端口,而是和宿主机 共用 一个 IP 和端口。
docker run -d --name tomcat-my-net --net=host tomcat
none 模式
应用 none 模式的容器领有属于本人的 Network Namespace,但不做任何网络配置。它和宿主机以及其余容器是不互通的。如果须要和内部通信,则须要自定义网络驱动程序,本人增加网卡、配置 IP 等。
docker run -d --name tomcat-my-net --net=none tomcat
网络应用总结
- 当你须要多个容器在同一个 Docker 主机上进行通信时,自定义的桥接网络是最佳抉择。
- 如果想间接让外界拜访容器利用,去掉容器与 Docker 宿主机的网络隔离,则能够应用 host 模式。
- 如果容器平安要求高,不想与其余容器利用通信,则能够应用 none 模式。
感兴趣的敌人能够搜一搜公众号「阅新技术」,关注更多的推送文章。
能够的话,就顺便点个赞、留个言、分享下,感激各位反对!
阅新技术,浏览更多的新常识。