【部署】Docker容器

news2024/12/27 11:49:27

Docker 使用 Google 公司推出的 Go 语言进行开发实现,基于 Linux 内核的 cgroup、namespace 以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。

https://vuepress.mirror.docker-practice.com/introduction/what/

简单来说,Docker 是一个在软件层面的实现,能为应用程序提供屏蔽计算机硬件以及操作系统层面的虚拟化。

Docker 来源

在 Docker 和虚拟机 Virtual Machine 未诞生之时,相同的程序在部署时,会需要关注各种软件的兼容性问题。不仅在计算机硬件层面的兼容问题,还在于计算机操作系统层面的兼容问题。

image.png

相同的软件部署在不同的环境下,呈现的结果可能会有极大差异。

在这种环境下,虚拟机产生了。我们通过虚拟机,可以做到屏蔽操作系统层面的实现,也可以针对不同水平的硬件环境,在硬件这种物理层面进行模拟。

image.png

但是如果我们只是想要部署运行一个应用程序,使用虚拟机会显得太过于笨重。因为通常情况下,虚拟机不仅要针对硬件环境模拟,还要针对全套的操作系统环境进行模拟。对于应用程序的部署来说,会有虚拟机模拟的大幅度性能损耗,也不方便部署。

于是 Docker 的产生就解决了这个问题。只需要在不同的操作系统中,安装 Docker 这一软件,我们就能实现操作系统层面的硬件环境的屏蔽。且相对于虚拟机,更加轻便小巧,性能损耗也更小。

image.png

Docker 简介

在 Docker 中,有一些非常重要的概念。

image.png

  • Dockerfile:用于创建容器,是一个自动化脚本。使用 Dockerfile 可以很方便地根据镜像创建容器。
  • Image:镜像。提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
  • Container:容器。镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间(NameSpace),因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间等。

image.png

Docker 安装

使用环境:使用 cat /proc/version 命令查看。

Cent OS7 64位:Linux version 3.10.0-693.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Tue Aug 22 21:09:27 UTC 2017

使用命令安装:

# 安装 gnome-terminal
sudo yum install gnome-terminal

# 删除残留文件
sudo yum remove docker-desktop

# 完整清理 docker 数据和配置
rm -r $HOME/.docker/desktop
sudo rm /usr/local/bin/com.docker.cli
sudo apt purge docker-desktop

# 清除旧版本的下载残留
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

设置安装的 Docker 使用的存储库:

# 官方推荐
sudo yum install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 建议使用
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

image.png

image.png

设置仓库源地址:

# aliyun 镜像
sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 清华镜像
sudo yum-config-manager \
    --add-repo \
    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

安装 Docker Engine-Community,此处安装的是默认版本。

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

**要安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装:**列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。

yum list docker-ce --showduplicates | sort -r

# 运行结果
docker-ce.x86_64            3:20.10.9-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.8-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.7-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.6-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.5-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.4-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.3-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.2-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.22-3.el7                   docker-ce-stable 

通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。

sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

接下来就可以使用 docker 了:

image.png

其他命令:

# 启动 docker
sudo systemctl start docker
# 运行容器
sudo docker run hello-world
# 删除安装包
yum remove docker-ce
# 删除所有相关文件
rm -rf /var/lib/docker

安装参考资料:

https://docs.docker.com/engine/install/ubuntu/

https://www.runoob.com/docker/centos-docker-install.html

DockerFile 文件

# 规定程序需要的运行环境,格式<Name>:<Version/Tag>
FROM python:3.8-slim-buster
# 规定程序的工作目录
WORKDIR /app
# 将源程序文件复制到目标目录
COPY . .
# RUN 表示创建镜像时需要运行的程序相关命令
RUN pip3 install -r requirements.txt
# 运行CMD指令
CMD ["python3", "app.py"]

按照既定的规则编写好 DockerFile 之后,我们就可以通过 DockerFile 创建指定的镜像。

Dockerfile.txt

注意:DockerFile 是创建镜像使用的。文件无任何后缀。

使用命令创建镜像:

# -t 指定镜像的名字
# 最后一个参数表示 DockerFile 所在的目录
docker build -t <ImageName> <DockerFile Path>

# 例如
docker build -t my-app .

使用命令启动容器:

# 通过 -p 指定机器端口和容器端口进行映射
# -d 指定镜像名称
docker run -p <MachinePort>:<ContainerPort> -d <ImageName>

之后我们可以在 Docker-Desktop 程序中看到启动的容器。

Docker 中容器和镜像的关系:

  • Java 中的一个类,可以借助这个类创建非常多的对象,也称为实例。
  • 类比于镜像和容器,镜像就是 Class,容器就是 Object。我们借助镜像可以创建非常多的容器,一个个容器就相当于实例。
  • 在针对某些容器进行操作,可以理解为我们向对象进行了各种赋值等操作;与此同时,对象/容器就有了各自的一些属性/数据。所以,我们需要持久化的是容器,而不是镜像。

其他命令:

