云原生个人线路 Docker容器化

news2024/12/24 20:51:31

声明:此文章为博主个人学习记录,仅供学习和交流,如有侵权请联系博主。

Docker

基于Linux 内核的Cgroup,Namespace,以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。

最初实现是基于LXC,从0.7 以后开始去除LXC,转而使用自行开发的Libcontainer,从1.11开始,则进一步演进为使用runC和Containerd。

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护,使得Docker 技术比虚拟机技术更为轻便、快捷。

安装docker

基于ubuntu

基于Centos7

基于ubuntu

更新apt包索引并安装允许apt使用HTTPS仓库的软件包
$ sudo apt-get update
$ sudo apt-get install \\
  ca-certificates \\
  curl \\
  gnupg \\
  lsb-release
  
添加Docker的官方GPG密钥
$ sudo mkdir -m 0755 -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

写入阿里云镜像源地址
$ sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

更新apt包索引
sudo apt-get update

安装Docker Engine、containerd和Docker Compose
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

基于Centos7

安装最新内核版本

#查看系统版本
cat /etc/redhat-release
#查看当前系统的内核:
uname -sr
#在 CentOS 7.x 上启用 ELRepo 仓库:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

#查看可用的系统内核相关包:
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

#安装最新主线内核版本:
yum -y --enablerepo=elrepo-kernel install kernel-ml

#设置默认内核版本
vi /etc/default/grub
修改GRUB_DEFAULT=0

#重新创建内核配置
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

docker环境和组件安装

#卸载旧版本docker
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

#gcc
yum -y install gcc
yum -y install gcc-c++

#安装yum工具包
yum -y install yum-utils

#设置阿里云的stable 镜像仓库
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#更新 yum 软件包索引
yum makecache fast

#安装指定版本的 Docker(v20.10.8):
yum -y install docker-ce-3:20.10.8-3.el7.x86_64 docker-ce-cli-1:20.10.8-3.el7.x86_64 containerd.io

systemctl start docker
systemctl enable docker

#查看docker状态:
systemctl status docker
docker version

#镜像加速
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],	
  "registry-mirrors": [
    "https://du3ia00u.mirror.aliyuncs.com",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://registry.docker-cn.com"
  ],
  "live-restore": true,
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"},
  "max-concurrent-downloads": 10,
  "max-concurrent-uploads": 5,
  "storage-driver": "overlay2" 
}
EOF

#使之生效
systemctl daemon-reload

#重启docker
systemctl restart docker

容器操作

常见命令

docker pull image:tag

docker run 启动并创建容器
	--name 容器名
	--rm 退出自动删除
	-it 交互
	-d 后台
	-p 端口映射
	-v 磁盘挂载

docker start container 启动容器

docker stop container 停止

docker ps -a 查看全部容器

docker exec -it image /bin/bash 进入容器

docker inspect image 查看容器信息

docker cp local:docker 拷贝文件到容器

docker images 查看镜像

Dockerfile

基本结构

FROM:指定基础镜像。
RUN:在镜像中运行命令。
CMD:指定容器启动时要运行的命令。
LABEL:为镜像添加元数据。
EXPOSE:指定容器要暴露的端口。
ENV:设置环境变量。
ADD:将文件从构建上下文或 URL 复制到镜像中。
COPY:将文件从构建上下文复制到镜像中。
ENTRYPOINT:指定容器启动时要运行的命令,可以与 CMD 配合使用。
VOLUME:创建挂载点,用于挂载外部卷。
USER:指定运行容器时要使用的用户。
WORKDIR:设置工作目录。

最佳实践

  • 不要安装无效软件包。

  • 应简化镜像中同时运行的进程数,理想状况下,每个镜像应该只有一个进程,当无法避免同一镜像运行多进程时,应选择合理的初始化进程(initprocess)。

  • 最小化层级数。

    • 最新的docker只有RUN,COPY,ADD创建新层,其他指令创建临时层,不会增加镜像大小,比如EXPOSE指令就不会生成新层。

    • 多条RUN命令可通过连接符连接成一条指令集以减少层数。

    • 通过多段构建减少镜像层数。

  • 把多行参数按字母排序,可以减少可能出现的重复参数,并且提高可读性。

  • 编写dockerfile的时候,应该把变更频率低的编译指令优先构建以便放在镜像底层以有效利用buildcache。

  • 复制文件时,每个文件应独立复制,这确保某个文件变更时,只影响改文件对应的缓存。

Makefile文件

以go项目为示例

# 设置项目根目录
ROOT := $(shell pwd)

# 设置编译生成的可执行文件名
BINARY := myapp

# 设置编译选项
GOFLAGS := -ldflags="-s -w"

# 设置远程仓库地址
REPO := myrepo/myapp

