目录

docker原理

docker基础概念

docker镜像

构建镜像

Dockerfile

docker四种基础网络


docker原理

docker :容器技术,其原理基于Linux内核的namespace和Cgroup,实现资源的隔离,访问的控制。

docker架构图:

namespace(名称空间):其作用为实现访问隔离,将内核的全局资源进行封装,这样每一个namspace都具有独立的资源,因此不同的进程在各自的namespace当中运行不会互相的干扰。linux内核提供了6类namespace实现访问隔离:

  1. UTS(主机和域名)
  2. network(网络
  3. user(用户)
  4. IPC(进程间通信)
  5. PID(进程号)
  6. Mount(文件系统挂载点)

Croup:实现各类资源的控制与分配,其功能由各类的Cgroup子系统实现:

  1. CPU子系统:限制CPU的占比
  2. CPUacct子系统:统计各类Cgroup 对CPU的使用情况
  3. memory子系统:限制所能使用的内存上限
  4. device子系统:控制进程对设备的访问
  5. bilio子系统:限制进程对block I/O的带宽
  6. cpuset子系统:为一组进程指定CPU和内存节点

容器=namesapce+Cgroup+rootfs+docker_engine

docker基础概念

  1. docker镜像:创建容器的基础
  2. docker仓库:镜像的管理与存储
  3. docker容器:基于镜像运行应用服务

docker采用的是C/S架构,docker客户端与docker-deamon,docker-deamon 与docker-regsitry之间通信采用的是HTTPS/HTTP。默认条件下docker采用的方式https协议。

docker hub:https://hub.docker.com:官方提供个社区用户的镜像仓库,用户注册账号,可以管理自己制作的镜像,dockerhub主要的功能是提供各类镜像的个社区的用户。当然用户也可以自己搭建自己的镜像仓库,harbor为最受欢迎的开源私有镜像仓库,后面的docker-registry当中会详细介绍。

安装与配置docker:

测试系统为centos7,内核版本为:3.10.0-957.el7.x86_64

yum仓库提供的docker的版本为: 1.13.1,

1,移除centos7 所带的docker以及其组件

yum remove docker*

2,安装不同版本的docke-ce,这里不选择最新版的docker,选择的版本的是:19.03.4

#添加清华大学的docker-ce的yum源,使用yum直接安装
wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
#清除yum缓存
yum cleanall
#生成仓库信息
yum repolist
#查看提供的docker-ce的版本信息
yum info docker-ce#显示信息如下:
[root@localhost yum.repos.d]# yum info docker-ce
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile* base: mirrors.aliyun.com* epel: hk.mirrors.thegigabit.com* extras: mirrors.aliyun.com* updates: mirrors.aliyun.com
Available Packages
Name        : docker-ce
Arch        : x86_64
Epoch       : 3
Version     : 19.03.4
Release     : 3.el7
Size        : 24 M
Repo        : docker-ce-stable/x86_64
Summary     : The open-source application container engine
URL         : https://www.docker.com
License     : ASL 2.0
Description : Docker is a product for you to build, ship and run any application as a: lightweight container.: : Docker containers are both hardware-agnostic and platform-agnostic. This means: they can run anywhere, from your laptop to the largest cloud compute instance and: everything in between - and they don't require you to use a particular: language, framework or packaging system. That makes them great building blocks: for deploying and scaling web apps, databases, and backend services without: depending on a particular stack or provider.#通过yum源直接安装docker-ce
yum install docker-ce

3,dockerhub服务器器位于美国,访问速度慢,不过国内很多服务商提供了免费的加速,比如,网易,阿里。

配置加速:

配置文件:/etc/docker/daemon.json

{"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"]
}

几个常用的docker命令,后面经常会用到这里介绍一下用法:

#从镜像仓库当中拉去镜像
docker pull REGISTRY/IMAGE_NAME:TAG
#上传镜像至镜像仓库
docker push REGISTRY/IMAGE_NAME:TAG
#在dockerhub当中查找镜像
docker search IMAGES
#基于镜像运行为容器
docker run [OPTIONS] REGISTRY/IMAGE_NAME:TAG#options:-i/--interactive:交互式,及时没有连接都保持STDIN状态,使用时通常与-i参数一起使用-t:启动一个为终端,使用时通常与-t参数一起使用--name:指定容器的名称

docker镜像

docke镜像原理:

