云原生技术之Docker入门

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 1. 为什么需要容器?下图是一个比较传统的软件架构:做过java的同学可能对上图的架构方式比较了解,我们通常会将一个应用程序生成一个war包,放到一个tomcat容器当中并在一台虚拟机(VM)中启动运行,然后配置nginx的负载均衡策略,将来自用户的请求转发到某个tomcat应用上,这种基于...

1. 为什么需要容器?

下图是一个比较传统的软件架构:

1

做过java的同学可能对上图的架构方式比较了解,我们通常会将一个应用程序生成一个war包,放到一个tomcat容器当中并在一台虚拟机(VM)中启动运行,然后配置nginx的负载均衡策略,将来自用户的请求转发到某个tomcat应用上,这种基于主机或虚拟机部署的应用会存在以下几个问题:

可移植性差

需要事先安装应用所需要的运行环境,比如java应用所需要的jdk或者jre,如果需要重新部署一个应用,就需要重新初始化环境再安装应用,过程繁琐; 另外如果一个应用需要jdk7的运行环境另外一个应用需要jdk8,那在一台主机上就很难满足;

可维护性差

如果tomcat应用本身或者所在的虚拟机操作系统出现问题时,则需要人工干预,比如配置nginx转发规则、执行重启操作等;

可扩展性差

应用的负载有高有低,不够稳定,当前应用负载大的时候,我们需要增加应用的数量,当应用负载降低的时候,我们需要降低应用的数量;

无法资源隔离

如果一台虚拟机部署多个应用,不同的应用或者进程之间会相互影响;

...

我们接下来就来看一下我们是如何一步步的解决这些问题的。

首先是容器化,我们选择的方案是Docker。

Docker将应用程序与该程序的依赖,打包成一个容器镜像,运行这个文件就会生成虚拟容器。程序在这个虚拟容器里运行,就好像运行在真实的物理机上,并且每个容器之间资源互相隔离而且都有自己的文件系统,这样容器之间进程不会相互影响,可以通过下图来进行对比基于虚拟机和基于容器部署应用的区别:

2

2. Docker介绍

2.1 Docker架构

Docker是客户端-服务器架构的应用,主要由以下部分组成:

服务端是一个名为dockerd守护进程,用来监听REST API请求并管理Docker对象,比如镜像、容器、存储卷及网络等。

命令行客户端(CLI),也就是我们平常在控制台输入的docker命令行,通过调用REST API进行控制Docker daemon或者同其进行集成。

镜像仓库(Docker Registries),镜像仓库用来存储Docker镜像。

以下是Docker的架构示意图:

3

4

2.2 Docker对象

IMAGES

镜像一般是通过指令创建的只读文件,用来生成容器。一般一个镜像是基于另外一个镜像并添加一些额外的指令创建的,可以通过一个名为Dockerfile的文件来生成一个镜像,在Dockerfile中的每一行指令会生成一层(layer)。当Dockerfile有改动需要重新生成镜像时,只需要重新生成改变的那些层就可以,这样就可以使得镜像文件更加轻量、快速构建。

CONTAINERS

容器是通过镜像文件生成的运行实例。可以通过REST API或者docker client进行创建、启动、停止、移动或者删除一个容器。

SERVICE

用来管理和扩展多个容器,需要同docker swarm一起工作

2.3 底层技术

Docker采用go语言编写,并且使用了Linux内核中的几个特性来实现其功能,主要有如下:

Namespaces

Docker通过Namespaces来提供隔离的工作空间(Workspace),当你运行一个容器的时候,Docker为这个容器创建了数个不同类型的Namespaces,主要有以下类型:

  • pid namespace:提供进程隔离功能
  • net namespace:管理网络接口
  • ipc namespace:内部资源访问控制 (IPC:Inter Process Communication)
  • mnt namespace:管理文件系统挂载
  • uts namespace: 内核隔离以及版本识别(UTS:Unix Timesharing System)

CGroups(Control Groups)

Docker通过CGroup来限定容器只能使用特定的资源。举例来讲,Docker可以限制某个容器只能使用多少cpu及内存资源。

UnionFS(Union File System)

一种文件系统类型,可以运行在其他文件系统上,通过创建不同的层来使得容器文件系统更加轻量和快速。还有其他几种类似的文件系统,包括AUFS、btrfs、vfs和DeviceMapper。

3. Docker的安装部署

以下命令是在Centos7上的命令,其他操作系统会存在一些差异

  yum install docker:通过yum下载docker相关的依赖
  systemctl enable docker: 开机运行systemctl 
  start docker: 启动docker服务