# 设置版本号
VERSION := 1.0.0

# 默认目标
all: build

# 编译目标
build:
    go build $(GOFLAGS) -o $(BINARY) main.go

# 发布目标
release: build
    tar czf $(BINARY)-$(VERSION).tar.gz $(BINARY)

# 推送目标
push: release
    scp $(BINARY)-$(VERSION).tar.gz $(REPO)

# 清理目标
clean:
    rm -f $(BINARY)
    rm -f $(BINARY)-*.tar.gz

.PHONY: all build release push clean

扩展

build构建本地镜像并上传到dockerhub

需要注册docker 账号

构建镜像 -o 指定镜像名
docker build -t imagename .

查看镜像
docker images

登录 输入账号密码
docker login

打包
docker tag tagname your_dockerhub_name/imagename

push到dockerhub仓库
docker push your_dockerhub_name/imagename

通用镜像

推荐使用这三个通用镜像:ubuntu:latest、debian:slim 和 alpine:latest

在这里插入图片描述

Ubuntu/Debian

Ubuntu 和 Debian 是综合能力非常强的 Linux 发行版,非常适合作为通用镜像使用,它们主要的优点如下。

  • 支持的软件包众多。
  • 镜像体积较小。
  • 用户数量大,社区活跃,容易及时发现和修复安全问题。
  • 相比较 Alpine 具有更通用的 C 语言标准库 glibc。
  • 文档和教程丰富。

Alpine

我们再来看另一种通用镜像 Alpine。在很长的时间里,Alpine 发行版并没有受到太多的关注。直到 Docker 时代,大家为了追求更小的镜像体积才开始大量使用 Alpine 镜像。相比较 Debian,Alpine 有下面这些优点。

  • 快速的包安装体验。
  • 极小的镜像体积。
  • 只包含少量的系统级程序,安全性更高。
  • 更轻量的初始化系统 OpenRC。

专用镜像

各种编程语言镜像

初学使用发行版linux,尽量不要用Alpine,c库不一样

对Alpine,Dockerfile编译过程中指定 CGO_ENABLED=0

相关理论简介 (可跳过)

容器标准

•Open Container Initiative(OCI)

​ •轻量级开放式管理组织(项目)

•OCI主要定义两个规范

​ •Runtime Specification

​ •文件系统包如何解压至硬盘,共运行时运行。

•Image Specification

•如何通过构建系统打包,生成镜像清单(Manifest)、文件系统序列化文件、镜像配置。

Namespace

Linux Namespace是一种Linux Kernel提供的资源隔离方案:

​ •系统可以为进程分配不同的Namespace;

​ •并保证不同的Namespace资源独立分配、进程彼此隔离,即不同的Namespace下的进程互不干扰。

多种namespace互相隔离

​ IPC,Network,PID,Mount,UTS,USER

相关命令

查看当前系统的namespace:
lsns –t <type>

查看某进程的namespace:
ls -la /proc/<pid>/ns/

进入某namespace运行命令:
nsenter -t <pid> -n ip addr

Cgroup

•Cgroups(Control Groups)是Linux下用于对一个或一组进程进行资源控制和监控的机制。

•可以对诸如CPU使用时间、内存、磁盘I/O等进程所需的资源进行限制。

•不同资源的具体管理工作由相应的Cgroup子系统(Subsystem)来实现。

•针对不同类型的资源限制,只要将限制策略在不同的的子系统上进行关联即可。

•Cgroups在不同的系统资源管理子系统中以层级树(Hierarchy)的方式来组织管理:每个Cgroup都可以包含其他的子Cgroup,因此子Cgroup能使用的资源除了受本Cgroup配置的资源参数限制,还受到父Cgroup设置的资源限制。

文件系统 Union FS

•将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)的文件系统

•支持为每一个成员目录(类似GitBranch)设定readonly、readwrite和whiteout-able 权限

•文件系统分层, 对readonly权限的branch 可以逻辑上进行修改(增量地, 不影响readonly部分的)

•通常Union FS 有两个用途, 一方面可以将多个disk挂到同一个目录下, 另一个更常用的就是将一个readonly的branch 和一个writeable 的branch 联合在一起

docker的文件系统

典型的Linux文件系统组成:

  • Bootfs(boot file system)
    • Bootloader 引导加载kernel
    • Kernel 当kernel被加载到内存中后umountbootfs。

rootfs(root file system)

  • /dev,/proc,/bin,/etc等标准目录和文件。

  • 对于不同的linux发行版, bootfs基本是一致的,但rootfs会有差别。

docker启动过程

Linux

  • 在启动后,首先将rootfs设置为readonly, 进行一系列检查, 然后将其切换为“readwrite”供用户使用。

