【部署】Docker容器

2023-10-26

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【部署】Docker容器 的相关文章

随机推荐

  • 数据结构---n皇后问题

    n皇后问题 题目描述 JAVA实现 力扣提交代码 n皇后问题 题目描述 对于四皇后问题的解 放置一个皇后 棋盘被占据的解为 很明显 每行只能放置 且只能放置一个皇后 代码中 queen row 1 来实现的 一个完整的示例 放第一个皇后 放
  • 抖音将会输给快手?时间会证明一切

    为什么快手产品的主界面上没有设置频道分类 这样带来的用户体验真的好吗 在快手一个月之前的员工大会上 入职不久的新员工赵波提出了这个疑问 这个问题不只是他一个人的 之前官方的解答是 不意给用户设置标签是为了保持界面简洁 不对内容做过多的评判
  • i.MX6ULL - 从零开始移植uboot-imx_v2020.04_5.4.70_2.3.0

    i MX6ULL 从零开始移植uboot imx v2020 04 5 4 70 2 3 0 目录 i MX6ULL 从零开始移植uboot imx v2020 04 5 4 70 2 3 0 前言 1 环境搭建 2 NXP官方原版UBOO
  • 一文解决VS Code安装、C++环境配置、OpenCV配置

    前言 本文包括VScode安装 C 环境配置以及OpenCV配置全过程 VS Studio配置OpenCV比较简单 可以直接使用OpenCV官网已有的用VS Studio编译器编译好的OpenCV库 但VS Code不能直接利用VS Stu
  • Android:基本程序单元 Activity

    Activity 概述 在 Android 应用中 提供了 4 大基本组件 分别是 Activity Service BroadcastReceiver 和 ContentProvider 而 Activity 是 Android 应用最常
  • QApplication与QCoreApplication

    QApplication GUI 程序中 有且仅有一个 QApplication 类 管理GUI程序的控制流和主设置 QApplication 包含主事件循环 所有来自窗口系统和其他源的事件将被处理和分配 它也处理程序的初始化 析构和提供会
  • **vue.esm.js?efeb:591 [Vue warn]: Invalid prop: type check failed for prop "data". Expected Array

    vue esm js efeb 591 Vue warn Invalid prop type check failed for prop data Expected Array got String 有可能是这几种情况
  • CyclicBarrier底层源码解析

    一 概述 前面我们讲解了ReentrantLock CountDownLatch Semaphore的源码 他们都是由AQS来实现的 而CyclicBarrier则是通过ReentrantLock Condition实现的 CyclicBa
  • 达夫设备简单介绍

    前言 想到肯哥每天的Open话题 总能学到一些知识 怕忘记 所以我就当成博客记录一下了 今天要记录的是2023年6月5日 肯哥的技术交流群里面的一个代码 肯哥话题 肯哥的原话 hello 又到了每天的open话题时刻 今天我们聊点技术的东西
  • MATLAB学习——Matlab系统环境介绍

    本篇文章并不涉及Matlab的具体使用方法和相关函数 仅仅是和大家一起熟悉Matlab的操作界面 祝大家小年快乐 记得吃糖瓜 总体来说 Matlab的使用界面和office的使用界面具有很高的相似性 因此 对于要熟悉Matlab使用的初学者
  • JVM内存分配机制

    学习了JVM的内存分配机制为大家分享一下 现在把学习笔记总结记录一下 如果记录有些错误 还望指出 一 对象的创建 对象创建的主要流程 1 类加载检查 虚拟机遇到一条new指令时 首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引
  • 【 OpenCV】——图像缩放

    OpenCV 图像缩放 前言 本文介绍了图像放大 图像放小基础内容 使用步骤 1 引入库 include
  • 第五章 运输层 ---概述,端口号,复用,分用

    第五章 运输层 概述 端口号 复用 分用 5 1 运输层概述 作用范围与简介 总结 5 2 运输层端口号 复用 分用的概念 运输层端口号 发送方的复用与接收方的分用 TCP IP体系的应用层常用协议所使用的运输层熟知端口号 5 1 运输层概
  • python 定时器

    1 BlockingScheduler库 缺点 会阻塞代码 优点 调用定时函数时方便灵活定义定时 比如间隔多长时间调用一次 比如那几个月调用一次 代码 from apscheduler schedulers blocking import
  • torch.tensor拼接与list(tensors)

    tensor list tensors Construct list tensors To stack list tensors To concatenate list tensors Construct list tensors 创建一个
  • Linux操作笔记

    1 关闭死程序 root node3 ps aux grep fire root 2105 0 0 0 0 112660 964 pts 0 S 15 10 0 00 grep color auto fire root 10620 0 0
  • 最简单的Flutter权限管理插件

    文章目录 用法 配置权限 Android iOS 检查权限 请求权限 处理回调 例子 插件开发 欢迎关注公众号 编程之路从0到1 这是Flutter上的一个动态权限处理的插件库 可以让Flutter应用层的开发者以非常简单的API统一处理原
  • Springboot整合redis

    Springboot整合redis 原文链接 https www kuangstudy com bbs 1534913977346584577 为方便自己整合redis 特记录一下redisTemplate和redisUtil代码 1 自定
  • Kafka 2.0的简单Producer和Consumer实现

    系统环境 在kafka单节点运行环境下 尝试使用java创建Kafka的Producer和Consumer进行测试 具体的代码环境如下 OS Ubuntu 16 4 Kafka 2 11 2 0 0 Zookeeper 使用Kafka中自带
  • 【部署】Docker容器

    Docker 使用 Google 公司推出的 Go 语言进行开发实现 基于 Linux 内核的 cgroup namespace 以及 OverlayFS 类的 Union FS 等技术 对进程进行封装隔离 属于操作系统层面的虚拟化技术 由