# 列举所有的容器
docker ps
# 停止容器
docker stop <containerId>
# 重启容器
docker restart <containerId>
# 删除容器
docker rm <containerId>
# 启动一个远程 shell
docker exec -it <containerId> /bin/bash

Docker 持久化

需要注意的是,删除容器,会导致其中的数据全部丢失。相当于计算机中删除了虚拟机,那么在虚拟机中创建和修改的数据都会全部丢失。

如果想要数据不丢失,我们需要将 Docker 的 Container 中的数据进行持久化。

为了实现容器中数据的持久化保存和备份,我们可以使用 Docker 中的 Volumes 数据卷来实现。

image.png

参考文档:https://docs.docker.com/storage/volumes/

image.png

volume 就相当于在本地主机和不同容器之间的一个共享文件夹。在某一个容器上修改了数据,会对应反映在共同关联在该 volumn 的其他容器上。

创建 volume 数据卷:

# 创建数据卷
docker volume create <VolumeName>

# 启动或运行容器
# 这里的 <FilePath> 是指定将 volume 挂载 mounted 到机器的目标路径
docker run -dp 80:5000 -v <VolumeName>:<FilePath> <ImageName>

Docker 多容器部署

为了实现应用程序和数据的分布式部署,我们可以创建多个容器。这样可以提高系统的可用性,也能加快启动和恢复时间。

创建 docker-compose.yml 文件:

version: "1"

services:
  web:
    build: .
    ports:
      - "80:5000"

  db:
    image: "mysql"
    environment:
      MYSQL_DATABASE: app-db
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - app-data:/var/lib/mysql

volumes:
  my-app-data:
    /etc/app

docker-compose.yml

编写好文件之后,直接运行:

# -d 表示 detach 在后台运行
# 整个命令表示在后台运行所有yml文件中的所有容器
docker compose up -d
# 停止并删除所有容器,这里并不会删除 volumes 数据卷
# 如果需要删除所有的 volumes 数据卷,可以加上 --volumes 参数
docker compose down

Docker 与 Kubernates

Kubernates 能取代的是 Docker 中的容器引擎 Container-Engine,并不能取代 Docker。两者并非一个层面的东西。

image.png
Kubernates 更多做的是容器编排。即在部署容器的时候,相比原有的 Docker-Container-Engine 可以更好地做到负载均衡、故障转移等。

image-20230112004050931

参考资料:https://kubernetes.io/docs/concepts/overview/components/

在 Cluster 集群部署中,Kubernates 所做的就是将各个容器分发到一个集群中运行,并进行全自动化的管理,包括应用的部署和升级。

image.png

参考资料:

【Docker 10分钟快速入门】 https://www.bilibili.com/video/BV1s54y1n7Ev/?share_source=copy_web&vd_source=6de80ff9f17ce8c00bfb41f8d5c0afef

更多 Docker 相关资料:

https://docs.docker.com/

https://yeasy.gitbook.io/docker_practice

https://vuepress.mirror.docker-practice.com

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

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

相关文章

算法刷题打卡第63天:对称二叉树

对称二叉树 难度&#xff1a;简单 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false…

BOM浏览器对象模型

文章目录一、BOM概述1、什么是BOM2、BOM的构成二、window 对象的常见事件1、窗口加载事件&#xff08;1&#xff09;window.onload&#xff08;3&#xff09;DOMContentLoaded2、调整窗口大小事件三、定时器1、两种定时器2、setTimeout()定时器3、停止 setTimeout() 定时器4、s…

如何使用CMD修复硬盘命令来解决硬盘问题?

随着计算机的越来越普及&#xff0c;现在在我们的日常生活中都会使用到计算机电脑。硬盘作为计算机电脑的主要存储设备&#xff0c;里面存储着我们平时使用的软件文件、文档资料、照片等重要的数据文件。一旦硬盘损坏会给我们带来许多不必要的麻烦&#xff0c;那硬盘损坏有哪些…

图解卡尔曼滤波(Kalman Filter)

背景关于滤波首先援引来自知乎大神的解释。“一位专业课的教授给我们上课的时候&#xff0c;曾谈到&#xff1a;filtering is weighting&#xff08;滤波即加权&#xff09;。滤波的作用就是给不同的信号分量不同的权重。最简单的loss pass filter&#xff0c; 就是直接把低频的…

【Linux操作系统】1. Linux操作系统简介、安装

前言 本系列是Linux操作系统的一些知识以及实践内容&#xff0c;Linux操作系统作为开发最常使用的操作系统&#xff0c;是必备的一门求职、提升技术。本文先介绍Linux操作系统&#xff0c;并安装一个Linux操作系统。 Linux操作系统简介 Linux&#xff0c;全称GNU/Linux&#…

Javadoc

Javadoc 在学习JavaSE时&#xff0c;我们知道Java支持三种注释方式&#xff1a; 单行注释多行注释文档注释 Javadoc是文档注释&#xff0c;用来对类或方法进行标准的注释&#xff0c;在开发中写好JavaDoc非常重要。 在调用方法时&#xff0c;你可能会看到这样的情景 这种注…

Unity - 搬砖日志 - 如何设置AssetDatabase.Create(“xxx.asset“, mesh) 的Read/Write=false