1,union filesystem(联合文件系统):是指不同的文件系统统一组织,统一挂载,其外部表现则为一个文件系统,docker image采用了这种方式实现。docker文件系统为overlay2,文件系统分层构建,统一挂载。

2,COW(写时复制),镜像构建完成之后在没有使用时,不会占用系统任何的资源,只有当使用镜像时才会对其分配系统资源。与linux

fork创建进程相似,通过父进程创建子进程,初始化时系统化不会分配多余的资源给子进程,子进程与父进程公用系统资源,当子进程进行作业时,才会分配器自己的资源。

底层为系统内核,与联合文件系统,往上为各个应用的分层只读构建,最外层为可写,重新构建镜像只需在操作最外层可写层。当然这样的缺点是多次重复的构建会导致镜像的体积变大,运行效率低下。

3,镜像表示方式:

remote_dockerhub.com/namespace/registry/image_name:tag

  • remote_dockerhub.com:是指远程docker仓库的域名,这里也可以是ip:port
  • namespace :用户空间
  • registry:仓库名称
  • image_name:镜像名称
  • tag:镜像的版本

实践:

#从dockerhub当中查询nginx基础镜像
docker search nginx
#部分结果显示
[root@localhost ~]# docker search nginx
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                             Official build of Nginx.                        12189               [OK]
jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con??  1687                                    [OK]
richarvey/nginx-php-fpm           Container running Nginx + PHP-FPM capable of??  745                                     [OK]
linuxserver/nginx                 An Nginx container, brought to you by LinuxS??  81
bitnami/nginx                     Bitnami nginx Docker Image                      72                                      [OK]
tiangolo/nginx-rtmp               Docker image with Nginx using the nginx-rtmp??  59                                      [OK]
nginxdemos/hello                  NGINX webserver that serves a simple page co??  31                                      [OK]

构建镜像

构建镜像的方式分为:镜像通过已存在容器构建,通过dockerfile构建镜像

1,通过已有容器构建镜像,

#运行一个容器
docker run --name nginx_web -it -p 8080:80 nginx
#保存为镜像文件
docker commit -m "nginx_test" -a "zhang" nginx_web learn_test/nginx_test:v0.0.1
#显示结果:
[root@localhost ~]# docker  images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
learn_test/nginx_test    v0.0.1              476f3e86d175        16 seconds ago      126MB
nginx                    latest              540a289bab6c        3 weeks ago         126MB
tomcat                   latest              882487b8be1d        3 weeks ago         507MB
nginx                    latest              5a9061639d0a        4 weeks ago         126MB
httpd                    latest              66a97eeec7b8        4 weeks ago         154MB
busybox                  latest              19485c79a9bb        2 months ago        1.22MB
registry                 latest              f32a97de94e1        8 months ago        25.8MB
lorel/docker-stress-ng   latest              1ae56ccafe55        3 years ago         8.1MB
#使用docker login 登录dockerhub,可以将本镜像推送到docker hub 当中
docker login -u user_name
#推送:
docker push learn_test/nginx_test:v0.0.1

2,使用Dockerfile制作镜像:Dockerfile可分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,Dockerfile规定除注释信息之外的第一个指令必须是FROM指定基础进项镜像信息

Dockerfile

  • FROM:指定构建镜像的基础镜像
FROM <IMAGE>
#FROM nginx
  • LABLE:一般用户指定作者有限
LABEL key="value"
#LABEL miantainer="liu@163.com"
  • ADD:复制指定目录的文件到容器当中的指定目录,文件是tar压缩文件时,会自动解压,同时支持URL,但是URL是tar压缩的文件时,不会解压
ADD <src> <dest>
#ADD /home/test.tar /usr/local/src/
#ADD  https://downloads.mariadb.org/interstitial/mariadb-5.5.66/source/mariadb-5.5.66.tar.gz /home/test/mariadb/

COPY:复制文件到容器的指定目录,与ADD不同的是,不支持tar压缩文件的自动解压

COPY <src> <dest>
#COPY /home/test /usr/local/src/
  • TAG:ARG指令定义了用户可以在编译时或者运行时传递的变量,如使用如下命令:--build-arg <varname>=<value>,也就是Dockfile的环境变量,
ARG <name>[=<default value>]
#ARG nginx_version=1.1.14
  • ENV:.ENV指令是在dockerfile里面设置环境变量,不能在编译时或运行时传递。可以理解为容器的环境变量。
