一. docker介绍

是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

1.一个完整的docker组成部分:1.dockerClient客户端,2.docker Daemon守护进程,3.docker Image镜像,4.dockerContainer容器

2.Docker和KVM的对比

kvm: 1.虚拟机;2.使用复杂;3.启动过程慢(分钟);4.模板文件大;5.和物理机完全隔离;6.模拟的是一个完成系统,可以登入并实现管理。

docker1.直接虚拟出一个用户空间;2.使用简单;3.启动非常快(秒级);4.模板文件小;5.在一定程度上和物理机隔离;6.仅仅是模拟一部分用户空间,不方便管理。

3.docker使用理由

1.快速部署服务;2.实现隔离;3.让一个主机运行多个容器;4.提高开发效率;5.实现软件的跨平台。

二.docker镜像的操作命令

.docker search nginx                                查看注册表中是否有nginx镜像
.docker image pull nginx 下载nginx镜像
.docker image ls 查看本地镜像
.docker image load < redis-img.tar.gz 导入redis镜像
.docker image save nginx > nginx.tar.gz 导出nginx镜像
.dcker inspect nginx 显示nginx镜像的详细信息
.docker image rm nginx 删除镜像
.docker push ip/nginx:v1 推送镜像nginx到本地仓库
.docker tag nginx nginx:v1 给镜像nginx标记标签v1
.docker history nginx 查看镜像nginx的历史构建信息

三.docker容器的操作命令

 .docker run -d redis                                后台启动容器
.docker ps 查看启动的容器
.docker stop/start redis 停止/启动容器
.docker exec -it redis bash 登入容器(常用用法)
.docker rm -f redis 删除容器
.docker rm $(docker ps -aq) 删除全部已退出的容器

四.docker端口映射的四种方法(外网访问容器服务)

1.将容器中的一个端口映射成宿主机中的一个随机端口

命令:docker run -d -P httpd       (P大写)

2. 将容器中的一个端口映射成宿主机中的一个端口

命令:docker run -d -p  1234:80  httpd

3. 将容器中的一个端口映射成宿主机中的一个特定网卡上的随机端口

命令:docker run -d -p 10.220.5.13: :80  httpd

4. 将容器中的一个端口映射成宿主机中的一个特定网卡上的一个端口

命令:docker run -d -p 10.220.5.13:80:80  httpd

五.数据卷Volume

1.功能和特性:

容器中数据的持久存储;容器间资源共享;容器的迁移;

对数据卷的修改会立马生效;对数据卷的更新,不会影响镜像;

2.数据卷Volume共享方式(3种)

(1).Bind mount volume用户需要明确指定容器中的目录和宿主机中的哪个目录进行绑定

  主要实现命令:docker run -it -v /ken:/data/  busybox

(2).Docker Management Volumedocker daemon自行管理将容器中的目录和宿主机中的哪个目录进行绑定

主要实现命令:docker run -it -v  /data/ busybox

(3).基于一个现有容器实现多个容器之间文件共享

  主要实现命令:docker run -it  --volume-from ken1(启动的容器)  busybox [提前启动一个容器]

3.volume生命周期管理

(1).备份

因为volume 实际上是 host 文件系统中的目录和文件,所以 volume 的备份实际上是对文件系统的备份

(2).恢复

volume 的恢复也很简单,如果数据损坏了,直接用之前备份的数据拷贝到 /ken 就可以了。

(3).迁移

如果我们想使用httpd,那就涉及到数据迁移,方法是:

1.docker stop 当前容器;

2.启动新版本容器并mount原有volume(docker run -d -v /ken:/var/www/html  httpd)  这里要确认新版本的默认数据路径是否发生改变

(4).销毁

对于 docker managed volume,在执行 docker rm 删除容器时可以带上 -v 参数,docker 会将容器使用到的 volume 一并删除,但前提是没有其他容器 mount 该 volume,目的是保护数据,非常合理。

