一命通关——Docker与微服务(上)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: docker从根本上解决换主机重新配置环境问题,因为docker把原始的配置环境也复制一份过来。此时的docker像一个容器装载着源代码+配置+环境+版本+各种第三方组件并将这些打包成一个镜像iso文件,让镜像文件在docker引擎上运行。更专业的来讲,docker给出了一个标准化的解决方案——系统平滑移植,容器虚拟化技术。

🐳1.Docker简介

docker是基于Go语言实现的云开源项目

🐋1.背景

在传统的开发过程中,我们的项目依赖于本地电脑的配置和某些配置文件,此时如果我们将项目移到服务器或者其他本地电脑上进行运行,为了能够在这些环境上运行和通过质量检测,会产生大量的配置环境的开销,并且在部署时由于版本、配置问题项目经常会挂掉。总而言之,环境配置相当麻烦,换一台主机就要重新来配置一次,费时费力。

docker从根本上解决换主机重新配置环境问题,因为docker把原始的配置环境也复制一份过来。此时的docker像一个容器装载着源代码+配置+环境+版本+各种第三方组件并将这些打包成一个镜像iso文件,让镜像文件在docker引擎上运行。更专业的来讲,docker给出了一个标准化的解决方案——系统平滑移植,容器虚拟化技术

🐋2.理念

docker是通过对组件的封装分发部署运行等生命周期的管理,使用户应用及其运行环境能够做到一次镜像,处处运行

一句话概括

docker解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术

面试题: 容器与虚拟机比较

传统虚拟机,运行一个软件,创建一个新的虚拟机实例。占用资源多、步骤冗余、启动慢

image-20220410103147459

Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

Linux容器:不需要模拟一个完整的操作系统,而是对进程进行隔离。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件所需的库资源和设置。系统因此变的高效轻量并保证部署在任何环境中的软件都能始终如一地运行

image-20220410102532295

🐋3.优势

一次构建、随处运行

  • 更快速的应用交付和部署

传统的应用开发完成后,需要提供大量的安装程序和配置文件及说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行,使用Docker只需要交付少量容器镜像文件,在正常生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间

  • 更便捷的升级和扩缩容

当现有容器不足以支撑业务时,可通过镜像运行新的容器进行快速扩容。

  • 更简单的系统运维

应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG

  • 更高效的计算资源利用

Docker是内核级虚拟化,不需要额外的Hypervisor(虚拟机监视器,是用来建立与执行虚拟机器的软件、固件或硬件)支持,在一台主机上可以运行多个容器实例,大大提升物理服务器的CPU和内存的利用率

🐳2.Docker安装与卸载

🐋1.docker三要素:

镜像:

是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建多个容器 docker镜像文件类似于Java的类模板,而docker容器实例类似于Java中new出来的实例

容器:

容器时用镜像创建的运行实例,类似于一个虚拟化的运行环境,可以看作是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序

仓库:

集中存放镜像文件的地方,Docker公司提供的官方仓库 Docker Hub 存放了大量的镜像供用户下载。国内的公开阿里云等。

通俗来讲,比如说王者荣耀的红蓝BUFF野怪,新刷新出来的就相当于从天美游戏库模板中 创建出来一个野怪,这个野怪(容器)在自己的坑位上可以移动、攻击、有血条是一个独立运行的最小单元。而腾讯云中存放了各种野怪的模板(镜像文件)

docker平台架构图解(入门版)
image-20220422152902040

🐋2.安装Dockers引擎

docker官网

注意:docker必须部署在Linux内核的系统上

1.打开docker官网

image-20220422202719660

2.进入手册

image-20220422202829414

3.以CentOS7及以上版本为例

image-20220422203152210

4.卸载旧版本(第一次安装跳过此步骤)

image-20220422203316040

5.yum安装gcc相关

yum -y install gcc

image-20220422203605128

yum -y install gcc-c++

image-20220422203736950

6.官网给出三种安装方法 我们选择第一种也是最常用的一种

image-20220422203920448

安装yum工具包

image-20220422204120660

yum install -y yum-utils

image-20220422204222249

7.设置stable镜像仓库

官网给的是:

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

但是这个镜像仓库服务器在国外,我们使用可能会经常连接超时。

我们使用阿里云的镜像仓库

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

image-20220422205018102

tips:建议更新下yum软件包索引

yum makecache fast

image-20220422205214333

8.安装docker引擎

image-20220422205304889

yum install docker-ce docker-ce-cli containerd.io

image-20220422205501526<img src=" title="image-20220422205516544">

安装成功!!!

🐋3.测试

1.启动 docker

systemctl start docker

<img src=" title="image-20220422205840891">
查看docker进程

2.熟悉的hello world

docker run hello-world
<img src=" title="image-20220422210253284">

docker测试通过!!!🥰🥰🥰

docker执行hello world流程图解:
image-20220422214256081

🐋4.卸载

安装一遍不过瘾,想要卸载重新再装一次

卸载命令

systemctl stop docker

yum remove docker-ce docker-ce-cli containerd.io

rm -rf /var/lib/docker