ENV <key>=<value>
#ENV NGINX_WEB_PATH=/data/web/
  • RUN:在容器当中运行指令。
RUN <command>
RUN ["executable", "param1", "param2"] (exec form)#run运行有两种格式,一种格式run <command> 采用的是shell运行的方式,默认是/bin/sh -c 运行命令
第二种格式是以docker exec 的方式运行。RUN yum install vim -y \yum install mariadb
RUN ["yum","install","vim","-y"] 
  • CMD :容器的默认执行体,以entrypiont相似,但是主要的区别在默认上面,当容器没有entrypoint的时候,那么执行的就是CMD,当然docker run 指定的entrypoint时,那么CMD会被指定的entrypoint覆盖。指定的就是指定的让entrypoint
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;

启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。

  • ENTRYPOINT:容器启动之后真正的执行体
  • ENTRYPOINT ["executable", "param1", "param2"]
    ENTRYPOINT command param1 param2(shell中执行ENTRYPOINT :每一个dockfile当中只有一条会执行,当存在多条时,只会执行最后一条
    
  • EXPOSE:指定容器暴露给系统的端口,但是这个端口信息在容器运行之前和系统之间是不存在端口映射的关系,只有在容器运行时使用-p或-P指定端口才会有端口映射。
EXPOSE <port>
  • VOLUM :指定容器的挂载卷目录
VOLUM <path>
  • WORKDIR:指定指定工作的目录,RUN ,CMD等指令当中可以进行调用
WORKDIR /path/
  • ONBUILD:指定当前Dockfile构建的镜像为基础镜像,ONBUILD在此镜像的基础之上再次经常操作,当用此镜像作为基础镜像构建镜像时,ONBUILD相当在构建镜像的Dockerfile后加入了额外的指令。
ONBUILD <command>

一个实例:

#nginx_test
FORM nginx
LABEL maintainer="zhang <**163.com>"ARG nginx_test_version=0.0.1ENV NGINX_WEB_DIR=/data/nginx/web_test/RUN yum install epel-release && \bash nginx.sh && \yum install vim -y
EXPOSE 80CMD ["/bin/sbin/nginx”,"-g","deamon off"]

nginx.sh

#!/bin/bash
echo "www.lili.com 192.168.10.10" >> /etc/hosts
echo > /etc/nginx/conf.d/test.conf< <EOF
server{server_name www.lili.com;listen 80;index test.html root $(NGINX_WEB_DIR)
}
EOF

docker四种基础网络

docker默认的情况下容器与容器之间进行通信是采用bridge,当然除此之外,docker还支持none,host,container,overlay等通通信模型。其原理是基于kernel的network space进行网络空间的隔离,虚拟网络设备实现容器与容器,容器与主机之间的通信。以及跨主机的通行。

  • bridge:桥接,这是容器与容器间通信默认采用的方式,通过虚拟的网桥docker0实现容器与容器之间的通行。网络模型如:下:

容器的IP与主机的IP属于不同网段,容器与主机之间进行通信需要通过防火墙进行路由转发,而主机上容器与容器之间进行通信,则需要通过docker0 这个虚拟网桥。veth*表示虚拟的网络物理接口。

  • host:容器与主机共用主机共享网络设备eth0,主机与容器处于同一网段,这样就没有netwo namespace的网络隔离作用,容器也没有自己的网络协议栈。

none:主机与容器之间,容器与容器之间没有任何的通信,容器的网络完全与外界隔离

container:容器通信使用的是其他容器的network namespace。容器与容器之间不存在网络隔离,当时容器与主机之间却处于不同网段,他们之间的网络又相互隔离。

docker 原生的的网络解决方案还overlay。第三方的网络解决方案如:flannel等

docker基础之原理与docker网络相关推荐

  1. Docker基础(狂神说Docker课程笔记)

    Docker基础(狂神说Docker课程笔记) 作者:koktlzz 出处:https://www.cnblogs.com/koktlzz/p/14105026.html 课程链接 https://w ...

  2. 《docker基础篇:8.Docker常规安装简介》包括:docker常规安装总体步骤、安装tomcat、安装mysql、安装redis

    文章目录 8.Docker常规安装简介 8.1 docker常规安装总体步骤 8.2安装tomcat 8.3 安装mysql 8.3.1 docker hub上面查找mysql镜像 8.3.2 从do ...

  3. docker基础入门一:docker安装镜像下载根据镜像创建容器

    一.安装准备: #卸载旧的版本: yum list installed |grep docker yum -y remove  ... #卸载后将保留/var/lib/docker的内容(镜像.容器等 ...

  4. docker 基础工作原理(一)

    注:以下博文来源于我的独立博客网站:http://www.chenbiaolong.com/,由于原网站是用markdown写的,复制到这边格式有点问题. 以后博文将主要迁移到www.chenbiao ...

  5. Docker基础(1) 原理篇

    Docker是什么 Docker的构成 Docker的分层和写时拷贝策略 Docker与主流虚拟机的区别 Docker镜像与容器的关系 镜像的变更管理 Docker是什么 Docker是一个开源的应用 ...

  6. 老男孩Docker基础入门培训视频Docker核心原理解(完整版)

    课程介绍: Dokcer比较初级的培训视频教程,很适合零基础的朋友们来学习,没有复杂的原理,初入门推荐的Docker培训视频 课程目录: L021-01-Docker介绍.avi L021-02-Do ...

  7. 【Docker】镜像原理,docker commit

    是什么: 加载原理: 为什么要分层:

  8. Docker圣经:大白话说Docker底层原理,6W字实现Docker自由

    说在前面: 现在拿到offer超级难,甚至连面试电话,一个都搞不到. 尼恩的技术社群(50+)中,很多小伙伴凭借 "左手云原生+右手大数据"的绝活,拿到了offer,并且是非常优质 ...

  9. Docker基础讲解狂神笔记:容器数据卷,docker compose,docker swarm(2/2)未修订版欢迎留言补漏

    L06 容器数据卷 相对于01-05难度加大 什么是容器数据卷 Docker理念:将应用和环境打包成一个镜像! 程序要保存数据,数据并不能放在容器里面,因为一旦数据放在容器,误操作删除掉容器,数据也随 ...

最新文章

  1. 生鲜电商APP开发,有哪五大商机?
  2. How to configure cross-stack EtherChannel on Cisco Catalyst 3750 switches
  3. 如何在ASP.NET Core应用中实现与第三方IoC/DI框架的整合?
  4. 网易数帆Curve加入PolarDB开源数据库社区
  5. 不得不看之跳槽加薪利器:2019需求最旺盛的十大IT技能
  6. JPA与Hibernate的关系
  7. 连续两天高烧_连续工作两天,可以看电视11秒
  8. sql 获取数据库字段信息_使用DBATools获取SQL数据库详细信息
  9. Python 求水仙花数
  10. 不要上网更新计算机系统的补丁程序,360安全卫士更新补丁后系统不能联网怎么办...
  11. python调用webservice服务
  12. python语言的多行注释以什么开头和结尾_python多行注释
  13. Buck电路工作原理
  14. 用HTML5的canvas实现抽奖刮刮卡的效果(只需十几行代码)
  15. Win10 【TITAN Xp】和【TITAN RTX】-【TensorFlow】环境简单总结
  16. 网络安全笔记-18-ICMP 协议
  17. tmux简洁教程及config关键配置
  18. 用Java实现用户登录界面
  19. 【熵与特征提取】从近似熵,到样本熵,到模糊熵,再到排列熵,究竟实现了什么?(第一篇)——近似熵及其MATLAB实现
  20. [每天读一点英文:那些给我勇气的句子]Frederic Francois Chopin 钢琴诗人—肖邦

热门文章

  1. mysql导出表结构为word_MySql导出表结构为word文档
  2. 研究:武功与性欲的关系
  3. EPICS 在win10 和 linux上的安装与测试
  4. 关于嵌入式高端ARM核心板设计风格优缺点分析 作者 gooogleman
  5. 用友t3服务器为空,用友t3服务器设置
  6. MATLAB里面的mghglobal函数,Matlab讨论区 - 声振论坛 - 振动,动力学,声学,信号处理,故障诊断 - Powered by Discuz!...
  7. 【C语言简单实现数据结构】排序之交换排序和归并排序
  8. 扫盲系列之字符集编码常识
  9. K_A12_003 基于STM32等单片机采集光敏二极管模块参数 串口与OLED0.96双显示
  10. 360安全卫士上线新功能: 一周电脑安全动态全掌握