如果删除容器时没有带 -v 呢?这样就会产生孤儿 volume。可用docker volume ls 查看。如果想批量删除孤儿 volume,可以执行:docker volume rm $(docker volume ls -q)

六.实现容器的底层技术

cgroup:实现资源限额;namespace实现资源隔

1.对内存限制:docker run -it -m 512 busybox

2.对cpu限制:docker run -c 1024 httpd

Namespace:主要有六种资源:Mount,UTS,IPC,PID,Network和User

Mount namespace:让容器看上去拥有整个文件系统;

UST namespace:让容器有自己的hostname

IPC namespace:让容器拥有自己的共享内存和信号量来实现进程间通信,而不会与host和其他容器的IPC混在一起

PID namespace:容器在host中以进程形式运行。容器拥有自己独立的一套PID。

Network namespace:让容器拥有自己独立的网卡,IP,路由等资源。

User namespace:让容器能够管理自己的用户,host不能看到容器创建的用户。

七.docker镜像构建的两种方式:

1.docker commit构建镜像

三步:运行容器,修改容器,将容器保存为新的容器

如:docker run -it centos(进入容器)>yum install vim -y(容器里下载)>docker commit container id  centos-vim(推出容器运行,使用commit存为新的镜像)

注意:但是docker不建议使用这种方式创建镜像,原因如下:

这是一种手工创建镜像的方式,容器出错,而且效率低且可重复性弱

更重要的是。使用者并不知道镜像是如何创建出来的。里面是否有恶意程序

2.Dockerfile构建镜像

(1).Dockerfile常用命令:

FROM:指定base镜像

COPY:将文件从build context复制到镜像

ADD:与copy类似,不同的是,如果复制的是归档文件(tar,zip,tgz,xz),文件会被自动解压到dest.

ENV:设置环境变量,环境变量可被后面的指令使用

EXPOSE:指定容器中的进程监听某个端口,docker可以将该端口暴露出来

VOLUME:将文件或目录声明为volume

WORKDIR:为后面的run,entpypint,add,copy指令设置镜像中的当前工作目录(容器目录)

RUN:在容器中运行指定的命令

CMD:容器启动时运行指定的命令。Dockerfile中可以有多个CMD指令,但只有最后一个生效。CMD可以被docker run 之后的参数替换。

ENTRYPOINT:设置容器启动时的命令。Dockerfile中可以有多个ENTRYPOINT,但只有最后一个生效,CMD或者docker run之后的参数会被当作参数传递给ENTRYPOINT.

(2)Dockerfile演示

3.RUN,CMD,ENTRYPOINT区别

RUN:执行命令创建新的镜像层,RUN经常用于安装软件包

CMD:设置容器启动后默认执行的命令及参数,但CMD能够被docker run后面跟的命令行参数替换

ENTRYPOINT:配置容器启动时运行的命令

(1).使用 RUN 指令安装应用和软件包,构建镜像。

(2).如果 Docker 镜像的用途是运行应用程序或服务,比如运行一个 MySQL,应该优先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可为 ENTRYPOINT 提供额外的默认参数,同时可利用 docker run 命令行替换默认参数。

(3).如果想为容器设置默认的启动命令,可使用 CMD 指令。用户可在 docker run 命令行中替换此默认命令。

八.Docker网络

1.docker的四种网络模式

(1).bridge模式:docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。

(2).none模式:此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。

(3).host模式:此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。

(4).container模式:此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。

2.自定义网络

除了none,host,bridge这三个自动创建的网络,用户也可以根据业务需要创建user-defined 网络。

创建命令:docker network create --driver bridge ken

创建网段时指定—subset—gateway参数:docker network create –driver bridge –subnet 172.21.0.0/16  --gateway 172.21.0.1 ken1

容器使用新定义的网络:docker run –it –network=ken1 busybox

指定分配IP: docker run -it –network=ken1 –ip=172.121.0.7 busybox

3.容器间通信

容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信。

