目录
一. Docker
1. 简介
2. Docker优势
3. Docker与虚拟机对比
二. Docker安装
三. 容器操作
启动:
启动已终止容器
停止容器
查看容器进程
查看容器细节
 拷贝文件到容器内
docker退出容器,而不关闭容器: ctrl+q+p
docker退出容器,而关闭容器: exit
查询docker所有镜像
Docker镜像仓库
四. Dockerfile详解
常用命令
FROM:指定基础镜像, 必须为第一个指令
MAINTAINER: 维护信息
RUN:构建镜像时执行的命令
COPY: 功能类似于ADD,但是不会解压缩文件,不能访问网络资源
CMD: 构建容器后调用,也就是在容器启动时才进行调用
LABAL: 用于为镜像添加源数据
ENV: 设置环境变量
EXPOSE: 指定外界交互的端口
VOLUME: 用于指定持久化目录
USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。
ARG: 用于指定传递给构建运行时的变量
五. Linux NameSpace详解
 NamesSpace详解:
NameSpace的常用操作
六. Linux Cgroups详解
Cgroups详解
模拟Cgroups控制CPU资源
模拟Cgroups超过限定memory资源被OOM kill
七. Union FS
1.  概念: 
2. 图解Union FS
3. 容器存储驱动
八. Docker网络
1. 安装工具
2. Docker网络模式
 查询docker内置的网络模式
docker run选择运行的网络模式 
3. 模拟Docker起网桥的操作
创建--net=none nginx 
 创建network namespace
 建立网络namespace链接
 检查当前已经创建的网桥设备
 创建veth对
 进行A网络配置
进行B网络配置 
 nginx可以访问
配置nat, 让windows通过ip也可以访问
使用完删除指定nat规则
首页 运维 Docker 最系统的掌握Docker核心技术(总结分享)

最系统的掌握Docker核心技术(总结分享)

Feb 04, 2022 am 07:00 AM
docker

本篇文章给大家带来了关于docker核心技术之容器操作,以及Dockerfile详解等等相关问题,希望对大家有帮助。

最系统的掌握Docker核心技术(总结分享)

一. Docker

1. 简介

  • 基于Linux内核的Cgroup, Namespace, 以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟技术,由于隔离的进程独立于宿主和其它的隔离进程,因此称为容器
  • 最初实现是基于LXC, 从0.7以后开始去除LXC, 转而使用自行开发的Libcontainer, 从1.11开始, 则进一步演进为使用runC和Containerd
  • Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护,使得Docker技术比虚拟机技术更为轻便、快捷

2. Docker优势

  • 更高效地利用系统资源
  • 更快速的启动时间
  • 一致的运行环境
  • 持续交付和部署
  • 更轻松的迁移
  • 更轻松地维护和扩展

3. Docker与虚拟机对比

二. Docker安装

参考文章安装: Install Docker Engine on Ubuntu | Docker Documentation

三. 容器操作

  • 启动:

docker run:

                -it 交互

                -d 后台运行

                -p 端口映射

                -v 磁盘挂载

  • 启动已终止容器

docker start

  • 停止容器

docker stop

  • 查看容器进程

docker ps

  • 查看容器细节

docker inspect 

  •  拷贝文件到容器内

docker cp file1 :/file_to_path

  • docker退出容器,而不关闭容器: ctrl+q+p

  • docker退出容器,而关闭容器: exit

  • 查询docker所有镜像

docker images

  • Docker镜像仓库

Docker hub: https://hub.docker.com

创建私有镜像仓库: docker run -d -p 5000:5000 registry

四. Dockerfile详解

Dockerfile一般分为四个部分:基础镜像信息、维护信息、镜像操作指令和容器启动时操作指令

  • 常用命令

FROM:指定基础镜像, 必须为第一个指令

格式:

        FROM

        FROM :

        FROM @

示例:

        FROM ubuntu

MAINTAINER: 维护信息

格式:

        MAINTAINER

示例

        MAINTAINER ribbon

RUN:构建镜像时执行的命令

格式:

        shell执行:RUN

        exec执行:RUN ["executable", "param1", "param2"]

示例:

        RUN apk update

        RUN ["/etc/execfile", "arg1", "arg2"]

        RUN apt-get update && apt-get install这两条命令永远用&&连接,否则apt-get update构建层被缓存,会导致新package无法安装

ADD: 将本地文件添加到容器中,tar等类型会自动解压,可以访问网络资源,类似于wget

格式:

        ADD ...

示例:

        ADD bin/amd64/httpserver /httpserver

COPY: 功能类似于ADD,但是不会解压缩文件,不能访问网络资源

在Dockerfile中使用multi-stage: Dockerfile 中的 multi-stage(多阶段构建) - sparkdev - 博客园

格式:

        COPY ...

示例:

        COPYbin/amd64/httpserver /httpserver

CMD: 构建容器后调用,也就是在容器启动时才进行调用

格式:

        CMD ["executable","param1","param2"] (执行可执行文件,优先)
        CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
        CMD command param1 param2 (执行shell内部命令)