rm -rf /var/lib/containerd

(你在期待什么?我可不演示哦🤪🤪🤪)

🐳3.Docker常用命令

🐋1.帮助启动类命令

🐟1.启动:

systemctl start docker

image-20220422221424225

🐟2.停止:

systemctl stop docker
image-20220422221317260

🐟3.重启:

systemctl restart docker

🐟4.查看docker状态:

systemctl status docker

🐟5.开机启动:

systemctl enable docker
image-20220422221454188

🐟6.查看docker概要信息:

docker info
image-20220422221536951

🐟7.查看docker总体帮助文档:

docker --help
image-20220422221600925

🐟8.查看docker命令帮助文档:

docker +具体命令 --help

🐋2.镜像命令

🐟1.列出本机上的镜像: docker images
image-20220423094649427

参数说明: -a:列出本地所有的镜像(含历史映像层)

-q : 只显示镜像ID
image-20220423094846067

🐟2.查询某个镜像: docker search +镜像名

参数:--limit 只列出N个镜像,默认25个

docker search --limit 5 hello-world
image-20220423095545435
参数说明
image-20220423095157241

🐟3.下载镜像 docker pull + 镜像名[:TAG]

TAG版本号 省略就是默认下载最新版本
image-20220423100159425

🐟4.查看镜像/容器/数据卷所占的空间 docker system df
image-20220423100611687

🐟5. 删除某个镜像 docker rmi +镜像名/镜像ID

强制删除 docker rmi -f 镜像ID

删除多个 docker rmi -f 镜像名1:TAG 镜像名2:TAG

删除全部 docker rmi -f $(docker images -qa)

面试题: 谈谈 docker 虚悬镜像是什么?

仓库名、标签都是\<none>的镜像,称为虚悬镜像
image-20220423215557374

🐋3.容器命令

直接进行拉取Ubuntu最新版
image-20220423102055111

🐟1. 新建+启动容器 docker run [OPTIONS] IMAGE [COMMAND][ARG...]

参数说明:--name ="容器新名字" 为容器指定一个名称

-d :后台运行容器并返回容器ID,启动守护式容器(后台运行):

在大部分场景下,docker的服务是在后台运行的 docker run -d 容器名

image-20220423201606491
Dokcer容器后台运行,就必须有一个前台进程

因此像Ubuntu这样需要交互的需要用下面的启动方式

-i : 以交互模式运行容器,通常与-t 同时使用

-t :为容器重新分配一个伪输入终端,通常与 -i 同时使用

启动交互式容器(前台有伪终端,等待交互)
image-20220423110152526
而像redis这样只需要后台默默运行的,如果使用前台交互的形式就会很容器因为一些操作造成容器退出
image-20220423202130551
因此,在使用docker启动容器前,应该首先考虑容器是适合后台运行还是交互式运行

-P:随机端口映射,大写P

-p:指定端口映射,小写p

🐟2.列出当前运行的所有容器 docker ps

新建一个会话 查看刚才运行的Ubuntu
image-20220423110346840

创建一个名称为myu1的Ubuntu容器实例
image-20220423110838871
再新建一个会话 查看所有运行的容器
image-20220423110916034
参数:docker ps [OPTIONS]

-a :列出当前所有正在运行和历史上运行过的容器

-l :显示最近创建的容器

-n:显示最近n个创建的容器

-q:静默模式,只显示容器编号

🐟3.退出容器

  • exit run进去容器,exit退出,容器停止
  • ctrl+p+q run进去容器,ctrl+p+q退出,容器不停止

image-20220423112125913

🐟4.启动已停止运行的容器 docker start 容器ID或者容器名

重启容器 docker restart 容器ID或者容器名

停止容器 docker stop 容器ID或者容器名

强制停止容器 docker kill 容器ID或者容器名

🐟5.删除已停止的容器 docker rm 容器ID
image-20220423112826154

image-20220423113030049

docker rm -f 容器ID 强制删除容器

docker rm -f $(docker ps -a -q) 删除多个容器实例

docker ps -a -q | xargs docker rm 删除多个容器实例

🐟6.查看容器日志 docker logs +容器IDimage-20220423203405621

🐟7.查看容器内运行的进程 docker top + 容器ID

image-20220423203624477

🐟8.查看容器内部细节 docker inspect 容器ID

image-20220423203940869

🐟9.进入正在运行的容器并以命令行交互

启动ubuntu容器并使用Ctrl+p+q退出

image-20220423204936097

这个时候使用 docker exec -it 容器ID bashShell 继续进行命令行交互

image-20220423205153470

命令 docker attach 容器ID 同样也可以

attach 直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止

exec 在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止

image-20220423205720845

image-20220423205912316

推荐使用 docker exec 命令,这样退出容器终端不会导致容器退出

🐟10.从容器内拷贝文件到主机

docker cp 容器ID:容器内部路径 目的主机路径

在Ubuntu容器中创建一个a.txt文件

image-20220423213645055

拷贝到本机 /opt目录下
image-20220423214043330

🐟11. 导入/导出容器

导出容器的内容留作为一个tar归档文件 docker export 容器ID > 文件名.tar

