docker随谈
最近在搞Docker,其实去年就听老师说过这个东西,说非常火,当时不以为然,还错把它当成docky。当时想想docky不就是一个快速启动工具么,有什么。现在想想真是惭愧。。。
Docker的牛逼之处网上找找也有一大堆:轻量化、占用系统资源少(基本不占用)、部署快、扩展性强,可以说是虚拟化的未来。
Docker直接作用在宿主机上,不需要虚拟机管理系统。下图摘自网上:
可以看出使用Docker比一般的虚拟机少了两层东西,可见Docker的轻量。
Docker诞生之初也是为了能让开发者更专心的做开发,系统管理员更专注于系统的构架。所以Docker可以一次打包,在任何地方运行。它的官网也是这么说的:Build, Ship and Run Any App, Anywhere!试想一下当迁移服务器的时候你可能需要先将数据和应用迁出再部署到其他的服务器上,非常麻烦不说还有可能在这个过程中丢失数据。使用docker就没有这么多问题,你只需要将Docker image先上传到Docker Hub中然后在新的服务器中pull下来即可,是不是感觉这个过程和Git类似?Docker就是运用了集装箱的原理,它不在乎你是什么系统什么架构,它只负责把你关心的打包,然后交付给别人使用。
Docker有三个核心概念:容器、镜像、仓库。这三个如果铺开来讲恐怕这能成一个系列了,既然是随笔就力求用最短的话把它说清楚讲明白
镜像:镜像这个东西计算机专业的应该都能懂,它和我们装系统的镜像是一个东西。开发者把写好的程序打包放入镜像中就可以交付给别人使用(在这里可以不用纠结于这个镜像的具体内容),一般都是先从Docker Hub中下载一个现成的镜像然后开始开发自己要开发的东西。
容器:容器的概念比较绕,一开始我以为镜像是运行在容器中的,因为字面意思来看容器是容纳东西的嘛,但是事实是容器运行在镜像之上。我们知道镜像是不会改动的,当我们运行一个镜像那么他就生成了一个容器。可以把镜像想象成是一个程序,容器就是一个进程。镜像(程序)是静态的,容器(进程)是动态的。我们的开发部署工作都是在容器中
仓库:仓库就是存放镜像的地方。你可以建自己的私有仓库也可以建共有仓库。push可以把本地的镜像上传到Hub中,pull可以把Hub中的镜像下载到本地。把它想象成Github可以容易理解的多(暂时不要想版本控制,就单纯的上传和下载)。
这里必须要提Docker很牛的一个地方,就是容器的灵活性。镜像本身是由很多层文件系统组成的,当我们运行一个镜像产生了一个容器就会在镜像上添加一层读写层(位于下图的Container和Image之间的一层)!我们在容器中的所有操作都是作用在读写层上不会写入到镜像中。如果多次运行同一个镜像就会产生多个不同的容器(在镜像上平行的添加的读写层)。在这里可能会有疑问开这么多容器不就搞混了吗?容器是可以自己取名的,所以这完全不是问题。当你在容器内开发完程序就可以把容器打包为一个新的镜像,把没用的容器全部删掉。把你开发的具有稳定版程序的容器保留,下次开发使用start就能瞬间启动容器。
同时还有一个很重要的地方就是:Docker不是容器,而是管理容器的引擎。很多地方都会把Docker和容器划上等号,这是十分误导人的。
关于Docker安全性问题的思考
Docker目前在安全性和稳定性上面还有待时间的检验。不过Docker在未正式发布时就有好几家金融机构开始使用了,要知道金融公司对于平台的稳定性和安全性要求是十分之高的,由此可见Docker的魅力。然而Docker在实际生产中还是有一些安全性问题的。
①由于Docker的仓库是开放的,任何人都可以下载使用,难保不会有人在镜像中植入后门。
②尽管Docker有Namespace这层保障,但是由于Docker依赖于宿主机内核调度的先天特性,一旦内核出现Bug可以通过宿主机入侵容器,窃取生产环境信息。
③严格来说Docker不是虚拟机,普通虚拟机的root和宿主机的root是分开的,而Docker容器的root和宿主机的root是同一个用户,一旦容器内的用户提权至root,他就有了无限制的操作,要知道Docker容器是可以和宿主机共享文件系统的,容器内的用户提权了宿主机等于被提权了。Docker的本质是进程隔离,为进程创建隔离开的运行空间,这样就可以隔离有问题的应用。进程间的隔离是通过Namespace(作用:隔离)和Cgroup(作用:配额限制),隔离出来的进程组对外表现就是一个Container。
新手使用Docker会遇到的坑
此坑仅适用于中国程序员。感谢GFW,下载Docker并不是那么的简单,Ubuntu和Centos源中有Docker安装包,但是想要下载最新版或特定版本的并不是那么容易,因为Docker的网站在中国访问极慢,个人不是很推荐网上找不明来源的安装包下载安装,毕竟官方的才是最好的。这些问题都不是很大,最大的问题是下载和上传Docker镜像,https://hub.docker.com这个网站就跟段誉的武功一样时灵时不灵的(大多数时候不灵,能访问也是小水管),下面我分别给出下载Docker和镜像的解决方法:
①下载Docker:
方法一:
添加一个源,这个源貌似是老毛子的,里面Docker的版本还是比较全的,从它的源中下载你想要的Docker版本(偶尔也会抽疯,没办法)
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
sudo sh -c "echo deb http://mirror.yandex.ru/mirrors/docker/ docker main > /etc/apt/sources.list.d/docker.list"
sudo apt-get update
sudo apt-get install lxc-docker-×××
方法二:
这是Docker官方给出的方法,没试过,可以试试
sudo apt-get update
sudo apt-get install wget
wget -qO- https://get.docker.com/ | sh
wget -qO- https://get.docker.com/gpg | sudo apt-key add -
Docker安装完毕可以先看看是否安装成功
②下载镜像
下载完Docker就可以下载镜像来一发试试了,在这里你可以使用官方镜像下载:
sudo docker pull hello-world 下载镜像
sudo docker run hello-world 运行镜像
run是运行一个镜像,由于刚开始使用本地没有任何镜像,Docker检测到没有会自动去Docker Hub中下载。这个命令大多数时候是抽疯的(感谢GFW)。
所以我推荐一个更好的方法:使用第三方镜像库。网上找了半天好像也就有一个Daocloud的可以用(真的不是广告),看来中国的Docker还需要发展几年。
curl -sSL https://get.daocloud.io/docker | sh
curl -sSL https://get.daocloud.io/daomonit/install.sh | sh -s 4995bde401f6afc9dc5cd89a043111079ec442bb
sudo daomonit -token=4995bde401f6afc9dc5cd89a043111079ec442bb save-config
sudo service daomonit start
然后使用dao pull 下载镜像
sudo dao pull ×××
sudo dao --help 查询使用方法
具体使用方法可以看http://get.daocloud.io/#install-docker。
当然最好的方法还是开个VPN,我就是使用了VPN所以这些步骤都没走,pull、push随便用无压力,哈哈哈。
docker随谈的更多相关文章
- Docker 学习新手笔记:从入门到放弃
本文记录的是作为一个新手,从了解 Docker 是什么.Docker 技术包含哪些概念到上手使用.安装以及发布 Docker 镜像的整个过程.作者在学习过程中参阅了诸多文档和教程,在此一并感谢,与此同 ...
- 浅谈Docker(一)
注:由于别人写的太好了就转来基础介绍! 转自:http://www.infoq.com/cn/articles/docker-core-technology-preview Docker是PaaS供应 ...
- M1 和 Docker 谈了个恋爱
出于开源项目的需要,我准备把之前在 windows 下运行的开源项目移植到 Mac 上跑得试下,但是 Mac M1 芯片并不能很好地支持 Docker,这不,发现 Docker 也正式支持 Mac 了 ...
- CI Weekly #6 | 再谈 Docker / CI / CD 实践经验
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...
- Docker技术浅谈:私有化部署的优势以及在顶象内部的应用实践
顶象全景式业务安全风控体系基于新一代风控体系构建,并采用Docker技术进行私有云和公有云部署.本文主要和大家分享下Docker容器技术和顶象风控系统私有化部署的优势以及Docker容器技术在顶象内部 ...
- 再谈docker基本命令
子曰,温故而知新 今日,再次看书之际,又寻得docker的几条使用命令,用小本本记下来 配置docker镜像源 当我们在拉去一些共有镜像时,默认,docker会向docker.io去获取,如果在拉取的 ...
- 谈一下Docker与Kubernetes集群的日志和日志管理
本文的测试环境为CentOS 7.3,Kubernetes集群为1.11.2,安装步骤参见kubeadm安装kubernetes V1.11.1 集群 日志对于我们管理Kubernetes集群及其上的 ...
- Docker学习笔记之浅谈虚拟化和容器技术
0x00 概述 相信所有对 Docker 有所耳闻的朋友都知道,它是一款以容器虚拟化技术为基础的软件,因此在了解有关 Docker 的概念知识和使用方法之前,虚拟化和容器技术是我们不可或缺的基础知识. ...
- Docker镜像浅谈
先抛出几个我在学习过程中产生的几个问题. 1. 容器镜像是什么, 和装系统时的镜像有什么关系? 2. 容器镜像的作用是什么? 3. 不同版本的ubuntu镜像有什么区别, 比如说 ubuntu:18. ...
随机推荐
- [luoguP2736] “破锣摇滚”乐队 Raucous Rockers(DP)
传送门 f[i][j]表示前i首歌放到前j个盘里最多能放多首 ntr[i][j]表示i~j中最多能放进一张盘中多少首歌 ntr数组可以贪心预处理出来. #include <cstdio> ...
- 【DFS】codeforces B. Sagheer, the Hausmeister
http://codeforces.com/contest/812/problem/B [题意] 有一个n*m的棋盘,每个小格子有0或1两种状态,现在要把所有的1都变成0,问最少的步数是多少?初始位置 ...
- hdu4514(非连通图的环判断与图中最长链)(树的直径)
湫湫系列故事——设计风景线 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. ...
- react.js 组件之间的数据传递props
/* *属性 * 1.如何传递属性 * 2.属性和状态区别和联系 * * 3.子组件都有一个props属性对象 * * 4.单线数据流(只能从父组件流向子组件,就是在父组件定义一个属性,子组件可以通过 ...
- 2016 Multi-University Training Contest 8 solutions BY 学军中学
1001: 假设有4个红球,初始时从左到右标为1,2,3,4.那么肯定存在一种方案,使得最后结束时红球的顺序没有改变,也是1,2,3,4. 那么就可以把同色球都写成若干个不同色球了.所以现在共有n个颜 ...
- poj3905 2sat!
这次已经不是2sat的问题了,相信2sat已经不是问题了,最后一题2sat,竟然跪在输入上! 千万注意scanf(%c)!读入!!!!有空格也读啊!!!读入+ -一定要用字符读啊??笨死算了!被人水死 ...
- 如何判断一个app是原生app还是 webapp,或者是混合app
1.(快速)滚动起来是否比较卡2.图片加载失败的图标 断网检查不是绝对的,web app并不一定是在远程服务器上的, 也能pack在程序里,load本地的资源也能算是web app. web ...
- ZOJ 1232 【灵活运用FLOYD】 【图DP】
题意: copy自http://blog.csdn.net/monkey_little/article/details/6637805 有A个村子和B个城堡,村子标号是1~A,城堡标号是A+1~B.马 ...
- OO第三单元总结——JML
目录 写在前面 JML理论基础 JML工具链 JMLUnitNG的使用 架构设计 Bug分析 心得体会 写在前面 OO的第三单元学习结束了,本单元我们学习了如何使用JML语言来对我们的程序进行规格化设 ...
- MySql基本数据类型(转)
说明:通俗的理解:1字节的8位,即1byte=8bit,而这个1byte叫做长度范围,范围的算法是使用bit去求,比如8bit的长度范围是2的8次方,但是在数据库中的类型上是有区分有符号和无符号的,默 ...