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

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

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

精品课程

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

共33课时 | 1.9万人学习

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

共0课时 | 0人学习

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

共33课时 | 17.8万人学习

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

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