Docker启动

  • 初始化时也是将rootfs以readonly方式加载并检查,然而接下来利用union mount 的方式将一个readwrite文件系统挂载在readonly的rootfs之上,复用rootfs。

  • 并且允许再次将下层的FS(file system)设定为readonly并且向上叠加。

  • 这样一组readonly和一个writeable的结构构成一个container的运行时态, 每一个FS被称作一个FS层。

OCI容器标准

Open Container Initiative

  • OCI组织于2015年创建,是一个致力于定义容器镜像标准和运行时标准的开放式组织。

  • OCI定义了镜像标准(Runtime Specification)、运行时标准(Image Specification)和分发标准(DistributionSpecification)

    • 镜像标准定义应用如何打包
    • 运行时标准定义如何解压应用包并运行
    • 分发标准定义如何分发容器镜像

Docker 12-Factor

12-Factor 应用是一种用于构建软件即服务(SaaS)应用的方法论。它提供了 12 个因素,用来指导开发人员如何构建可扩展、可维护和可移植的应用程序。这些因素包括:

  1. 代码库:应用程序应该有一个代码库,并使用版本控制系统进行管理。
  2. 依赖:应用程序应该显式声明并隔离其依赖关系。
  3. 配置:应用程序的配置应该存储在环境变量中,而不是硬编码到代码中。
  4. 后端服务:应用程序应该将后端服务(如数据库)视为附加资源,并通过 URL 来访问。
  5. 构建、发布、运行:应用程序的构建、发布和运行阶段应该严格分离。
  6. 进程:应用程序应该以一个或多个无状态进程的形式执行。
  7. 端口绑定:应用程序应该通过端口绑定来提供服务。
  8. 并发:应用程序应该通过进程模型来实现扩展。
  9. 可处理性:应用程序应该能够快速启动并优雅地关闭。
  10. 开发/生产环境等价性:应用程序的开发、预发布和生产环境应该尽可能相似。
  11. 日志:应用程序应该将日志视为事件流,并通过标准输出进行输出。
  12. 管理进程:应用程序的管理/运维任务应该作为一次性进程运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/417322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows权限提升—MySQL数据库提权

Windows权限提升—MySQL数据库提权1. 前言2. 数据库提权介绍2.1. 常见数据库端口2.2. MySQL数据库提权条件2.3. MySQL数据库提权类型3. MySQL中UDF提权3.1. UDF提权介绍3.2. UDF提权思路3.3. UDF提权步骤3.3.1. 获取外连数据库3.3.1.1. 外连数据库3.3.1.2. 连接数据库3.3.1.3. …

python+vue 基于推荐算法的在线电影视播放网站

以广大影视剧迷们为研究对象&#xff0c;深入了解影视剧迷对在线视频观看视频的需求进行分析&#xff0c;形成系统需求分析设计一个符合影视剧迷们需求的在线视频网站。设计网站的前期工作包括对系统的各个功能进行详细分析&#xff0c;对数据库设计进行详细的描述&#xff0c;…

hadoop之MapReduce框架原理

目录 MapReduce框架的简单运行机制&#xff1a; Mapper阶段&#xff1a; InputFormat数据输入&#xff1a; 切片与MapTask并行度决定机制&#xff1a; job提交过程源码解析&#xff1a; 切片逻辑&#xff1a; 1&#xff09;FileInputFormat实现类 进行虚拟存储 &#x…

9.Nuxt.js的使用

九.Nust.js的使用 1.什么是SEO 2.百度的搜索结果 3.服务器端和客户端渲染 4.Nuxt.js技术简介 5.Nuxt.js的路由&#xff08;使用提供的nuxt-app项目初始化&#xff09; 6.Nuxt.js的页面布局和整体配置 7.Nuxt.js整合axios 九.Nust.js的使用 1.什么是SEO ①SEO SEO是通…

elasticSearch数据存储与搜索基本原理

1.缘起&#xff1a; 为啥想学习es&#xff0c;主要是在工作中会用到&#xff0c;但是因为不了解原理&#xff0c;所以用起来畏手畏脚的&#xff0c;就想了解下es是怎么存储数据&#xff0c;以及es是怎么搜索数据的&#xff0c;我们平时应该如何使用es&#xff0c;以及使用时候…

springboot+jwt令牌简单登录案例

1. 什么是JWT&#xff1f;JSON Web Token JSON Web Token (JWT)是⼀个开放标准(RFC 7519)&#xff0c;它定义了⼀种紧凑的、⾃包含的⽅式&#xff0c;⽤于 作为JSON对象在各⽅之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名的。 1.1 什么时候应该⽤…

【Linux】应用层协议—http

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…

DevData Talks | 微众银行有哪些研发效能实践与思考?一起来拓展认知边界!

