[每周一更]-(第39期):容器化从入门到实践
一、什么是容器化?
什么是容器化?
容器化是一种软件部署流程,可将应用程序的代码与应用程序在任何基础设施上运行所需的所有文件和库进行捆绑。
通常,要在计算机上运行任何应用程序,必须安装与计算机操作系统匹配的应用程序版本。
例如,您需要在 Windows 计算机上安装 Windows 版本的软件包。但是,借助容器化,您可以创建能够在所有类型的设备和操作系统上运行的单个软件包或容器。
容器化是指将软件代码和所需的所有组件(例如库、框架和其他依赖项)打包在一起,让它们隔离在自己的"容器"中。
对比传统部署是指环境和项目分开搭建部署,在平台或操作系统上直接编写代码。
容器化部署在各个环境中可以实现一键安装,同时使用比较方便;而传统化部署环境复杂,配置繁琐,还经常会出现问题,安装也非常麻烦,耗时比较长。
容器化的优势?
1、便携性:软件开发人员使用容器化在多个环境中部署应用程序,而无需重新编写程序代码。
2、可扩展性:容器是可以高效运行的轻量级软件组件。
3、容错能力:软件开发团队使用容器来构建容错应用程序。
4、敏捷性:容器化应用程序在独立的计算环境中运行。
容器化的应用场景?
二、容器与VM的区别?
容器引擎种类有哪些?
容器引擎是用于创建、运行和管理容器的软件组件,以下是一些常见的容器引擎:
1、Docker Engine:Docker Engine是最流行的容器引擎之一,它提供了构建、运行和管理Docker容器的功能。Docker Engine支持多种操作系统平台,并提供了丰富的命令行和API接口,用于管理和监控Docker容器。
2、Containerd:Containerd是一个开源的容器运行时,它提供了容器的核心功能,如镜像管理、容器启动和停止、存储管理等。Containerd由Docker维护,并在Docker Engine 1.11及以上版本中作为默认的运行时组件。
(1.24版本后K8s默认用这个,废弃了Docker)
3、CRI-O:CRI-O是一个轻量级的容器运行时,它专门针对Kubernetes容器编排系统进行了优化。CRI-O提供了符合OCI标准的容器运行时接口,并支持多种容器镜像格式和存储后端。
4、rkt:rkt是一个开源的容器运行时,它旨在提供更高的安全性和容器隔离性。rkt可以与Docker容器格式兼容,并支持Pod概念,用于管理多个相关的容器。
5、LXC/LXD:LXC是一个Linux容器技术,它提供了轻量级的虚拟化和快速、安全的隔离。LXD是LXC的一个高级管理工具,它提供了易于使用的命令行界面和REST API,用于管理和监控LXC容器。
容器引擎是容器技术的核心组件,它们提供了容器的基本功能,如镜像管理、容器启动和停止、存储管理等,为容器化应用程序的部署和管理提供了强大的基础设施。
后边所有讲到的容器,默认都是Docker容器,有特殊情况会单独说明。
为什么要用Docker?
- 更高效地利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松地迁移
- 更轻松地维护和扩展
容器和VM 对比参考如下链接
[每周一更]-(第23期):Docker 逻辑图及常用命令汇总
三、容器使用介绍
什么是Docker?
Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux服务器,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类iphone的app),并且容器开销极其低。
Docker的工作流程
Docker是一个Client-Server结构的系统, Docker守护进程运行的主机上,然后通过 Socket连接从客户端访问, 守护进程从客户端接受命令并管理 运行在主机上的容器
Docker基础概念
- 镜像(Image):一个镜像是一个只读的模板,它包含了一个应用程序运行所需要的所有文件和配置。Docker通过使用镜像来创建容器。
- 容器(Container):一个容器是一个镜像的运行实例。每个容器都是一个独立的、可执行的软件包,包括应用程序、运行时环境、系统工具、库和配置。
- 仓库(Repository):一个仓库是一个存储镜像的地方,类似于代码仓库。Docker Hub是一个公共的Docker仓库,可以从中下载和共享镜像。
- Dockerfile:一个Dockerfile是一个文本文件,它包含了构建一个Docker镜像所需的所有命令和指令。
- 镜像层(Image layer):每个Docker镜像都由多个镜像层组成。每个镜像层都包含一个镜像的不同部分,例如操作系统、应用程序和配置文件。这些层可以被共享和重复使用,以减少存储空间和加快镜像的构建速度。
- Docker Compose:一个Docker Compose文件定义了一个应用程序的多个容器,并描述它们之间的关系和依赖性。使用Docker Compose可以轻松地创建、启动、停止和删除一个多容器应用程序。
- Swarm模式(Swarm mode):Docker Swarm是一个原生的Docker集群管理工具,它允许开发者将多个Docker主机组合成一个虚拟的Docker主机。Swarm模式可以提供高可用性、可扩展性和负载均衡等功能,使得应用程序可以在多个Docker主机上运行。
Docker命令的使用流程
镜像、容器、仓库关联
镜像构建:
docker build -t myapp:latest .
容器运行:
docker run --name nginx-test -p 80:80 -d nginx
仓库使用:
docker pull ubuntu:latest(镜像名:版本号)
docker push myubuntu:v1(镜像名:版本号)
四、应用实践
PHP示例
在本地创建一个名为 myapp 的文件夹,并在其中创建一个名为 index.php 的PHP文件,里面包含以下代码:
<?php
echo "Hello, World!";
这个PHP代码创建了一个简单的Web应用,当我们访问应用根目录时,返回"Hello, World!"。
在 myapp 文件夹中创建一个名为 Dockerfile 的文件,这是Docker镜像的构建文件。添加以下代码:
FROM php:7.4-apache
COPY . /var/www/html
这个Dockerfile文件告诉Docker从PHP 7.4的官方Docker镜像开始构建,将整个应用复制到 /var/www/html 目录下。
在 myapp 文件夹中,打开终端或命令行窗口,运行以下命令来构建Docker镜像:
docker build -t myapp:latest .
这个命令使用当前文件夹中的Dockerfile文件构建一个名为 myapp 的Docker镜像,并将其标记为 latest 版本。
运行Docker容器并将应用程序映射到主机的端口。运行以下命令:
docker run -p 8080:80 -d myapp:latest
其中,-p参数指定将容器的80端口映射到宿主机的8080端口,-d参数指定以后台模式启动容器。
这个命令告诉Docker运行一个名为 myapp 的容器,并将容器内的Apache服务器的80端口映射到主机的端口8080。如果一切正常,你应该可以在浏览器中访问 http://localhost:8080,并看到 “Hello, World!” 消息。
这个例子非常简单,但是可以让你快速了解如何将PHP项目部署到Docker中。
Go 示例
在本地创建一个名为 myapp 的文件夹,并在其中创建一个名为 main.go 的Go文件,里面包含以下代码:
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
这个Go代码创建了一个简单的Web应用,当我们访问应用根目录时,返回"Hello, World!"。
在 myapp 文件夹中创建一个名为 Dockerfile 的文件,这是Docker镜像的构建文件。添加以下代码:
FROM golang:1.18-alpine
WORKDIR /app
COPY . .
RUN go build -o myapp
CMD [ "./myapp" ]
这个Dockerfile文件告诉Docker从Go 1.18的官方Docker镜像开始构建,设置工作目录为 /app,将整个应用复制到镜像中,使用 go build 命令编译应用,并使用CMD指令运行 myapp。
在 myapp 文件夹中,打开终端或命令行窗口,运行以下命令来构建Docker镜像:
docker build -t myapp:latest .
这个命令使用当前文件夹中的Dockerfile文件构建一个名为 myapp 的Docker镜像,并将其标记为 latest 版本。
运行Docker容器并将应用程序映射到主机的端口。运行以下命令:
docker run -p 8080:8080 myapp:latest
这个命令告诉Docker运行一个名为 myapp 的容器,并将容器内的端口8080映射到主机的端口8080。如果一切正常,你应该可以在浏览器中访问 http://localhost:8080,并看到 “Hello, World!” 消息。
Python示例
下面是一个简单的将Python代码部署到Docker的实例:
在本地创建一个名为 myapp 的文件夹,并在其中创建一个名为 app.py 的Python文件,里面包含以下代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, World!"
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
这个Python代码使用Flask框架创建了一个简单的Web应用,当我们访问应用根目录时,返回"Hello, World!"。
创建一个名为 Dockerfile 的文件,这是Docker镜像的构建文件。在 myapp 文件夹中创建 Dockerfile 文件,添加以下代码:
FROM python:3.7-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD [ "python", "./app.py" ]
这个Dockerfile文件告诉Docker从Python 3.7的官方Docker镜像开始构建,设置工作目录为 /app,复制 requirements.txt 文件并安装其中的Python依赖,最后将整个应用复制到镜像中,并使用CMD指令运行 app.py。
在 myapp 文件夹中创建一个名为 requirements.txt 的文件,里面包含以下代码:
Flask
这个文件告诉Docker需要安装Flask依赖。
在 myapp 文件夹中,打开终端或命令行窗口,运行以下命令来构建Docker镜像:
docker build -t myapp:latest .
这个命令使用当前文件夹中的Dockerfile文件构建一个名为 myapp 的Docker镜像,并将其标记为 latest 版本。
运行Docker容器并将应用程序映射到主机的端口。运行以下命令:
docker run -p 5000:5000 myapp:latest
这个命令告诉Docker运行一个名为 myapp 的容器,并将容器内的端口5000映射到主机的端口5000。如果一切正常,你应该可以在浏览器中访问 http://localhost:5000,并看到 “Hello, World!” 消息。
实际项目中使用到容器的栗子
- API文档管理:Showdoc
- 自动化部署:Jenkins
- 堡垒机服务:Jumpserver
- 自建code仓库:Gitlab
- 服务监控:Zabbix(传统方式)、Prometheus、Grafana、cAdvisor
后续我们的应用陆续构建: 社区、解读工具、大健康项目BAP等
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!