执行完上述操作,docker服务已经在运行了,可以通过执行 docker version 和 docker info 命令查看docker的版本以及相关的信息。

4. Docker的使用

4.1 Dockerfile文件

我们之前有提到Docker可以将应用程序打包成一个镜像,那么如何生成镜像文件呢?这就需要用到Dockerfile文件。它是一个文本文件,用来配置镜像,Docker根据该文件生成二进制的镜像文件。以下是一个Dockerfile文件示例:

# 该镜像文件继承官方的nginx镜像,冒号表示标签,这里标签是latest,表示最新的版本
FROM nginx:latest
# 将_book目录下的文件copy至镜像文件的/var/www/public目录
COPY _book /var/www/public/
COPY  nginx_app.conf/etc/nginx/conf.d/ nginx_app.conf
# 将容器的8080端口暴露出来,允许外部连接这个端口
EXPOSE 8080
# 容器启动后执行 nginx -g daemon off 命令
CMD ["nginx", "-g", "daemon off;"]

4.2 创建镜像文件

有了Dockerfile文件以后,就可以用docker build命令创建镜像文件了。

docker build -t zcloud-document:0.0.1.
docker image ls

如果运行成功,就可以看到新生成的镜像文件zcloud-document了。

4.3 生成容器

# 生成容器
docker run -p 8080:8080 -it zcloud-document:0.0.1
docker ps
# 重新生成一个新的镜像标签,并指向原来的镜像
docker tag zcloud-document:0.0.1 10.0.0.183:5000/zcloud/zcloud-document:0.0.1
# 推送到私有镜像仓库
docker push 10.0.0.183:5000/zcloud/zcloud-document:0.0.1

关于Docker其他的一些操作命令,大家可以自行查阅,网上介绍的文章也比较多,参考文章:Docker 入门教程(https://docs.docker.com/get-started/

相关实践学习
通过ACR快速部署网站应用
本次实验任务是在云上基于ECS部署Docker环境,制作网站镜像并上传至ACR镜像仓库,通过容器镜像运行网站应用,网站运行在Docker容器中、网站业务数据存储在Mariadb数据库中、网站文件数据存储在服务器ECS云盘中,通过公网地址进行访问。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
27天前
|
监控 Cloud Native Java
Quarkus 云原生Java框架技术详解与实践指南
本文档全面介绍 Quarkus 框架的核心概念、架构特性和实践应用。作为新一代的云原生 Java 框架,Quarkus 旨在为 OpenJDK HotSpot 和 GraalVM 量身定制,显著提升 Java 在容器化环境中的运行效率。本文将深入探讨其响应式编程模型、原生编译能力、扩展机制以及与微服务架构的深度集成,帮助开发者构建高效、轻量的云原生应用。
129 44
|
5月前
|
人工智能 Cloud Native 安全
云原生+AI 为企业出海提供全新技术引擎!明天见
5月22日 14:00「飞天发布时刻」,阿里云云原生应用平台产品负责人李国强将重磅揭晓面向 AI 场景的云原生产品体系升级,通过弹性智能的全球一体化架构、开箱即用的云原生 AI 工程化能力,为中国企业出海提供全新技术引擎。
|
6月前
|
Cloud Native 关系型数据库 分布式数据库
|
6月前
|
存储 关系型数据库 分布式数据库
|
2月前
|
Kubernetes Cloud Native 持续交付
Docker:轻量级容器化技术解析
Docker:轻量级容器化技术解析
|
2月前
|
运维 测试技术 Docker
Docker:轻量级容器化技术革命
Docker:轻量级容器化技术革命
|
5月前
|
存储 缓存 分布式计算
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
本文将深入探讨基于 StarRocks 和 Iceberg 构建的云原生湖仓分析技术,详细解析两者结合如何实现高效的查询性能优化。内容涵盖 StarRocks Lakehouse 架构、与 Iceberg 的性能协同、最佳实践应用以及未来的发展规划,为您提供全面的技术解读。 作者:杨关锁,北京镜舟科技研发工程师
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
|
3月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
148 0
|
Kubernetes 安全 Cloud Native
云原生生态周报 Vol. 7 | Docker 再爆 CVE
业界要闻 Docker 基础镜像 Alpine 爆出提权漏洞(CVE-2019-5021):该CVE影响自 Alpine Linux 3.3 版本开始的所有 Docker 镜像。该漏洞的机制在于 Alpine 的 root 用户包含一个空密码,这可能会导致攻击者获得 root 权限,进而造成攻击。
2349 0