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. ...
随机推荐
- Java基础学习之数组基本属性和方法
数组对于每一门编程语言都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同.Java语言中提供的数组是用来存储固定大小的同类型元素.你可以声明一个数组变量,如 int[100] 来代替直接 ...
- 在mac下安装matplotlib,xlrd
brew install freetype brew install libpng sudo easy_install pip#图形显示模块 sudo pip install matplotlib 输 ...
- hdu 1232水
#include<stdio.h> #define N 1000 int pre[N]; int find(int n ){ return pre[n]=n==pre[n]?n:find( ...
- 制作自己的网站第二步***在Linux上装上需要的软件以及部署项目配置**
在购买自己的服务器后,如果想要把项目跑起来,就得安装一些必要的软件. 这里只说一些最基础最基本最不可或缺的几个.其他的可以根据自己的需要 安装使用. 首先,那就是配置jdk了,我们可以通过一些工具把下 ...
- java去空格
1.trim()是去掉首尾空格 2.str.replace(" ", ""); 去掉所有空格,包括首尾.中间 3.或者replaceAll(&quo ...
- javascript创建对象总结(javascript高级程序设计)
1.工厂模式 这样的模式抽象创建详细对象的过程.用函数封装特定的接口来创建类. function createStudent(name) { var o = new Object(); o.name ...
- Linux 下使用 Sar 简介
Linux 下使用 Sar 简介 提交 我的留言 加载中 已留言 介绍 Sar 最早是实现在 Salaris Unix 系统里,后来移植到了大部分其他的 Unix 系统(如AIX,HP-UX等).Li ...
- Windows7系统下优化固态硬盘
一.AHCI硬盘模式可提高硬盘性能,确定你的固态硬盘是运行在AHCI模式下,打开“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servicesmsahci” ...
- poj 1695 Magazine Delivery 记忆化搜索
dp[a][b][c],表示三个人从小到大依次在a,b.c位置时.距离结束最少的时间. 每次选一个人走到c+1位置搜索就好了. 坑点在于不能floyd.预计题目没说清楚.意思就是假设没送Li,那么Li ...
- JAVA_如何复制项目
如何复制一个项目:复制这个项目,直接粘贴为一个新项目 注意复制完了之后一定要改一下Web Context-root 然后重新部署(注意Servers的Tomcat会变成当前项目,还要注意他的L ...