• 容器化技术最佳实践1--容器化技术简介与Docker入门


    容器化技术最佳实践1–容器化技术简介与Docker入门

    容器化简介

    通过虚拟化了解容器化

    参考链接:https://kubernetes.io/zh-cn/docs/concepts/overview/

    容器化技术与虚拟化技术比较:

    虚拟化技术容器化技术
    软件KVM,VMware,Vitrual-box,Hyper-VDocker,LXC,podman
    平台Openstackk8s,Docker swarm
    镜像虚拟磁盘镜像(image)
    镜像构建方式通过系统ISO安装,或在其它镜像基础上修改通过配置文件构建镜像
    实例虚拟机容器(container)
    实例启动方式通过镜像及启动参数(如CPU、内存配额等)启动通过镜像启动,可通过参数映射外部文件目录、映射服务端口等

    容器和虚拟机非常相似,但消耗资源少、运行速度快,通常被认为是轻量级的虚拟机

    对开发和运维的好处

    对于开发者来说:
    容器简化了开发和交付过程,可以通过容器搭建开发和测试环境,便于跨平台开发。
    每个容器都具有虚拟的操作系统环境、可以在容器中挂载外部文件夹(卷)、安装各种软件包、编译程序、启动服务等。
    应用程序可构建成镜像文件交付,一次构建,随处运行。
    容器还支持交叉编译,可以很轻松地将应用部署在使用ARM处理器的服务器上。
    每个开发人员可轻松构建自己应用程序的依赖环境,比如每个应用程序都有一个Nginx等,避免多人共用时配置复杂易出错。

    对于运维人员来说:
    简化了部署过程,可通过docker compose或k8s pod配置文件,同时部署一组服务(自动完成下载镜像–可以是内部镜像服务器上的、配置参数、运行容器、负载均衡等),
    且不需要额外编写服务启停脚本,容器软件可以管理服务启停。

    容器化部署特点

    容器部署方式与其它方式比较:

    容器虚拟化传统
    额外磁盘空间MB级GB级
    额外CPU消耗
    额外内存消耗
    应用运行效率接近100%约90%100%
    系统支持实例数量约1000约10
    实例启动时间毫秒级分钟级
    资源配额设置复杂。通过cgroup v2容易。通过Hypervisor复杂。通过cgroup v2
    应用服务管理可由容器引擎管理启动。不需编写启停脚本或配置文件通过systemd service通过systemd service
    应用部署速度快。通过导入镜像或容器部署慢。通过登录虚拟机部署或导入镜像部署一般
    应用迁移速度一般
    安全隔离较好较好

    容器化部署是大势所趋

    部署方式演进:传统部署时代 ==> 虚拟化部署时代 ==> 容器化部署时代

    什么情况下可以采用容器化技术

    • 开发和测试环节
    • 原先没有采用虚拟化部署的服务(在裸机上部署的)
    • 原先在虚拟机中部署的服务,现在可以在虚拟机中运行容器部署
    • 裸机使用Linux内核版本4.18及以上的、考虑将虚拟机替换成容器的
    • 云原生应用

    什么情况下不适用容器化技术

    • 裸机操作系统版本太旧、且无法重装系统的,不能将虚拟机替换成容器
    • 多租户环境,使用虚拟机对租户环境进行隔离的,不能将虚拟机替换成容器

    云原生

    何谓云原生?

    参考链接:https://zhuanlan.zhihu.com/p/150190166
    云原生是一种构建和运行应用程序的方法,是一套技术体系和方法论。
    云原生(CloudNative)是一个组合词,Cloud+Native。
    Cloud表示应用程序位于云中,而不是传统的数据中心;
    Native表示应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳姿势运行,充分利用和发挥云平台的弹性+分布式优势。

    云原生可概括为4个要点:微服务(设计)、DevOps+CICD(开发、测试、交付)、容器(基础设置)

    云原生里的微服务

    参考链接:https://aws.amazon.com/cn/microservices/
    微服务是一种开发软件的架构和组织方法,其中软件由通过明确定义的 API 进行通信的小型独立服务组成。这些服务由各个小型独立团队负责。
    微服务架构使应用程序更易于扩展和更快地开发,从而加速创新并缩短新功能的上市时间。

    云原生里的容器化

    容器化技术比云原生的概念出现得早。云原生计算基金会(CNCF)看到容器化技术的优势,将其列为应用分发和交付的标准。k8s是CNCF的项目。

    Docker简介

    Docker相当于容器界的Vmware。

    安装Docker

    Windows

    访问:https://www.docker.com/products/docker-desktop/
    下载并安装Docker Desktop

    Linux

    参考链接:https://docs.docker.com/engine/install/

    以CentOS8为例:

    sudo yum install -y yum-utils
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
    
    # 如果服务器上安装了podman和runc,可能会提示包冲突,可先卸载podman和runc,或直接运行如下命令替换
    sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin --allowerasing
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    MacOS

    目前MacOS不能原生支持Dockers,是通过虚拟机的docker来提供服务的,占用内存较高(通常3GB以上)。
    安装过程略。

    Windows上启动Docker服务

    运行Docker Desktop

    Linux上启动Docker服务

    有root权限

    sudo systemctl --user start docker
    sudo systemctl --user enable docker
    
    • 1
    • 2

    非root权限

    docker在v20.10之后对安全性进行了加强,可以在生产环境中以非root权限运行docker
    参考链接:https://docs.docker.com/engine/security/rootless/

    使用前检查

    运行docker version查看版本号,需docker-ce版本为v20.10及以上

    运行systemctl --user,看看能否看到服务列表。如下显示如下错误,可能是因为使用su - username切换到该用户的:

    $ systemctl --user
    Failed to connect to bus: No such file or directory
    
    • 1
    • 2
    安装本用户docker环境

    运行dockerd-rootless-setuptool.sh install
    注意看命令的输出,看看有没有异常。并按提示配置相应的环境变量。
    如果有以下异常信息,可能是因为使用su - username切换到该用户导致的:

    $ dockerd-rootless-setuptool.sh install
    [INFO] systemd not detected, dockerd-rootless.sh needs to be started manually:
    
    • 1
    • 2
    编辑环境变量

    编辑 ~/.bashrc 添加如下两行

    export PATH=/usr/bin:$PATH
    export DOCKER_HOST=unix:///run/user/用户ID/docker.sock
    
    • 1
    • 2
    source ~/.bashrc
    
    • 1
    设置开机自动登录某个普通用户
    # 设置启动时登录这个普通用户(缠绕),这样才能触发启动docker,否则服务器重启后rootless的docker服务仍然无法启动。
    sudo loginctl enable-linger $(whoami)
    
    • 1
    • 2
    设置用户的Docker服务器为开机自启动
    systemctl --user enable docker
    
    • 1
    启动docker并检查服务状态
    systemctl --user start docker
    systemctl --user status docker
    
    • 1
    • 2
    不配置环境变量的使用方式

    如果未设置环境变量,可以使用如下命令进入rootless模式

    docker context use rootless
    
    • 1

    镜像操作

    搜索镜像

    通过命令行搜索:

    docker search mysql
    
    • 1

    通过浏览器访问docker官方镜像仓库:https://hub.docker.com

    下载镜像

    docker pull nginx
    
    • 1

    查看本地镜像

    docker images
    
    • 1

    删除本地镜像

    docker rmi 镜像名称:tag,或ID
    # 如果有容器使用了这个镜像,是无法删除的,需先删除容器再删镜像
    
    • 1
    • 2

    容器操作

    根据镜像启动容器

    docker run -d --name 容器名 -p 本机端口:容器内端口 --restart always 镜像名称
    
    • 1

    启动、停止、重启容器

    docker start 容器名称或ID
    docker stop 容器名称或ID
    docker restart 容器名称或ID
    
    • 1
    • 2
    • 3

    修改容器

    • 最佳实践:要修改端口映射或卷挂载,最好删掉容器、重开

    • 使用docker container update修改容器开机自启动选项

    # 注意:可以修改的选项较少,可通过docker container update --help查看
    docker container update --restart always 容器名称或ID
    docker container update --restart no 容器名称或ID
    
    • 1
    • 2
    • 3
    • 修改容器配置文件(不推荐)

    • 使用docker container commit将容器保存为新镜像,再使用新的参数运行

    • 最佳实践:要修改端口映射或卷挂载,最好删掉容器、重开

    查看容器详情

    docker container inspect 容器名称或ID
    
    • 1

    进入容器查看文件

    docker exec -it 容器名称或ID /bin/bash
    
    • 1

    删除容器

    docker stop 容器名称或ID
    docker rm 容器名称或ID
    
    • 1
    • 2
  • 相关阅读:
    Springboot物资发放管理系统
    计算机毕业设计ssm校园扶助综合服务平台的设计与实现r941j系统+程序+源码+lw+远程部署
    Redis和Java的爱恨情仇之常见结构命令
    外网打点(信息收集)
    关于Python自动化的就业真相
    安卓布局优化详解
    2023年湖北省专利导航、知识产权软科学研究及服务政策(申报条件、材料、时间)
    若依DataScopeAspect数据权限解析和ew.customSqlSegment源码解析
    大数据常见面试题Hadoop篇(3)
    微信小程序开发食堂订餐点餐项目+后台
  • 原文地址:https://blog.csdn.net/huzhenwei/article/details/128132327