Docker笔记:基本概念、镜像、容器、仓库以及数据卷的使用

2023-11-18

什么是docker

  • docker 是一个开源的应用容器引擎
  • 可以使用docker将应用程序和依赖打包到一个镜像之中
  • 可以非常方便的移植到其他机器上运行
  • 使用docker构建打包我们的应用(build),之后可以像集装箱一样很方便的传输到别的机器上(ship),可以在任何环境下运行我们的应用程序
  • 用官方的话概况为:Build, Ship, and Run Any App, Anywhere
  • docker可以运行在物理机、虚拟机、云平台、笔记本,我们不用担心环境的变化导致程序不能正常运行的问题
  • 语言或框架在不同版本之间会存在很大差别, 如果要部署不同版本依赖的应用,将增加运维的复杂程度,容器技术的发展很好的解决了这一问题
  • 容器技术可以让我们大规模的部署应用:
    • 早在2016年,京东就将全部流量运行在docker之上,运行容器达到15万个,docker完美支持了618的大促销
    • 阿里这边也使用了几十万个docker来提供服务
  • 我们也可以把docker来当成虚拟机来使用

docker与虚拟机

  • 虚拟机可以在一台物理机上运行多个操作系统
  • 虚拟机是完全虚拟出一整套的硬件设备,里面的每个操作系统都是完整的
  • docker容器则非常简单,应用进程直接运行在物理机的内核上,docker容器上面没有内核,只有应用
  • docker不需要硬件虚拟,容器要比传统的虚拟机更轻便,效率更高,性能接近原生
  • 可以在单台物理机上可以启动上千个docker容器(要看物理机的具体配置)
  • docker容器技术被应用在自动化打包发布, 自动化测试, 持续集成, 以及快速的部署应用

docker的一些基本概念

1 ) Image 镜像

  • 镜像是一个特殊的文件系统,是个虚拟的概念,是多层文件系统联合组成的
  • 镜像构建好后,基本不去改变它

2 ) Container 容器

  • 将docker镜像运行后就会产生一个容器
  • 容器的本质是进程,每个容器都有属于自己的独立命名空间,也就是容器内运行的进程运行在一个隔离的环境中,感觉上就是一个独立的操作系统
  • 可以在同一个镜像上启动多个容器,每个容器之间也是相互独立的,如果多个容器同时修改镜像上的一个文件也不会导致冲突
  • 镜像是分层文件系统,一个镜像构建好后是不会发生改变的,所以不会造成冲突
  • 通过镜像启动容器后,容器会创造一个临时的存储层,当容器被删除时,存储层也会随之消失
  • 在使用容器的时候,不要在容器内部保存一些数据,我们会使用数据卷来存放数据

3 ) Repository 仓库

  • 仓库是用于存储镜像的,构建好镜像后,将镜像文件保存在仓库之中
  • 每个仓库可以包含多个标签,每个标签对应着一个镜像
  • 比如制作一个叫ubuntu的镜像,我们可以用ubuntu:15.01表示我们的镜像,15.01就是标签(tag)
  • 如果在构建镜像的时候,没有写标签,docker会使用一个latest来作为默认的标签

docker的安装

1 ) docker版本

  • CE 社区版 Community Edition (免费)
  • EE 企业版 Enterprise Edition (收费)
  • 支持各大流行操作系统:linux、windows、macos等
  • 我们在这里只记录在linux上的安装和使用

2 ) docker的安装

  • 我们选择安装社区版
  • 在docker官方文档上:docs.docker.com 点击左侧Get Docker 找到 Docker CE 下的Ubuntu文档
  • 首先要更新apt, $ sudo apt-get update
  • 然后安装docker所需要的一些依赖:
    sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        software-properties-common
    
  • 第三步, 添加docker的官方GPG key, $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • 第四步, 验证下key, $ sudo apt-key fingerprint 0EBFCD88 和 官方一致,则表示成功了
  • 第五步, 添加docker仓库
    sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
    
  • 第六步, 正式安装docker
    • 先update, $ sudo apt-get update
    • 使用apt进行安装, $ sudo apt-get install docker-ce docker-ce-cli containerd.io
  • 第七步, 查看docker版本, $ docker --version

