docker

1、云原生

1.1、什么是云原生

云原生(CloudNative)指的是基于在云中构建、运行应用程序的理念,而打造的一套技术体系。不同于传统数据中心的软件开发、构建模式,云原生包含有“原生为云而设计”的含义,能够有效提升云上资源利用率、缩短开发周期

1.2、云原生架构

从技术的角度出发,云原生架构是基于云原生技术的一组架构原则和设计模式的集合,旨在帮助企业和开发人员充分利用云平台所提供的平台化能力和弹性资源能力

简单说就是业务代码和基础平台分割,进行指责划分。打造Paas(平台即服务)、技术产品化思维

1.3、虚拟技术发展


传统部署时代: 在物理服务器上运行应用程序

  • 应用程序无法定义资源边界,这会导致资源分配问题
  • 解决资源竞争,不同服务器上运行不同程序。维护成本、服务器成本提升

虚拟化部署时代:为了资源隔离问题,引入了虚拟化

  • 虚拟化很好地利用服务器资源,可伸缩性,轻松地管理应用程序,降低硬件成本等
  • 每个VM都是一台完整的计算机,包括其自己的操作系统
  • 主流虚拟技术 :

容器部署时代:容器类似于VM,但是它们具有轻松的隔离属性

  • 容器被认为是轻质的。与VM相似,容器具有自己的文件系统,CPU,内存,进程空间等
  • 可以在应用程序之间共享操作系统
  • 主流容器技术 :

2、Docker什么?


Docker是一个用于开发,交付和运行应用程序的开放平台
Docker是基于Go语言实现的开源容器项目。它诞生于2013年初,最初发起者是dotCloud公司,在2013年年底直接改名为Docker Inc。并专注于Docker相关技术和产品的开发,目前已经成为全球最大的Docker容器服务提供商。官方网站为docker.com

Docker的构想是要实现"Build, Ship and Run Any App, Anywhere",即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的一次构建(封装),到处运行

3、Docker架构

Docker使用客户端-服务器架构。Docker客户端与Docker守护进程对话,后者负责构建、运行和分发Docker容器的繁重工作。Docker 客户端和守护程序可以运行在同一系统上,或者您可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护进程使用REST API、UNIX 套接字或网络接口进行通信。另一个Docker客户端是Docker Compose,它允许您使用由一组容器组成的应用程序

Docker架构升级

