几天呕心沥血做出的Docker总结
这几天都在通过网上的一些课程学习docker容器化技术,深知docker为企业部署项目所带来的便利,比如可以解决以下问题:
- 上线流程繁琐(开发->测试->运维->上线等)
- 资源利用率低
- 扩容/缩容不及时(面对双十一和平时并发量不同的情况)
- 服务器环境臃肿
- 环境不一致性(开发环境、测试环境、生产环境等)
以下是我对这几天学习docker的总结,希望对大家有所帮助,也是帮助我自己对docker知识的回顾,后续也会继续修改完善,如有理解不到位的地方还请指正。
目录
Docker基础知识
镜像:
容器:
仓库:
Docker常用命令
Docker管理容器命令
创建容器常用选项
常用管理容器命令
容器部署步骤
Docker Compose
Compose简介
Docker-Compose安装
Docker Compose应用
Docker管理镜像命令
Docker网络详解
Host模式:
Container模式:
None模式:
Bridge模式:
容器访问外部:
外部访问容器:
Docker和虚拟化的区别
实操部分
使用dockerfile编译创建镜像
暴露端口并容器数据持久化(nginx)
暴露端口+部署容器(redis)
将镜像上传至私有仓库并拉取
私有仓库搭建与配置
将镜像上传到私有仓库
从私有仓库拉取镜像
Docker基础知识
镜像:集装箱 仓库:超级码头 容器就是我们运行程序的地方
docker运行程序的过程就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。
运输方式:任何地方需要货物都由鲸鱼先送到超级码头,然后再有鲸鱼从超级码头把货物送到目的地去。比如:我们要把台式机的应用部署到笔记本上,我们只需在台式机上执行一个dorker命令,把鲸鱼派过来将程序送到超级码头去,再在笔记本上执行一个docker命令,然后由鲸鱼把程序从超级码头送到笔记本上去。
镜像、容器、仓库三者的联系:
安装完docker后,没有任何镜像是无法运行容器的,需要从仓库(公共仓库/私有仓库)中拉取镜像,基于镜像运行容器,容器可以暂停、启动、重启等操作,可以将容器保存为一个镜像,保存之后可以进行备份为一个backup.tar包,这个tar包可以被迁移到其他地方再次恢复,恢复以后又是一个镜像。镜像又可以通过被打一个私有标签tag推送到仓库中
镜像来源有三种方式:
从仓库中直接拉取
基于容器制作镜像
通过dockerfile去创建镜像
镜像:
鲸鱼拖着的所有集装箱就是一个镜像。镜像以分层的形式进行存储,类似于下图:
鲸鱼一次一般只能运一个镜像的集装箱,然后将其运回码头中心或者其他目的地
每一层都是只读的,然后把每一层加载完成之后这些文件都会被看成是同一个目录,相当于只有一个文件系统.docker的这种文件系统被称之为镜像.
容器:
只有最上面容器那一层是可读可写的,方便存储一些运行容器过程中的日志、数据和修改。
镜像是不能修改的,这样就能保证镜像可以生成多个容器独立运行,没有任何干扰.
仓库:
用于统一的管理大量的镜像,并且进行标准化的运输方式,比如A的镜像要到B,都是需要通过输入命令,使得鲸鱼来到A并把镜像运输到超级码头,B再输入命令,使得鲸鱼将相应的镜像运输到B
docker官方自带仓库:dockerHub
Docker常用命令
Docker管理容器命令
创建容器常用选项
docker run --help可以进行查看命令
-i和-t一般是组合去使用,可以进入到该容器里面
docker exec -it web bash:进入到容器里面,并可以修改里面的内容用于区分
docker run -d -e env=prod -p 88:80 --name web --restart=always nginx
prod是线上环境,test是测试环境,可以调用这个变量为环境做一些初始的配置
-p:将nginx暴露出来
88:80 右边是容器里面的服务端口,左边是宿主机端口
--name:可以一目了然的知道这个容器是用来干什么的
--restart=always:实现docker服务器重启了,容器依旧是可用的
docker ps:查看容器信息
可以通过docker inspect查看容器的详细信息
重启后容器里的数据是不会丢失的
常用管理容器命令
docker ps:
-l:查看最新操作的容器
-a:查看所有容器,包含退出的
-q:列出所有的容器ID
容器部署步骤
- 拉取镜像
- 创建并启动容器
- 验证是否部署成功
- 在浏览器中访问容器,http://+ip地址+映射的端口号(nginx)
- 连接redis:使用命令行客户端、使用图形界面工具
nginx默认端口:80、redis默认端口:6379、mysql默认端口:3306、tomcat默认端口:8080
要注意映射到宿主机的端口号是否有被占用
Docker Compose
应用于需要多个容器相互配合来完成某项任务的情况。可以通过配置docker-compose.yml文件同时启动多个容器。
Compose简介
概念:
Compose是Docker官方的开源项目。它是一个定义和运行多容器的docker应用工具。
通过YAML文件配置你的服务,然后通过一个命令,你能使用配置文件创建和运行所有的服务。
组成:
docker-compose将管理的容器分为三层,分别是工程、服务以及容器。
Docker-Compose运行目录下所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程
每个服务中定义容器运行的镜像、参数、依赖和多个容器实例
Docker-Compose安装
1、下载二进制文件
wget https://github.com/docker/compose/releases/download/1.24.0/docker-compose-Linux-x86_64
2、移动文件
mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
3、赋予可执行权限
chmod +x /usr/local/bin/docker-compose
4、创建软链
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
5、测试是否安装成功
docker-compose --version
Docker Compose应用
没有创建相应的tomcat、mysql和redis,只明白原理
目标:编写模板文件(docker-compose.yml)同时启动docker容器
docker-compose.yml文件比如:
步骤:
- 编写模板文件
- 创建并启动docker-compose项目(模板文件所在的目录,docker-compose.yml)
- 测试
网络配置说明:
Docker管理镜像命令
主要分为管理命令和命令
可以通过:docker --help进行查看
history可以查看构建历史,是通过dockerfile进行构建镜像的
从pull可以看出镜像是分层(目录)的,拉取的时候也是一层一层的进行拉取
Docker网络详解
我们在使用docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式,Docker可以有以下4种网络模式:
- host模式:使用 --net=host 指定。
- none模式:使用 --net=none 指定。
- bridge模式:使用 --net=bridge 指定,默认设置。
- container模式:使用 --net=container:NAME_or_ID 指定。
Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。
Host模式:
相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。
容器和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
Container模式:
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,并共享IP、端口范围等
注意:两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
None模式:
该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能,在以下两种情况下是有用的:容器并不需要网络(例如只需要写磁盘卷的批处理任务)。
Bridge模式:
相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
docker0虚拟网桥,相当于一个二层交换机,可以给容器分配ip,并设置docker0的IP地址为容器的默认网关
通过Docker0和veth pair,宿主机上的连在同一网桥上的所有容器可以不受任何限制地相互通信,这可能导致拒绝服务攻击。进一步地,Docker可以通过–ip_forward和–iptables两个选项控制容器间、容器和外部世界的通信。
容器访问外部:
假设主机有一块网卡为eth0,IP地址为10.10.101.105/24,网关为10.10.101.254。从主机上一个IP为172.17.0.1/16的容器中ping百度(180.76.3.151)。IP包首先从容器发往自己的默认网关docker0,包到达docker0后,也就到达了主机上。然后会查询主机的路由表,发现包应该从主机的eth0发往主机的网关10.10.105.254/24。接着包会转发给eth0,并从eth0发出去(主机的ip_forward转发应该已经打开)。这时候,上面的Iptable规则就会起作用,对包做SNAT转换,将源地址换为eth0的地址。这样,在外界看来,这个包就是从10.10.101.105上发出来的。
Docker容器对外是不可见的。
流程:将容器的ip包通过veth pair传到主机的docker0上,然后根据路由表进行判断寻找有没有容器想要的IP地址,如果没有则会使用Iptable对包做SNAT转换,将源地址转换为主机地址向外部发出。
外部访问容器:
首先需要完成端口映射,将容器的端口暴露在主机的端口上,使用Iptable中的DNAT将目标地址进行转发,然后通过docker0找到对应的容器并连接上进行通信。
Docker和虚拟化的区别
vmware就相当于Hypervisor层,可以允许存在多个操作系统
传统虚拟机:(基于硬件进行虚拟化)
Computer Hardware:基础设备(个人电脑,数据中心的服务器)
Hypervisor:虚拟机管理系统,如:VirtualBox或VMWare
Guest OS:虚拟出来的从操作系统
APP:应用
首先需要有一个笔记本或者是服务器,在该上面安装操作系统(windows/mac系统),再安装虚拟机管理系统比如VMWare,再去创建一个虚拟机,在虚拟机虚拟出来的硬件基础上再去创建一个虚拟出来的从操作系统比如centos7,在从操作系统上再去部署各种应用。
docker容器化:
Computer Hardware:基础设备(个人电脑,数据中心的服务器)
HostOS:主操作系统(如windows/mac)
Docker Engine:
直接在主操作系统上安装docker软件,再去在docker里面安装各种应用
docker直接利用的是宿主机的内核,而虚拟机需要基于宿主机再虚拟出来一个硬件设备供虚拟机使用,所以docker处理数据是秒级且占用体积小,虚拟机处理数据是分钟级
实操部分
使用dockerfile编译创建镜像
dockerfile文件内容:
将dockerfile的压缩包通过xftp传到vm操作系统的dockerfile文件夹中
可以在网页中F12点击网络中的所有,可以查看安装的nginx版本等
暴露端口并容器数据持久化(nginx)
-v:将宿主机上的目录或文件挂载到容器中
nginx的默认访问端口是:80
注意:主机的88端口是否有被占用
意思是创建一个容器名称为web、将容器端口80暴露给宿主机88端口的并将宿主机的/opt/wwwroot目录挂载在容器的/usr/share/nginx/html中,向/usr/share/nginx/html里面添加的内容会同步在宿主机的/opt/wwwroot目录中,并且也可以在宿主机上的目录对数据进行修改
docker rm -f web:删除名称为web的容器
启动容器命令:docker container start web
网页内容如下:
因为笔记本和vm所创建的服务器是在同一个IP段(76)中,相互之间可以访问,再通过容器的端口映射访问到容器。
(端口映射在创建容器时就要完成)
暴露端口+部署容器(redis)
- 拉取镜像
- 创建并启动容器
- 验证是否部署成功
- 连接redis:使用命令行客户端
进入容器,使用命令行客户端
将镜像上传至私有仓库并拉取
私有仓库搭建与配置
DockerHub是一个用于管理公共镜像的仓库,可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去
但是,有时候我们的服务器无法访问网络(比如项目部署到的服务器所在的机房环境是无法访问外网的,但是又需要用到docker并拉取镜像),或者不希望将自己的镜像放到公网中,则需要搭建自己的私有仓库来存储和管理自己的镜像。(私有仓库产生的缘由)
daemon.json:
重启docker和registry
查看页面内容,此时仓库为空没有镜像
拉取registry镜像;基于镜像创建私有仓库容器;需要去修改docker的一个配置文件指定私有仓库地址;再访问私有仓库:192.168.254.128:5000/v2/_catalog
将镜像上传到私有仓库
重新使用dockerfile文件创建了一个镜像名字为ccynginx的nginx镜像
可以用docker images进行查看:
上传步骤:
- 标记镜像为私有仓库的镜像
- 再次启动私有仓库容器
- 上传标记的镜像
- 输入网址查看仓库效果
实操如下:
上传成功
从私有仓库拉取镜像
分为两种情况:私有仓库所在服务器拉取镜像(比较少见)、其他服务器拉取私有仓库镜像
私有仓库所在服务器拉取镜像:
步骤:
- 删除已存在的相关镜像:因为私有仓库所在服务器上已经存在相关镜像,需要先将其删除(指定镜像名不是id),否则会有冲突
- 拉取镜像
- 通过docker info查看docker的信息,了解到私有仓库地址
其他服务器拉取私有仓库镜像:
没有另一台服务器就没有去实操,只理解原理
几天呕心沥血做出的Docker总结相关推荐
- Docker保存修改后的镜像
我们运行的容器可能在镜像的基础上做了一些修改, 有时候我们希望保存起来,封装成一个新的镜像. 可以使用docker提供commit功能. 现在以centos为例,在一个裸的centos上面安装vim编 ...
- Docker生态会重蹈Hadoop的覆辙吗?
目录 一.Docker的兴起和hadoop何其相似 二.大数据从狂热走向了理性 三.Hadoop生态圈的演进 四.Docker的生态圈 五.Docker公司的战略野心受生态圈狙击 六.Docker生态 ...
- docker:dockerfile构建镜像
目录 一.dockerfile概念 1.dockerfile的原理就是镜像分层 二.docker镜像的创建 1.基于现有镜像创建 2.基于本地模板创建 3.基于dockerfile创建 3.1 doc ...
- marquee滚动起始位置_巧用喵影关键帧制作滚动水印,让视频小偷无可盗
视频创作者最奔溃瞬间,不是翻遍了所有网站还找不到合适的素材,也不是作品快完成了却发现电脑死机,而是自己呕心沥血做出来的视频被盗了,结果盗版视频的播放量还更高!! 理想的解决方法就是给视频打上水印. ...
- 金山:与微软“作战”
1984年,求伯君第一次启动由MSDOS2.0引导的机器,并没觉得微软这个从别人手里买来的操作系统比另外一个PC操作系统CP/M好到哪儿去. 1987年,求伯君第一次用Windows2.0,也没觉得它 ...
- 教你如何做出自己想要的PHP Docker镜像
之前有片文章讲过如何通过Docker来构建Laravel的开发环境,其实变通一下就能够在本地电脑上用Docker运行任何PHP项目,让任何PHP项目都能运行在Docker环境中主要是需要根据PHP项目 ...
- Docker | Docker技术基础梳理(五) - Docker网络管理
Docker | Docker技术基础梳理(五) - Docker网络管理 链接: 原文链接 原文链接: https://gitbook.cn/books/5b8f3c471966b44b00d265 ...
- docker logstash_用于监视Kubernetes和Docker的六大开源工具
Kubernetes和Docker是在DevOps圈中最常听到的两个词.Docker是一个工具,它使你能够以容器化的方式运行应用程序,Kubernetes是一个用于编排.管理容器的平台--如果你想使用 ...
- (五)Docker镜像和容器
之所以在之前没有讲什么是镜像和容器是因为如果你没有一个最初的认识,那么你就很难理解镜像和容器以及它们的区别.我相信在前面一章中的讲述中,你应该稍有体会容器是基于镜像构建的,同时构建了容器之后如果不删除 ...
最新文章
- 2D池化IPoolingLayer
- axure中图表背影_Axure 教程:动态图表——排名图
- 程序员生活智慧集——卓越程序员密码
- VUE之监听属性 watch
- 利用火狐浏览器Firebug查看网页相关属性
- web程序前后台功能实现_好程序员web前端教程之JS继承实现方式解析
- Android进程间通信之socket通信
- Kali Linux 网络扫描秘籍 第二章 探索扫描(二)
- 剑指 Offer 13. 机器人的运动范围 【重刷】
- 1-springboot基础
- Linux下socket编程的简单实例
- SWMM面板基础认识
- 江西交通职业技术学院计算机网课,第16章-桥墩计算_江西交通职业技术学院:桥涵工程(高职、精品课程)_ppt_大学课件预览_高等教育资讯网...
- AD在PCB设计中导入LOGO
- 固态硬盘是什么接口_了解移动固态硬盘接口知识,告诉你PSSD到底能多快
- java画好看坦克_java绘图,画坦克
- Android利用jsoup爬虫爬网页数据(二)
- linux shell 关机,linux shell关机命令详解
- 微信小程序 Picker-view背景透明设置
- 内网服务器使用docker安装应用
热门文章
- 家居装修要健康,八类禁忌需注意
- python+selenium—无弹窗驱动浏览器(无头浏览器)
- 登录Windows后自动注销,原来中了pcidump.sys,scvhost.exe,SoundxVolumns.dll,kav32.exe等
- Okhttp上传文件实现
- java 日志查看_Java日志
- 龙芯2K1000LA处理器流片成功,龙芯业务全面转向LoongArch架构
- ORACLE DG专题6--重做传输服务
- 听说有人没get到思维导图的好处
- Python面向对象练习-士兵开枪问题
- 盐城北大青鸟机电产教融合基地丨强盛集团logo设计作业赏析