docker服务管理

  • $ service docker stop 停止
  • $ service docker start 开启
  • $ service docker restart 重启

查看docker其他基础命令

  • $ docker info 查看docker更多信息
  • $ docker --help 查看docker帮助文档

docker的镜像管理

1 ) Image 镜像仓库

  • hub.docker.com

    • 是docker官方的镜像仓库,也是我们最常用的镜像仓库
    • 点击explore进入: hub.docker.com/explore 可以搜索我们想要的docker镜像
    • 如果想要ubuntu操作系统镜像,只需要搜索 ubuntu 即可,我们可以通过 docker pull 来拉取这个镜像 $ docker pull ubuntu
    • 每个镜像都有一个标签,我们可以拉取特定版本的镜像,如:$ docker pull ubuntu:17.10
    • 我们也可以拉取 alpine 镜像, 这个镜像也是一个linux的操作系统镜像 $ docker pull alpine 没有指定标签, 默认拉取latest标签
  • dev.aliyun.com

    • 如果docker镜像下载的非常慢, 我们可以指定国内的阿里云服务器
    • 进入dev.aliyun.com登录后进入管理中心, 进入容器镜像服务, 点进镜像加速器,选择对应的操作系统如Ubuntu, 复制并执行
      sudo mkdir -p /etc/docker
      sudo tee /etc/docker/daemon.json <<-'EOF'
      {
          "registry-mirrors":["https://bwxenga6.mirror.aliyuncs.com"]
      }
      EOF
      sudo systemctl daemon-reload
      sudo systemctl restart docker
      
    • 执行完成后,docker就默认在阿里云上拉取镜像了,速度会提升很多

2 ) Image 镜像管理的相关命令

  • 在docker中,所有的镜像相关的操作都封装在 docker image 这个命令下
  • 查看当前已经拉取的镜像 $ docker image ls 或 $ docker images
    REPOSITORY     TAG          IMAGE ID        CREATED          SIZE
    alpine         latest       3fd9065eaf02    3 months ago     4.15MB
    
  • $ docker pull 命令等同于 $ docker image pull
    • $ docker image pull hello-world
    • hello-world 是docker提供用于测试的镜像
  • 删除 hello-world镜像, $ docker image rm hello-world 或 $ docker rmi hello-world
  • 其他命令通过 $ docker 或 $ docker --help 或 $ docker image pull --help 等 来查看具体使用

docker的Container容器管理的相关命令

  • 在docker中将一个镜像运行起来就可以创造一个新的容器
  • $ docker container 用于所有容器相关的管理命令
  • $ docker container ls 列出所有容器
  • $ docker container rm 删除一个或多个容器
  • $ docker container run 在一个新容器中运行一条命令
  • $ docker container stop 停止一个或多个运行中的容器
  • $ docker container kill 强制结束一个或多个运行中的容器

具体示例:

  • $ docker container run alpine echo "hello docker" 通过运行一个镜像得到一个容器
    • alpine是一个linux操作系统
    • echo “hello docker” 是将在alpine上执行的一条命令
    • 这时候我们已经成功的运行了一个容器
    • 如果alpine这个镜像文件不存在,docker会自动pull这个镜像
    • 这行命令表示在alpine镜像所启动的容器里面执行一句指令echo “hello docker”
    • docker container run 还可以省略成 docker run 即:$docker run alpine echo "hello docker"
    • 当前容器在执行完这条命令时,便自动停止
  • 列出当前启动的容器, $ docker container ls 或 $ docker ps
  • 列出所有容器, $ docker container ls -a 或 $ docker ps -a
  • 删除容器:$ docker container rm 容器ID
  • 运行一个不会自动停止的命令 $ docker run alpine ping www.baidu.com,ctrl + c结束容器运行
  • 在实际应用中,我们有大量的服务需要长时间运行, 我们可以使用-d的选项,让容器以后台服务的方式长时间的运行
    • 如:$ docker run -d alpine ping www.baidu.com 打印了一个容器ID,没有占用终端,以一个服务的方式来启动了我们的容器
    • 我们需要停止这个容器时,就可以通过 $ docker stop 容器ID, 可能需要等待一些时间,很快
  • 在实际使用中, 每次run之后就会产生一个新的容器, 有大量的容器在运行结束后,并不需要保留,我们可以使用 --rm 选项来回收(自动删除)
    • 如:$ docker run --rm alpine echo "hello docker"
    • 自动删除选项会将在容器中产生的数据一并删除,如果要持久保存容器中的数据,就要用到数据卷的方式
  • 大多数情况下,我们需要容器一直运行着对外提供服务,即容器以一个服务的方式来运行,我们以后来说明

