0

0

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

WBOY

WBOY

发布时间:2022-02-04 07:00:31

|

2799人浏览过

|

来源于CSDN

转载

本篇文章给大家带来了关于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

PHP5 MySQL 编程入门
PHP5 MySQL 编程入门

既有较为详细的PHP与MySQL基础知识介绍,也有大量针对不同应用的技术说明,并伴随了大量小而精的示例来加深读者的理解,便于通过实验来掌握知识并学会应用。令书以PHP开发者为核心,从环境搭建到系统开发,从局部技术点到项目全程把握,立体式介绍了PHP5+MySQL的技术要点以及丰富的延伸知识,可以让读者享受到提升开发能力的极速体验。

下载

 示例:
  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视频教程

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

1

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

5

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

7

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

30

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

3

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

2

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
光速学会docker容器
光速学会docker容器

共33课时 | 1.8万人学习

Docker 17 中文开发手册
Docker 17 中文开发手册

共0课时 | 0人学习

极客学院Docker视频教程
极客学院Docker视频教程

共33课时 | 17.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号