image-20220423214935525

从tar包中的内容创建一个新的文件系统再导入为镜像 cat 文件名.tar | docker import -镜像用户/镜像名:镜像版本号

image-20220423215634313

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
运维 监控 Docker
构建高效微服务架构:从理论到实践构建高效自动化运维体系:Ansible与Docker的完美融合
【5月更文挑战第31天】 在当今软件开发的世界中,微服务架构已经成为了实现可伸缩、灵活且容错的系统的关键策略。本文将深入探讨如何从零开始构建一个高效的微服务系统,涵盖从概念理解、设计原则到具体实施步骤。我们将重点讨论微服务设计的最佳实践、常用的技术栈选择、以及如何克服常见的挑战,包括服务划分、数据一致性、服务发现和网络通信等。通过实际案例分析,本文旨在为开发者提供一套实用的指南,帮助他们构建出既健壮又易于维护的微服务系统。
|
3月前
|
Kubernetes 开发者 Docker
构建高效微服务架构:Docker与Kubernetes的协同应用
【5月更文挑战第30天】 在当今软件开发领域,微服务架构已成为实现系统模块化、提升可维护性及扩展性的关键策略。本文深入探讨了如何通过Docker容器化技术和Kubernetes集群管理,共同构建一个既高效又可靠的后端微服务环境。我们将剖析Docker和Kubernetes的核心功能,以及它们如何相辅相成,支撑起现代化的云原生应用程序部署和管理。文章还将提供具体实践案例,帮助开发者理解将理论应用于实际开发过程中的步骤和考虑因素。
|
23天前
|
Java Nacos Docker
使用docker compose 编排微服务发布
使用docker compose 编排微服务发布
30 3
|
1月前
|
Kubernetes Cloud Native 持续交付
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
|
3月前
|
Kubernetes 持续交付 Docker
构建高效微服务架构:Docker与Kubernetes的完美结合
【5月更文挑战第28天】在现代软件开发中,微服务架构已成为提高系统可维护性和扩展性的关键。本文深入探讨了如何利用Docker容器化技术和Kubernetes集群管理工具共同打造一个高效、可靠的微服务环境。通过分析两者的核心优势及互补特性,我们展示了一种优化的部署策略,旨在帮助开发者和系统管理员理解和实践在复杂分布式系统中实现服务的有效管理和自动化部署。
|
3月前
|
运维 监控 Docker
使用Docker进行微服务架构的部署
【5月更文挑战第18天】本文探讨了如何使用Docker进行微服务架构部署,介绍了Docker的基本概念,如容器化平台和核心组件,以及它与微服务的关系。通过Docker,每个微服务可独立运行在容器中,便于构建、测试和部署。文章详细阐述了使用Docker部署微服务的步骤,包括定义服务、编写Dockerfile、构建镜像、运行容器、配置服务通信、监控和日志管理以及扩展和更新。Docker为微服务提供了可移植、可扩展的解决方案,是现代微服务架构的理想选择。
|
3月前
|
Kubernetes 持续交付 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【5月更文挑战第17天】在当今云计算和微服务架构的大潮中,Docker容器化技术和Kubernetes容器编排系统成为了后端开发领域的热门技术栈。本文将探讨如何通过Docker和Kubernetes的结合使用来构建一个高效、可扩展且易于管理的微服务环境。我们将从基础概念出发,深入到实际操作层面,最后讨论这种组合对持续集成和持续部署(CI/CD)流程的影响,旨在为开发者和企业提供一种可靠的后端服务解决方案。
|
3天前
|
监控 负载均衡 API
从单体到微服务:架构转型之道
【8月更文挑战第17天】从单体架构到微服务架构的转型是一项复杂而系统的工程,需要综合考虑技术、团队、文化等多个方面的因素。通过合理的规划和实施策略,可以克服转型过程中的挑战,实现系统架构的升级和优化。微服务架构以其高度的模块化、可扩展性和灵活性,为业务的持续发展和创新提供了坚实的技术保障。
|
13天前
|
缓存 监控 API
【微服务战场上的神秘守门人】:揭秘API网关的超能力 —— 探索微服务架构中的终极守护者与它的神奇魔法!
【8月更文挑战第7天】随着微服务架构的流行,企业应用被拆分为围绕特定业务功能构建的小型服务。API网关作为微服务间的通信管理核心,对请求进行路由、认证、限流等处理,简化客户端集成并提升用户体验。以电商应用为例,通过Kong部署API网关,配置产品目录等服务的API及JWT认证插件,确保安全高效的数据交互。这种方式不仅增强了系统的可维护性和扩展性,还提供了额外的安全保障。
31 2
|
21天前
|
负载均衡 监控 API
探索微服务架构中的API网关模式
【7月更文挑战第30天】在微服务架构的复杂网络中,API网关扮演着交通枢纽的角色,不仅简化了客户端与各微服务的交互,还提升了系统的安全性和可维护性。本文将深入探讨API网关的设计原则、核心功能以及在实际应用中的部署策略,旨在为后端开发者提供一套完整的API网关解决方案。