docker中volume数据卷的使用

  • 在一个镜像上运行一个容器的时候,容器会创建一个临时的存储层, 来临时的保存容器中所产生的数据,当容器被删除时, 存储层同时被删除
  • 为了将容器中产生的数据及时保留下来,可以将物理机中的一个目录映射到容器中去,容器会在这个映射后的目录中保存数据,同时会永久的保存在物理机上,而不会随着容器的消失而消失
  • 目录的映射 $ docker run -v
    • 启动一个容器:$ docker run --rm -v /root:/data alpine touch /data/test.txt
    • 将物理机上的/root目录映射到容器中的/data目录
    • 执行完毕后,发现在物理机/root目录下存在一个test.txt文件
    • 可以优化指令:$ docker run --rm -v $(pwd):/data alpine touch /data/test.txt
    • 这条命令是说将当前目录映射到/data目录中去, 如果当前目录有空格,需要加上"", 即:
    • $ docker run --rm -v "$(pwd):/data" alpine touch /data/test.txt 这里在映射的关系上加上双引号
    • 还有一种只读挂载的方式: $ docker run --rm -v $(pwd):/data:ro alpine touch /data/test2.txt
    • 这里的ro表示readonly 只读的映射
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker笔记:基本概念、镜像、容器、仓库以及数据卷的使用 的相关文章