最近很忙&#xff0c;想写的 BLOG 都遗漏编写了 踩坑的时间比较多&#xff0c;充电的时间少了很多 为了减少以后自己填坑时间&#xff0c;随便简单的记录一下 搬砖日志 环境 unity : 2020.3.37f1 pipeline : brp 问题 因为之前搜索、购买、使用了各式各样的 LOD 插件、工具…

机器学习100天(三十一):031 K近邻回归算法

机器学习100天,今天讲的是:K 近邻回归算法! 《机器学习100天》完整目录:目录 一、理论介绍 我们之前讲了 K 近邻分类算法,用来处理分类问题。其实 K 近邻也可以用来处理回归问题。 如左图所示,K 近邻分类算法的思路是选取与测试样本距离最近的前 k 个训练样本。然后对…

回收租赁商城系统功能拆解07讲-订单列表

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…

寒假题练——day(3)

题目1&#xff1a; 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 进阶&#xff1a;尝试设计时间复杂度为 O(n)、空间复杂度为…

58、正则表达式

目录 一、快速入门 二、正则表达式基本语法 1、基本介绍&#xff1a; 2、正则表达式底层实现 3、元字符&#xff08;Metacharacter&#xff09;- 转义号\\ &#xff08;1&#xff09;限定符 &#xff08;2&#xff09;选择匹配符 &#xff08;5&#xff09;字符匹配符…

FX5U DRVMUL指令多个轴的表格运行

1.简述该指令可以用GX Works3预先在表格数据中设定的控制方式的动作&#xff0c;执行多个轴的表格。 2.指令解释同时执行多个轴的表格。指令执行开始后&#xff0c;各轴独立进行动作&#xff0c;也可连续运行。但是&#xff0c;只可在同一模块内同时执行2.1 操作数n1在(n1)中指…

.NETCore 多线程学习笔记(多线程、线程结束顺序掌控、线程相对平均分配)

参考资料&#xff1a;多线程MutiThread最佳实践专题-1-1_哔哩哔哩_bilibili 跟着视频学习的&#xff0c;下面是自己的注释笔记和实验结果 写了个窗体来学习线程的 多线程、线程掌控、线程分配 下面会用到这个方法 /// <summary> /// 仅仅只是一个耗时方法 …

STM32RTC外设详解

目录一.RTC 实时时钟简介1.RTC时钟来源2.RTC主要特性二.RTC 外设功能框图1.RTC功能框图剖析2.使能对后备寄存器和RTC的访问3.复位过程4.读RTC寄存器5.配置RTC寄存器三.实现一个简易时钟1.实验目的2.实验原理3.实验源码4.效果演示一.RTC 实时时钟简介 实时时钟是一个独立的定时…

链表题目总结 -- 双指针技巧

文章目录一. 合并两个有序链表1. 思路简述2. 代码3. 总结二. 分隔链表1. 思路简述2. 代码3. 总结三. 合并K个升序链表1. 思路简述2. 代码3. 总结四. 单链表的倒数第 k 个节点1. 思路简述2. 代码3. 总结五. 链表的中间结点1. 思路简述2. 代码3. 总结六. 环形链表&#xff08;链表…

docker一个容器内部署多个服务

原因是&#xff0c;我有一个springBoot服务需要写入httpd的目录&#xff0c;然后httpd提供链接给别人下载。之前的方法是&#xff0c;httpd和springBoot各一个容器&#xff0c;但是我们将镜像是部署在腾讯云上的&#xff0c;腾讯云会自动对每个容器分离不同的虚拟机&#xff0c…

pytorch简单自定义Datasets

前言 本文记录一下如何简单自定义pytorch中Datasets&#xff0c;官方教程文件层级目录如下&#xff1a; images 1.jpg2.jpg…9.jpg annotations_file.csv 数据说明 image文件夹中有需要训练的图片&#xff0c;annotations_file.csv中有2列&#xff0c;分别为image_id和labe…

Python的23种设计模式(完整版带源码实例)

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; Python的23种设计模式 一 什么是设计模式 设计模式是面对各种问题进行提炼和抽象而形成的解决方案。这些设计方案是前人不断试验&…

【入门篇】1 # 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

说明 【数据结构与算法之美】专栏学习笔记。 什么是复杂度&#xff1f; 复杂度也叫渐进复杂度&#xff0c;包括时间复杂度和空间复杂度&#xff0c;用来分析算法执行效率与数据规模之间的增长关系&#xff0c;可以粗略地表示&#xff0c;越高阶复杂度的算法&#xff0c;执行…

时域脉冲通信采用高斯脉冲且使用PAM调制的Matlab简易演示仿真

时域脉冲通信采用高斯脉冲且使用PAM调制的Matlab简易演示仿真 环境 matlab 2016a 指标 1 将声音信号转为二进制码 2 PAM调制 3 采用高斯脉冲 流程 代码 [OriginVoice,fs]audioread(voice.m4a) ; OriginVoiceOriginVoice(:,2); Nlength(OriginVoice); % 计算信号x的长度 …