(1)通过IP通信:处于同一网段的容器间可以通信;如果两个容器处于不同网段,可以通过给一个容器添加另一个容器所处网段的网卡,命令为:docker network connect ken1 container1(现有容器)

(2)Docker DNS server通信:通过 IP 访问容器虽然满足了通信的需求,但还是不够灵活。因为我们在部署应用之前可能无法确定 IP,部署之后再指定要访问的 IP 会比较麻烦。对于这个问题,可以通过 docker 自带的 DNS 服务解决。方法很很简单,在启动容器时给容器命名就可以,访问直接ping

容器名即可。但要注意:使用 docker DNS 有个限制:只能在 user-defined 网络中使用

(3)joined容器:joined 容器非常特别,它可以使两个或多个容器共享一个网络栈,共享网卡和配置信息。实现如下:先启动一个名为web1的容器,然后再创建busybox容器并通过—network=container:web1 指定jointed容器为web1。这时busybox和web1的网卡mac地址与IP完全一样。

joined 容器非常适合以下场景:

1.不同容器中的程序希望通过 loopback 高效快速地通信,比如 web server   与 app server。

2.希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。

4.容器与外界交互

(1).容器访问外部世界:只要宿主机可以访问外网,默认容器时可以访问外网的;

(2).外部世界访问容器:通过端口映射来。

九.docker公共&本地镜像仓库   

1.公共镜像仓库—Docker Hub 

2.搭建本地的registry

(1) 运行registry容器  docker run -d -p 5000:5000 -v /test:/var/lib/registry  registry:2

(2) 通过docker tag重命名镜像,使之与registry匹配

Docker tag httpd  172.20.10.2:5000/httpd:v1

(3) 修改damon.json文件  

在文件中添加:”insecure-registries”:[“172.20.10.2:5000”]

(4) 重启docker和容器

(5) 上传镜像

Docker push 172.20.10.2:5000/httpd:v1

(6) 从其他主机进行下载镜像

Docker pull 172.20.10.2:5000/httpd:v1

十.docker容器监控

1.自带的监控命令:ps,top,stats

2.weave scope监控:Weave Scope 的最大特点是会自动生成一张 Docker 容器地图,让我们能够直观地理解、监控和控制容器。还可以监控多主机,只需在主机上安装weave scope。

 十一.docker日志管理

1.docker logs

2.ELK:开源的日志管理方案。

Elasticsearch一个近乎实时查询的全文搜索引擎。Elasticsearch 的设计目标就是要能够处理和搜索巨量的日志数据。

Logstash读取原始日志,并对其进行分析和过滤,然后将其转发给其他组件(比如 Elasticsearch)进行索引或存储。Logstash 支持丰富的 Input和Output 类型,能够处理各种应用的日志。Kibana一个基于 JavaScript 的 Web 图形界面程序,专门用于可视化 Elasticsearch 的数据。Kibana 能够查询 Elasticsearch 并通过丰富的图表展示结果。用户可以创建 Dashboard 来监控系统的日志

3.ELK日志处理流程:

Logstash 负责从各个 Docker 容器中提取日志,Logstash将日志转发到Elasticsearch 进行索引和保存,Kibana 分析和可视化数据。

4.Filebeat

ELK 提供了一个配套小工具 Filebeat,它能将指定路径下的日志文件转发给 ELK。同时 Filebeat 很聪明,它会监控日志文件,当日志更新时,Filebeat 会将新的内容发送给 ELK。

在配置filebeat时,配置文件/etc/filebeat/filebeat.yml中需告诉filebeat两件事:1.监控哪些日志?2.将日志发送到哪?