随机推荐

  • C# --- Case Study

    C Case Study C Mongo数据库事务的应用 C 如何解析Json文件并注入MongoDB C MongoDB如何安全的替换Collection C netcore MVC项目框架结构 with MongoDB
  • 积分获取方式的两点优化建议

    积分获取是积分体系运营中的一个重要环节 也是针对用户运营的一个开端 如果积分获取做的不到位 那么商家就没法对用户的行为进行引导 也就没法实现商家的预期目标 整个积分体系就相当于白忙活了 这一点商家要特别的注意 在积分体系运营中 商家对于积分
  • 网课-cnn

    图像识别中遇到的问题可能有图片特征的纬度过高 1000 1000像素的图片 特征维度是1000 1000 3 如果你要输入3百万的数据量就意味着特征向量的维度高达三百万 也许有1000个隐藏单元 而所有的权值组成的矩阵W 1 如果使用标准的
  • git第一次配置ssh key,clone代码出错解决方法

    错误 The authenticity of host can t be established ED25519 key fingerprint is SHA256 k4ViHJBFryacGI BqHphyjDBaRLwt5eSGRMJG
  • vue table合并行 动态列名

    需求 1 合并行 相同数据合并 2 根据后端返回数据动态显示列名 我这个业务需求是 每年增加一列 也就是列名不是固定的 后端返回数据每年会多一条数据 根据返回数据显示列名 实现 html
  • 论文阅读 StyleCLIP:《StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery》

    论文地址 https arxiv org pdf 2103 17249 pdf 文章目录 摘要 1 介绍 2 相关工作 2 1 视觉与语言 2 2 潜空间图像处理 3 StyleCLIP文本驱动操作 4 潜在优化 5 潜在映射 6 全局方向
  • 解密蓝牙mesh系列

    转载自 蓝牙技术联盟 蓝牙mesh网络 友谊篇 低功耗蓝牙 Bluetooth Low Energy 是全球最具节能性的短距离无线通信技术之一 其低功耗的特性广受开发者和消费者赞誉 随着蓝牙mesh网络的推出 开发者可能想知道蓝牙mesh网
  • Python3 如何优雅地使用正则表达式(详解五)

    非捕获组命名组 精心设计的正则表达式可能会划分很多组 这些组不仅可以匹配相关的子串 还能够对正则表达式本身进行分组和结构化 在复杂的正则表达式中 由于有太多的组 因此通过组的序号来跟踪和使用会变得困难 有两个新的功能可以帮你解决这个问题 非
  • 线性稳压器基础知识

    1 1 什么是线性稳压器 线性稳压器的工作原理是 采用一个压控电流源以强制在稳压器输出端上产生一个固定 电压 控制电路连续监视 检测 输出电压 并调节电流源 根据负载的需求 以把输 出电压保持在期望的数值 电流源的设计极限限定了稳压器在仍然
  • C++输入输出(一)

    C 并没有专门的输入输出函数 他们都存在于库中 如果要使用cout cin和getline 需要导入iostream库 如果要是用其他的输入输出方式 需要导入cstdio库 一 cout流输出 这个输出方式我们很早就学过了 他的使用方式如下
  • Home Assistant 南方电网 计算电费

    目录 1 China Southern Power Grid Statistics集成 2 获取当月用电情况 3 计算电费然后在UI上显示 3 效果 1 China Southern Power Grid Statistics集成 链接 2
  • ANSYS WORKBENCH 后处理 之 提取截面查看云图

    这是一个结果的云图 现在想要查看管道某横截面的云图 步骤1右键coordinate systems 创建一个坐标系步骤2更改新建坐标轴属性 步骤3新建一个surface 定义中选择刚才创建的坐标系步骤4右键solution 选择刚才创建的面
  • c++的char[]和char*的区别

    大家先来看这道测试题 char str1 abc char str2 abc const char str3 abc const char str4 abc const char str5 abc const char str6 abc c
  • docker命令自动补全

    很多命令都会提供一个bash complete的脚本 在执行该命令时 敲tab可以自动补全参数 会极大提高生产效率 docker亦如此 如 yum install docker后 会有一个文件 usr share bash completi
  • Linux搭建gitlab以及汉化

    注 请使用管理员权限的用户 执行如下操作 文章目录 GitLab搭建 一 安装并配置必要的依赖关系 1 安装ssh 3 启动SSH服务 4 安装防火墙 如果已经安装了防火墙并且已经在运行状态 则可直接进行第6步 5 开启防火墙 6 添加ht
  • 【OpenGL学习】Shader和Shader类的抽象

    Shader 本节学习OpenGL中Shader的使用并将其抽象为类 简要介绍OpenGL所使用的着色器语言GLSL 一 什么是Shader 参考维基百科中对Shader的定义 着色器 维基百科 自由的百科全书 wikipedia org
  • 【终极版】java连接oracle数据库三种方式(上篇)

    很多小伙伴都对java连接oracle数据库的操作弄的稀里糊涂 今天我就贴出终极版 一举解决所有的连接方式 上篇主要是解决利用驱动连接的方式 我是小順 请大家关注我 我会给大家发更多的工具 JAR包 import java sql Conn
  • Mac 电脑python 升级3.7版本

    转自 https www jianshu com p 5f55997ab719 官网下载python3 7 并且安装https www python org downloads mac osx 本人电脑有多个版本的python 为了体验新版
  • ffmpeg推流参考文章

    https www cnblogs com leisure chn p 10623968 html https www bilibili com read cv12294853 基于M3568平台移植nginx https z zlg cn
  • Docker笔记:基本概念、镜像、容器、仓库以及数据卷的使用

    什么是docker docker 是一个开源的应用容器引擎 可以使用docker将应用程序和依赖打包到一个镜像之中 可以非常方便的移植到其他机器上运行 使用docker构建打包我们的应用 build 之后可以像集装箱一样很方便的传输到别的机