示例:

        CMD ["ethtool", "--help"]

        CMD echo "1111"

ENTRTPOINT: 配置容器,使其可执行化

格式:

        ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
        ENTRYPOINT command param1 param2 (shell内部命令)

范例:

        ENTRYPOINT /httpserver

        CMD [-c]

LABAL: 用于为镜像添加源数据

格式:

        LABEL = = = ...

范例:

        LABEL multi.label1="value1" multi.label2="value2" other="value3"

ENV: 设置环境变量

格式:

        ENV

范例:

        ENV MY_SERVICE_PORT=80 UDP_PORT=90

EXPOSE: 指定外界交互的端口

格式:

        EXPOSE [...]

示例:

        EXPOSE 80

        EXPOSE 80/tcp

        EXPOSE 80 90

VOLUME: 用于指定持久化目录

格式:

        VOLUME []

范例:

        VOLUME ["/data", "/usr1/jenkins"]

USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。

格式:
  USER user
  USER user:group
  USER uid
  USER uid:gid
  USER user:gid
  USER uid:group

 示例:
  USER www

ARG: 用于指定传递给构建运行时的变量

格式:
    ARG [=]
示例:
    ARG build_user=ribbon

五. Linux NameSpace详解

  •  NamesSpace详解:

Linux NameSpace_Frank_Abagnale的博客-CSDN博客 这篇文章比较详细的介绍,可以参考这篇

  • NameSpace的常用操作

  • 查看当前系统的namespace:

lsns -t

  • 查看某进程的namespace:

ls -la /proc//ns/

  •  查看某namespace运行命令

nsenter -t -n 

六. Linux Cgroups详解

  • Cgroups详解

容器核心:cgroups - 简书 可以参考这篇文章来进行了解

  • 模拟Cgroups控制CPU资源

通过模拟来更好的熟悉Cgroups控制资源的效果, 首先创建cpudemo文件夹

 执行top可以看到busyloop占用两个CPU资源

 将进程添加进cgroup进程配置组

 设置cpuquota

 可以看到成功将占用200%CPU资源的降低成1%

  • 模拟Cgroups超过限定memory资源被OOM kill

/sys/fs/cgroup/memory目录下创建memorydemo文件夹

 运行消耗内存程序, 使用watch查询内存使用情况

 将进程配置进cgroups配置组

 设置最大内存大小

 等待程序被OOM kill, dmesg可以看到杀死信息

备注:删除自主创建的cgroup文件夹, 需要使用cgroup-tools

七. Union FS

Docker前面使用的技术都是源于linux的技术并没有创新,而Docker的创新正是文件系统。 

1.  概念: 

  • 将不同目录挂载在同一个虚拟文件系统下的文件系统
  • 支持为每一个成员目录设定readonly、readwrite和without-able权限
  • 文件系统分层,对readonly权限的目录可以进行逻辑上的修改,这里的修改属于增量的,不影响readonly部分
  • 通常Union FS的用途: 多个disk挂载到同一个目录下, 另一个是将readonly部分和writeable的目录联合在一起

2. 图解Union FS

       Docker镜像的设计中,引入了层(layer)的概念,也就是说,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量rootfs(一个目录),这样应用A和应用B所在的容器共同引用相同的ubuntu操作系统层、Golang环境层(作为只读层),而各自有各自应用程序层,和可写层。启动容器的时候通过UnionFS把相关的层挂载到一个目录,作为容器的根文件系统。

3. 容器存储驱动

4. 模拟Union FS更好理解效果

       由于docker当前版本上使用的是overlayFS的存储驱动,所以我们就以overlay挂载方式来进行实验, overlayfs通过三个目录:lower目录、upper目录、以及work目录实现,其中lower目录可以是多个,work目录为工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为为merged目录。

执行如下命令:

mkdir upper lower merged work
echo "lower" > lower/in_lower.txt
echo "from lower" > lower/in_both.txt
echo "from upper" > upper/in_both.txt
echo "upper" > upper/in_upper.txt
path=$(pwd)
mount -t overlay overlay -o lowerdir=${path}/lower,upperdir=${path}/upper,workdir=${path}/work ${path}/merged
登录后复制

       可以看到使用overlay存储驱动文件挂载实现的效果。实验完成后恢复环境需要先umount merged目录后, 再将四个目录进行删除操作,先删除其他的可能会出现rm: cannot remove 'merged/': Device or resource busy,导致merged目录删除不掉。

八. Docker网络

1. 安装工具

Centos系统:

        $ yum install bridge-utils

Ubuntu系统:

        $ apt-get  install bridge-utils

2. Docker网络模式

  •  查询docker内置的网络模式

  • docker run选择运行的网络模式 

        1)host模式:使用 --net=host 指定。 跟host公用一套net

        2)none模式:使用 --net=none 指定。网络配置需要由自己来进行配置

        3)bridge模式:使用 --net=bridge 指定,默认设置。

docker网络逻辑图 网桥和NAT

        4)container模式:使用 --net=container:NAME_or_ID 指定。使用其他容器的网络配置

 网络模式图大概如下图所示