Docker知识点总结的更多相关文章

  1. docker知识点杂记

    最近重新梳理了一下docker的一些基本知识,简单做了下总结.以后会逐步补充. 1.查看系统内核版本,需要3.10以上 $ uname -r 2.下载docker 说明:centos安装docker比 ...

  2. docker知识点

    1  安装 http://www.runoob.com/docker/centos-docker-install.html 2  dockerhub官网找到 emqttd 执行 docker pull ...

  3. docker 知识点汇总

    目录 什么是 Docker Docker 简介 Docker 的特点 如何使用 Docker 镜像的常用操作 容器的常用操作 Docker 命令汇总 手工制作 java 镜像 使用 Dockerfil ...

  4. docker 知识点

    docker 教程:http://www.runoob.com/docker/docker-tutorial.html docker 仓库地址:https://store.docker.com/ do ...

  5. Docker知识点整理

    目录 1. Docker简介 1.1 Docker是什么 1.2 在隔离的容器中运行软件 1.3 分发容器 2. Docker镜像 2.1 Docker镜像简介 2.2 Docker镜像常见操作 2. ...

  6. docker知识点扫盲

    最近给部门同事培训docker相关的东西,把我的培训内容总结下,发到博客园上,和大家一起分享.我的培训思路是这样的 首先讲解docker的安装.然后讲下docker的基本的原理,最后讲下docker的 ...

  7. docker 生产环境基础应用

    项目背景 此项目是在已有项目基础上,开发的一套相对独立的系统.项目总体分为三部分,前端.中间应用服务.流媒体服务.前端技术选型为vue+elementui,中间应用服务为.net core webap ...

  8. Docker的iptables规则在iptables重启后丢失

    前因后果 1.在跳板机上使用ansible命令测试机器B时,报错如下,于是就怀疑是网络防火墙的问题 10.10.0.86 | FAILED >> { "failed": ...

  9. Docker部署kafka|Go操作实践

    前言 写作本文的背景是由于字节的暑期青训营中,某个项目要求编写一个简易的流处理引擎(flink),开发语言不限,推荐Java,本着好奇心的驱使,我打算使用Go语言进行部分尝试. 既然是流处理引擎,那么 ...

随机推荐

  1. java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream

    扩展阅读:https://blog.csdn.net/kimylrong/article/details/50353161

  2. js原型补充

    js定义函数: <script> function A() {} let a1 = new A(); let a2 = new A(); // 为A类添加原型 => 类似于类属性 A ...

  3. MyBatis日期用法技巧

    当你想在实体类中使用Java.util.Date类型,而且还想在数据库中保存时分秒时,你可以在xml中修改为: #{xxdate,jdbcType=TIMESTAMP} 就是将#{}中的jdbcTyp ...

  4. jQuery 查找父节点 parents()与closest()

    parents()由内向外,直到最高的父节点停止查找,返回的父节点是多个 closest()由内向外查找,当找到符合规则的一个,则不再查找,返回的是0或1个

  5. HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3

    /* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意: 给出排列 a[N],求所有区间的 ...

  6. 内置对象:Math

    JavaScript内置函数Math.random()自定义封装函数:1,Math.floor(Math.random()*(b-a+1)+a)  随机生成a到b之间的整数. 也可以写成:Math.f ...

  7. POJ2182 Lost Cows 树状数组

    题意:有编号1~n乱序排列的奶牛,给出了每一个奶牛前小于自己编号的奶牛数目 维护一个树状数组,下标是编号,值为$0/1$标识是否存在,很显然最后一个牛的编号是知道的,我们在树状数组上二分出前缀和为小于 ...

  8. learning gcc #pragma once

    referenc: https://zh.wikipedia.org/wiki/Pragma_once 在C和C++编程语言中,#pragma once是一个非标准但是被广泛支持的前置处理符号, 会让 ...

  9. 积性函数,线性筛入门 HDU - 2879

    HDU - 2879HeHe 题意:He[N]为[0,N−1]范围内有多少个数满足式子x2≡x (mod N),求HeHe[N]=He[1]×……×He[N] 我是通过打表发现的he[x]=2k,k为 ...

  10. Maximum GCD(UVA 11827)

    Problem:Given the N integers, you have to find the maximum GCD (greatest common divisor) of every po ...