当前位置: 首页 > news >正文

Docker的部署与基本使用

Docker的部署和基本使用

Docker是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包成独立的、可移植的容器,从而简化了应用程序的部署、管理和扩展过程。这些容器可以在任何支持Docker的平台上运行,确保了应用的一致性和可移植性。

Docker的三个核心组件:镜像(Image)、容器(Container)、仓库(Repository)

  • 镜像是Docker的基础,它包含了应用程序及其所需的运行环境和依赖项,可以看作是静态的、只读的文件系统模板。
  • 容器则是基于镜像创建的,它是镜像的运行实例,提供了独立的运行环境,可以运行、启动、停止、删除等操作,具有轻量级、可移植和隔离性的特点。
  • 仓库则用于存储和管理镜像,用户可以从仓库中拉取镜像到本地进行部署,也可以将本地的镜像推送到仓库进行分享和备份,实现了镜像的集中管理和分发。

Ubuntu安装docker

  • 更新系统软件包
sudo apt update
sudo apt upgrade
  • 卸载旧版本的Docker(如果已安装
sudo apt-get remove docker docker-engine docker.io containerd runc
  • 安装Docker依赖
sudo apt-get install ca-certificates curl gnupg lsb-release
  • 添加Docker官方GPG密钥(为了确保下载的Docker软件包是官方的、未被篡改的,需要添加Docker官方的GPG密钥)。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • 添加Docker软件源
sudo apt install software-properties-common
sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  • 安装Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io

镜像(Image)

镜像是通过Dockerfile来创建的,Dockerfile是一个文本文件,其中包含了创建镜像所需的一系列指令和配置。开发者在Dockerfile中定义应用程序的依赖项、运行环境以及构建步骤。Dockerfile的名称是固定的,通常放到项目的根目录下。

Dockerfile 举例:

FROM ubuntu:latest   # 基于最新版本的 Ubuntu 镜像构建基础镜像RUN apt-get update && apt-get install -y g++   # 更新包列表并安装 g++ 编译器WORKDIR /cpp_test   # 设置工作目录为 /cpp_test。工作目录是在容器内执行命令时的默认目录COPY a.cpp .   # 将宿主机当前路径下的 a.cpp 文件复制到镜像的工作目录 /cpp_test 中RUN g++ a.cpp -o a.out   # 在工作目录 /cpp_test 中编译 a.cpp,生成可执行文件 a.outCOPY b.cpp .   # 将宿主机当前路径下的 b.cpp 文件复制到镜像的工作目录 /cpp_test 中RUN g++ b.cpp -o b.out   # 在工作目录 /cpp_test 中编译 b.cpp,生成可执行文件 b.out
  • Layer Caching 基本原理

    • 分层结构
      • Docker镜像由多个只读层(Layer)组成,每个层都包含了镜像的一个状态快照。这些层是堆叠在一起的,最底层是基础镜像,之后的每一层都基于前一层进行修改。
    • 分层缓存
      • 当你构建一个Docker镜像时,Docker会对每一层进行缓存。每次运行构建命令时,Docker会检查之前是否已经创建了相同的层。如果找到匹配的层,Docker就会重用该层的缓存,而不是重新构建。
    • 缓存失效
      • 如果Dockerfile的任何一步发生了变化(包括文件内容、命令参数等),从该变化的命令开始的所有后续命令的缓存都会失效,需要重新构建。
    • 缓存层大小
      • 每个层都占用磁盘空间,过多的层会导致镜像体积变大,影响性能。优化Dockerfile可以减少层的数量,例如合并多条RUN命令。
  • 构建Docker镜像。最后的 . 代表Dockerfile的相对路径。

sudo docker build -t 'image_name' .
 sudo docker build --progress=plain -t 'image_name' .

--progress=plain 选项是在build过程中查看Cache的命中情况,下图是基于上述脚本,在修改a.cpp文件后重新build的示例:

在这里插入图片描述

  • 查看image列表
sudo docker images list
  • 删除image
sudo docker rmi [IMAGEID]

容器(Container)

  • 启动容器

    docker run [OPTIONS] image_name
    

    OPTIONS:

    • -d, --detach : 在后台运行容器并打印容器ID。
    • -p XXX:YYY, --publish :将宿主机端口(XXX)映射到容器的端口(YYY)。
    • -v Host_dir:Container_dir, --volume :挂载宿主机目录或卷到容器。如果容器内该目录已存在文件或子目录,它们会被宿主机目录中的内容所覆盖,并保持实时同步映射
    • --name:为容器指定一个名称。
  • 查看docker运行的容器

sudo docker ps
  • 停止容器
sudo docker stop [CONTAINER_ID]
  • 删除容器:默认情况下,docker rm 命令只能删除已停止的容器。如果你尝试删除一个正在运行的容器,Docker会返回一个错误。一旦容器被删除,它的所有状态、文件系统更改和网络命名空间等信息都将被永久删除,并且无法恢复。
sudo docker rm [CONTAINER_ID] 

相关文章:

  • $nextTick的使用场景介绍
  • Python使用rosbag使用getattr只能获取一层的数据,不能直接获取多层数据例如 a.b.c.d。使用for range写一个递归用来获取多层数据
  • SmartEDA:革新电路设计,体验前所未有的创新乐趣!
  • CVE-2022-4230
  • 【TB作品】MSP430F149 单片机 音乐喷泉
  • Spring Cloud工程添加子模块打包后文件为war包而非jar包
  • C语言小例程6/100
  • 【Linux】线程控制
  • MongoDB CRUD操作:地理位置查询
  • 操作系统教材第6版——个人笔记6
  • WPF国际化的最佳实践
  • SASS模块化与组织文件
  • 5-Maven-setttings和pom.xml常用配置一览
  • c#vb代码互转工具
  • SpringBoot+Vue校园管理系统(前后端分离)
  • 【译】JS基础算法脚本:字符串结尾
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【391天】每日项目总结系列128(2018.03.03)
  • Angular6错误 Service: No provider for Renderer2
  • EOS是什么
  • flutter的key在widget list的作用以及必要性
  • JavaScript-Array类型
  • Js基础——数据类型之Null和Undefined
  • log4j2输出到kafka
  • Phpstorm怎样批量删除空行?
  • React 快速上手 - 07 前端路由 react-router
  • React16时代,该用什么姿势写 React ?
  • session共享问题解决方案
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Vue--数据传输
  • 飞驰在Mesos的涡轮引擎上
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 悄悄地说一个bug
  • 与 ConTeXt MkIV 官方文档的接驳
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 智能合约Solidity教程-事件和日志(一)
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #考研#计算机文化知识1(局域网及网络互联)
  • (12)Hive调优——count distinct去重优化
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (3)llvm ir转换过程
  • (C++17) optional的使用
  • (CPU/GPU)粒子继承贴图颜色发射
  • (七)Java对象在Hibernate持久化层的状态
  • (三)c52学习之旅-点亮LED灯
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .cfg\.dat\.mak(持续补充)
  • .net core 控制台应用程序读取配置文件app.config
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .Net Remoting(分离服务程序实现) - Part.3