Docker知识点总结
一. docker介绍:
是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
1.一个完整的docker组成部分:1.dockerClient客户端,2.docker Daemon守护进程,3.docker Image镜像,4.dockerContainer容器
2.Docker和KVM的对比
kvm: 1.虚拟机;2.使用复杂;3.启动过程慢(分钟);4.模板文件大;5.和物理机完全隔离;6.模拟的是一个完成系统,可以登入并实现管理。
docker:1.直接虚拟出一个用户空间;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 Volume:docker 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知识点总结的更多相关文章
- docker知识点杂记
最近重新梳理了一下docker的一些基本知识,简单做了下总结.以后会逐步补充. 1.查看系统内核版本,需要3.10以上 $ uname -r 2.下载docker 说明:centos安装docker比 ...
- docker知识点
1 安装 http://www.runoob.com/docker/centos-docker-install.html 2 dockerhub官网找到 emqttd 执行 docker pull ...
- docker 知识点汇总
目录 什么是 Docker Docker 简介 Docker 的特点 如何使用 Docker 镜像的常用操作 容器的常用操作 Docker 命令汇总 手工制作 java 镜像 使用 Dockerfil ...
- docker 知识点
docker 教程:http://www.runoob.com/docker/docker-tutorial.html docker 仓库地址:https://store.docker.com/ do ...
- Docker知识点整理
目录 1. Docker简介 1.1 Docker是什么 1.2 在隔离的容器中运行软件 1.3 分发容器 2. Docker镜像 2.1 Docker镜像简介 2.2 Docker镜像常见操作 2. ...
- docker知识点扫盲
最近给部门同事培训docker相关的东西,把我的培训内容总结下,发到博客园上,和大家一起分享.我的培训思路是这样的 首先讲解docker的安装.然后讲下docker的基本的原理,最后讲下docker的 ...
- docker 生产环境基础应用
项目背景 此项目是在已有项目基础上,开发的一套相对独立的系统.项目总体分为三部分,前端.中间应用服务.流媒体服务.前端技术选型为vue+elementui,中间应用服务为.net core webap ...
- Docker的iptables规则在iptables重启后丢失
前因后果 1.在跳板机上使用ansible命令测试机器B时,报错如下,于是就怀疑是网络防火墙的问题 10.10.0.86 | FAILED >> { "failed": ...
- Docker部署kafka|Go操作实践
前言 写作本文的背景是由于字节的暑期青训营中,某个项目要求编写一个简易的流处理引擎(flink),开发语言不限,推荐Java,本着好奇心的驱使,我打算使用Go语言进行部分尝试. 既然是流处理引擎,那么 ...
随机推荐
- 1.打开windows中功能的快捷方式
1.打开组策略 命令:gpedit.msc 2.打开注册表 命令:regedit 3.快速打开本地安全组策略 命令:secpol.msc 4.打开服务 命令:services.msc 5.系统退域的时 ...
- eclipse调试断点
1.条件断点 如果你不知道如何添加断点,只需点击左边面板(行号前面)断点即被创建.在调试界面中,“断点”视图会把所有被创建的断点列出来.我们可以给它加一个布尔条件,也就是说,该断点会被激活并且如果布尔 ...
- Oracle 11 安装 提示环境不满足最低要求解决方案
在 Oracle 安装包 中,找到 stage 文件夹 切入,再找到 cvu 文件夹,找到 cvu_prereq.xml 文件 ,进行编辑 新增 这一块内容. <OPERATING_SYSTEM ...
- Linux初始化脚本
以下脚本用于linux系统的初始化脚本,可以在服务器系统安装完毕之后立即执行.脚本结合各位大牛一些参数,已经在CentOS 5下通过. 使用方法:将其复制,保存为一个shell文件,比如init.sh ...
- 小程序分享链接功能 - onShareAppMessage
onShareAppMessage用法: 只需要在button标签中加入open-type="share",小程序ui就会自动识别分享链接功能 <button data-na ...
- Python3-def
def hello(): print("这是一个无参数的方法!") hello(); print("") def helloOne(str): print(st ...
- 创建节点--DOM树
创建节点 快捷键:innerhtml outerhtml innertext outertext ==============创建节点方法有两种:============== <script s ...
- Mac出现程序闪退的解决方案
重置PRAM 1. 关机 2.按下电源键后,立即按下command + option + P +R 3.等到电脑出现4次重启的声音后,放开按键,重置成功 4.正常使用
- 使用StringBuilder写XML遭遇UTF-16问题
http://www.cnblogs.com/jans2002/archive/2007/08/05/843843.html
- 关于tensorflow里面的tf.contrib.rnn.BasicLSTMCell 中num_units参数问题
这里的num_units参数并不是指这一层油多少个相互独立的时序lstm,而是lstm单元内部的几个门的参数,这几个门其实内部是一个神经网络,答案来自知乎: class TRNNConfig(obje ...