本期 DevData Talks 直播活动中&#xff0c;我们非常高兴地邀请到了微众银行研发效能负责人余伟老师与我们分享微众银行在研发效能实践方面的经验与方法。 微众银行是一家面向互联网的银行&#xff0c;从诞生之日起就一直致力于快速迭代、稳健可靠的业务支持。面对金融和互联网…

ORACLE EBS 系统架构与应用实践(二)

四、ORACLE EBS的系统集成性 这里的所谓系统“集成性”&#xff0c;既非指“技术层面”的集成&#xff0c;也非指模块“应用层面”的集成&#xff0c;而是指企业管理发展过程中内在“核心要素”的集成。有人以为&#xff0c;一个ERP产品所包含的模块数量足够多、企业上线的模块…

【大数据基础】基于信用卡逾期数据的Spark数据处理与分析

https://dblab.xmu.edu.cn/blog/2707/ 实验过程 数据预处理 本次实验数据集来自和鲸社区的信用卡评分模型构建数据&#xff0c;以数据集cs-training.csv为分析主体&#xff0c;其中共有15万条记录&#xff0c;11列属性。 每个数据包含以下字段&#xff1a; 字段名称 字段含义…

【PyTorch】第四节:梯度下降算法

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;PyTorch 描述&#x1f3a8;&#xff1a;PyTorch 是一个基于 Torch 的 Python 开源机器学习库。 寄语&#x1f493;&#xff1a;&#x1f43e;没有白走的路&#xff0c;每一步都算数&#…

java--HtmlUnit--模拟浏览器操作--自动化操作浏览器--自动登录校园网为案例

写在前面&#xff1a; 闲来无事&#xff0c;因为宿舍每次嫌登录校园网有点免费。然后想着能不能一键自动化实现。然后更麻烦了&#xff0c;哈哈哈。不过倒是写一次代码就可以了。 可能不是特别系统&#xff0c;因为资料太少了。都是案例驱动找的资料。花了3大节课才搞完了。 会…

Redis运维之swap影响及解决方案

一、操作系统SWAP swap空间对于操作系统来说比较重要&#xff0c;当我们使用操作系统的时候&#xff0c;如果系统内存不足&#xff0c;常常会将一部分内存数据页进行swap操作&#xff0c;以解决临时的内存困境。swap空间由磁盘提供&#xff0c;对于高并发场景下&#xff0c;sw…

全球土壤湿度数据获取方法

土壤湿度亦称土壤含水率&#xff0c;表示土壤干湿程度的物理量。是土壤含水量的一种相对变量。通常用土壤含水量占干土重的百分数是示&#xff0c;亦称土壤质量湿度&#xff0c;如用土壤水分容积占土壤总容积的百分数表示&#xff0c;则称土壤容积湿度。通常说的土壤湿度&#…

Vivado中VIO IP核的使用

Vivado中VIO IP核的使用一、写在前面二、VIO IP核配置三、VIO联调四、写在后面一、写在前面 Vivado中的VIO&#xff08;Virtual Input/Output&#xff09; IP核是一种用于调试和测试FPGA设计的IP核。它允许设计者通过使用JTAG接口读取和写入FPGA内部的寄存器&#xff0c;从而检…

【JavaEE】关于synchronized总结-Callable用法及JUC的常见问题

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶synchronized原理是什么&#xff1f;synchronized到底有什么特点&#xff0c;synchronized的锁策略是什么&#xff0c;是怎么变化的呢&#xff1f;本篇文章总结出, Synchronized 具有以下特性…

【Java|golang】1041. 困于环中的机器人

在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向 是y轴的正方向。 南方向 是y轴的负方向。 东方向 是x轴的正方向。 西方向 是x轴的负方向。 机器人可以接受下列三条指令之一&#xff1a; “G”&#xff1a;直走 1 个单位 “L”&…

Markdown 语法大全

Markdown是一种轻量级标记语言&#xff0c;常用于撰写博客、文档、论文等。它可以让你使用易读易写的纯文本格式来编写文档&#xff0c;然后通过转换成有效的HTML文档进行发布。以下是Markdown常用的语法&#xff1a; 这里写目录标题标题列表引用一级引用嵌套引用粗体和斜体删除…

技术复盘(1)--redis

技术复盘--redis技术复盘(1)--redis资料地址准备工作发展史redis-windowsredis-windows-说明redis-centos7安装jdk安装redisredis-key基本命令redis-string命令redis-list命令redis-set命令redis-hash命令redis-zset命令redis-geospatial命令redis-hyperloglog命令redis-bitmap…

【Linux驱动开发】024 INPUT子系统

一、前言 按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c;Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备&#xff0c;只是在此基础上套上了 input 框架&#xff0c;用户只需要负责上报输入事件&#xff0c;比如…