Docker首次发布时,Docker引擎由两个核心组件构成:LXC(Linux Container)和Docker daemon
Docker daemon是单一的二进制文件,包含诸如Docker客户端、Docker API、容器运行时、镜像构建等
LXC提供了对诸如命名空间(Namespace)和控制组(CGroup等基础工具的操作能力,它们是基于Linux内核的容器虚拟化技术Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源

首先,LXC是基于Linux的。这对于一个立志于跨平台的项目来说是个问题,其次,如此核心的组件依赖于外部工具,这会给项目带来巨大风险,甚至影响其发展

因此,Docker公司开发了名为Libcontainer的自研工具,用于替代LXC。Libcontainer的目标是成为与平台无关的工具,可基于不同内核为Docker上层提供必要的容器交互功能。在Docker 0.9版本中,Libcontainer取代LXC成为默认的执行驱动

OCI:当Docker公司正在进行Docker daemon进程的拆解和重构的时候,OCI也正在着手定义两个容器相关的规范(或者说标准)。比如:镜像规范和容器运行时规范。两个规范均于2017年7月发布了1.0版

所有的容器运行代码在一个单独的OCI兼容层中实现。默认情况下,Docker使用runc来实现这一点。runc是OCI容器运行时标准的参考实现

Runc : runc是OCI容器运行时规范的参考实现。Docker公司参与了规范的制定以及runc的开发。去粗取精,会发现runc实质上是一个轻量级的、针对Libcontainer进行了包装的命令行交互工具(Libcontainer取代了早期Docker架构中的LXC)。

containerd在Linux和Windows中以daemon的方式运行,从1.11版本之后Docker就开始在Linux上使用它。Docker引擎技术栈中,containerd位于daemon和runc所在的OCI层之间。Kubernetes也可以通过cri-containerd使用containerd。containerd是由Docker公司开发的,并捐献给了云原生计算基金会(CloudNative Computing Foundation, CNCF)

4、Docker安装

1、卸载老的版本
sudo yum remove docker \
 docker-client \
 docker-client-latest \
 docker-common \
 docker-latest \
 docker-latest-logrotate \
 docker-logrotate \
 docker-engine
2、设置仓库
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3、安装docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
注意 : 
1、老版本需要docker compose的单独安装,新版本docker集成了docker compose,不需要单独安装
2、如果是阿里云ECS云主机,中文乱码解决方式参考 : https://blog.csdn.net/qq_41661056/article/details/105730143
3、阿里云镜像加速器
阿里云 -> 页面搜索 -> 容器镜像服务 -> 镜像工具 -> 镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
 "registry-mirrors": ["https://xxx.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

5、Docker组件

5.1、镜像

  • 把Docker镜像理解为VM模板,VM模板就像停止运行的VM,而Docker镜像就像停止运行的容器
  • 镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象
  • 镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包

5.2、镜像分层


Docker镜像由一些松耦合的只读镜像层组成。所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层

示例 :

[root@node1 wordpress]# docker run -itd nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
0131fa2a222628418fe7462dfadcb2ccec2c3a333a58b8f875d211a7ec4772e1
[root@node1 wordpress]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
bjbfd/nginx latest 605c77e624dd 17 months ago 141MB
nginx latest 605c77e624dd 17 months ago 141MB
wordpress latest c3c92cc3dcb1 17 months ago 616MB
mariadb 10.6.4-focal 12e05d5da3c5 19 months ago 409MB
bjbfd/stress latest 89e5b79daa74 7 years ago 215MB
[root@node1 wordpress]#
[root@node1 nginx]# cat Dockerfile
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
基于nginx基础镜像构建一个镜像
[root@node1 nginx]# docker build -t nginx:v1 .
[+] Building 0.1s (6/6) FINISHED
 => [internal] load build definition from Dockerfile 0.0s
 => => transferring dockerfile: 133B 0.0s
 => [internal] load .dockerignore 0.0s
 => => transferring context: 2B 0.0s
 => [internal] load metadata for docker.io/library/nginx:latest 0.0s
 => [1/2] FROM docker.io/library/nginx 0.0s
 => CACHED [2/2] RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html 0.0s
 => exporting to image 0.0s
 => => exporting layers 0.0s
 => => writing image sha256:a805671892075472b21360ead42fb53a2ad798b0ab56bab450c52d428ce1441b 0.0s
 => => naming to docker.io/library/nginx:v1 0.0s
[root@node1 nginx]#
[root@node1 nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 a80567189207 2 days ago 141MB
bjbfd/nginx latest 605c77e624dd 17 months ago 141MB
nginx latest 605c77e624dd 17 months ago 141MB
wordpress latest c3c92cc3dcb1 17 months ago 616MB
mariadb 10.6.4-focal 12e05d5da3c5 19 months ago 409MB
bjbfd/stress latest 89e5b79daa74 7 years ago 215MB
[root@node1 nginx]#

对比两个镜像的层

docker inspect nginx:latest
LowerDir 如下 :
/var/lib/docker/overlay2/b00f6bf28e2dc408c796f09ad94d3f28c64e0a28cbdd6964087e2b26228b2328/diff:
/var/lib/docker/overlay2/ca904171aa0883178d573b413ca24013e624e90395197a2e4914ebbae8388e7d/diff:
/var/lib/docker/overlay2/4885892662a64db663878aee6f36c32d8196195e47a20ff2e0680256e28c20ac/diff:
/var/lib/docker/overlay2/4eb0162b58d4f18bca9c0d48fb39f275dfbf92a59227dc380b7d36f614b45a4e/diff:
/var/lib/docker/overlay2/a8c3e0d43b8b27fd19a575c3051c9cea6450d39d8fbb58c3d34c7d8b898d3b97/diff
docker inspect nginx:v1
LowerDir 如下 :
/var/lib/docker/overlay2/9d155c02707c57771128e397e6e43c9c9691a544e8e5749b87da9ebc5857f554/diff:
/var/lib/docker/overlay2/b00f6bf28e2dc408c796f09ad94d3f28c64e0a28cbdd6964087e2b26228b2328/diff:
/var/lib/docker/overlay2/ca904171aa0883178d573b413ca24013e624e90395197a2e4914ebbae8388e7d/diff:
/var/lib/docker/overlay2/4885892662a64db663878aee6f36c32d8196195e47a20ff2e0680256e28c20ac/diff:
/var/lib/docker/overlay2/4eb0162b58d4f18bca9c0d48fb39f275dfbf92a59227dc380b7d36f614b45a4e/diff:
/var/lib/docker/overlay2/a8c3e0d43b8b27fd19a575c3051c9cea6450d39d8fbb58c3d34c7d8b898d3b97/diff

看到不一样了么?就是v1比latest多了一层,/var/lib/docker/overlay2/9d155c02707c57771128e397e6e43c9c9691a544e8e5749b87da9ebc5857f554/diff:

5.3、容器

  • 在虚拟机模型中,一旦启动,就会占有机器上的全部物理资源,如CPU、RAM、存储等
  • 容器引擎可以获取系统资源,比如进程树、文件系统以及网络栈,接着将资源分割为安全的互相隔离的资源结构,称之为容器

5.4、容器测试

[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 a80567189207 2 days ago 141MB
bjbfd/nginx latest 605c77e624dd 17 months ago 141MB
nginx latest 605c77e624dd 17 months ago 141MB
wordpress latest c3c92cc3dcb1 17 months ago 616MB
mariadb 10.6.4-focal 12e05d5da3c5 19 months ago 409MB
bjbfd/stress latest 89e5b79daa74 7 years ago 215MB
[root@node1 ~]# docker run -itd nginx:v1
7d63e23cd145290fd49108049940b470f00bea5fc78f5a5dd83288493356415b
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7d63e23cd145 nginx:v1 "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 80/tcp stupefied_fermi
10cc2cc80377 nginx:latest "/docker-entrypoint.…" 31 seconds ago Up 30 seconds 80/tcp great_edison
[root@node1 ~]# docker exec -it 7d63e23cd145 /bin/bash
root@7d63e23cd145:/# curl 127.0.0.1
这是一个本地构建的nginx镜像
root@7d63e23cd145:/#

5.5、容器生命周期

5.6、docker仓库

  • 仓库(Repository)是集中存放镜像的地方,又分公共仓库和私有仓库
  • 注册服务器(Register)是来保存仓库的服务器。一个Register可以支持多个仓库
  • Docker运行中使用的默认仓库是Docker Hub公共仓库
    简单说,就像maven仓库一样,有本地仓库和原生仓库,本地仓库用来缓存一些包,远程仓库用来保存第三方包,供自己远程发布让别人使用及使用别人的第三方包
登录,输入用户名/密码,因为我已经登录,所以直接success
[root@node1 ~]# docker login
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 a80567189207 2 days ago 141MB
bjbfd/nginx latest 605c77e624dd 17 months ago 141MB
nginx latest 605c77e624dd 17 months ago 141MB
wordpress latest c3c92cc3dcb1 17 months ago 616MB
mariadb 10.6.4-focal 12e05d5da3c5 19 months ago 409MB
bjbfd/stress latest 89e5b79daa74 7 years ago 215MB
[root@node1 ~]# docker tag bjbfd/nginx:latest bjbfd/nginx:v1
[root@node1 ~]# docker push bjbfd/nginx:v1
The push refers to repository [docker.io/bjbfd/nginx]
d874fd2bc83b: Layer already exists
32ce5f6a5106: Layer already exists
f1db227348d0: Layer already exists
b8d6e692a25e: Layer already exists
e379e8aedd4d: Layer already exists
2edcec3590a4: Layer already exists
v1: digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3 size: 1570
[root@node1 ~]#

查看 http://hub.docker.com/

如感兴趣,点赞加关注,谢谢!!!

作者:journey原文地址:https://segmentfault.com/a/1190000043839515

%s 个评论

要回复文章请先登录注册