Docker 与 容器

Docker 是基于容器技术实现的,因为 Docker 的炽热风行,可能很多人会认为容器是 Docker 独有的技术。

实际上,容器技术最开始是基于 Linux Container(简称 LXC)技术实现的,通过内核提供的 NamespaceCgroup 机制,实现了对应用程序的隔离以及物理资源的调配。起初随着 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 updatesudo 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-voldocker 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 IDNAMEDRIVERSCOPE
a1a862a7c667bridgebridgelocal
bec784838efehosthostlocal
cdc833fa220anonenulllocal

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 模式。

感兴趣的敌人能够搜一搜公众号「 阅新技术 」,关注更多的推送文章。
能够的话,就顺便点个赞、留个言、分享下,感激各位反对!
阅新技术,浏览更多的新常识。