3. 模拟Docker起网桥的操作

  • 创建--net=none nginx 

  •  创建network namespace

  •  建立网络namespace链接

  •  检查当前已经创建的网桥设备

  •  创建veth对

  •  进行A网络配置

  • 进行B网络配置 

生成eth0网络设备在nginx docker中

给eth0配置ip 网关 

  •  nginx可以访问

  • 配置nat, 让windows通过ip也可以访问

  • 使用完删除指定nat规则

推荐学习:《docker视频教程

以上是最系统的掌握Docker核心技术(总结分享)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

pycharm如何将project打包 pycharm如何将project打包 Apr 25, 2024 am 03:54 AM

在 PyCharm 中打包项目有四种方法:打包为单独的可执行文件:导出为 EXE 单文件格式。打包为安装程序:生成 Setuptools Makefile 并构建。打包为 Docker 镜像:指定镜像名称、调整构建选项并构建。打包为容器:指定构建的镜像、调整运行时选项并启动容器。

Pi Node教学:什么是Pi节点?如何安装和设定Pi Node? Pi Node教学:什么是Pi节点?如何安装和设定Pi Node? Mar 05, 2025 pm 05:57 PM

PiNetwork节点详解及安装指南本文将详细介绍PiNetwork生态系统中的关键角色——Pi节点,并提供安装和配置的完整步骤。Pi节点在PiNetwork区块链测试网推出后,成为众多先锋积极参与测试的重要环节,为即将到来的主网发布做准备。如果您还不了解PiNetwork,请参考Pi币是什么?上市价格多少?Pi用途、挖矿及安全性分析。什么是PiNetwork?PiNetwork项目始于2019年,拥有其专属加密货币Pi币。该项目旨在创建一个人人可参与

PHP 微服务容器化的敏捷开发与运维 PHP 微服务容器化的敏捷开发与运维 May 08, 2024 pm 02:21 PM

答案:PHP微服务采用HelmCharts部署进行敏捷开发,并使用DockerContainer容器化以实现隔离和可扩展性。详细描述:使用HelmCharts自动部署PHP微服务,实现敏捷开发。Docker镜像允许对微服务进行快速迭代和版本控制。DockerContainer标准隔离微服务,而Kubernetes负责管理容器的可用性和可扩展性。利用Prometheus和Grafana监控微服务性能和健康状况,并创建告警和自动修复机制。

golang程序怎么启动 golang程序怎么启动 Apr 21, 2024 am 12:47 AM

有四种启动 Go 程序的方法:使用命令行:go run main.go通过 IDE 的“Run”或“Debug”菜单启动使用容器编排工具(如 Docker 或 Kubernetes)启动容器在 Unix 系统上使用 systemd 或 supervisor 作为系统服务运行

Docker三分钟搞定LLama3开源大模型本地部署 Docker三分钟搞定LLama3开源大模型本地部署 Apr 26, 2024 am 10:19 AM

概述LLaMA-3(LargeLanguageModelMetaAI3)是由Meta公司开发的大型开源生成式人工智能模型。它在模型结构上与前一代LLaMA-2相比没有大的变动。LLaMA-3模型分为不同规模的版本,包括小型、中型和大型,以适应不同的应用需求和计算资源。小型模型参参数规模为8B,中型模型参参数规模为70B,而大型模型参参数规模则达到400B。然而在训练中,目标是实现多模态、多语言的功能,预计结果将与GPT4/GPT4V相当。安装OllamaOllama是一个开源的大型语言模型(LL

deepseek怎么安装 deepseek怎么安装 Feb 19, 2025 pm 05:48 PM

DeepSeek的安装方法有多种,包括:从源码编译(适用于经验丰富的开发者)使用预编译包(适用于Windows用户)使用Docker容器(最便捷,无需担心兼容性)无论选择哪种方法,请仔细阅读官方文档并充分准备,避免不必要的麻烦。

PHP 分布式系统架构与实践 PHP 分布式系统架构与实践 May 04, 2024 am 10:33 AM

PHP分布式系统架构通过将不同组件分布在网络互联的机器上实现可伸缩性、性能和容错性。该架构包括应用服务器、消息队列、数据库、缓存和负载均衡器。将PHP应用迁移到分布式架构的步骤包括:识别服务边界选择消息队列系统采用微服务框架部署到容器管理服务发现

如何使用 PHP CI/CD 实现快速迭代? 如何使用 PHP CI/CD 实现快速迭代? May 08, 2024 pm 10:15 PM

答案:利用PHPCI/CD实现快速迭代,包括设置CI/CD管道、自动化测试和部署流程。设置CI/CD管道:选择CI/CD工具,配置代码存储库,定义构建管道。自动化测试:编写单元和集成测试,使用测试框架简化测试。实战案例:使用TravisCI:安装TravisCI,定义管道,启用管道,查看结果。实现持续交付:选择部署工具,定义部署管道,自动化部署。收益:提高开发效率、减少错误、缩短交付时间。

See all articles