❖ 进入docker的世界

最近学习Machine Learning发现好多人都用docker,之前一直听说但是感觉和自己无关。但是现在发现原来docker是个这么方便的东西,可以跨平台(不分什么版本的linux,甚至mac和windows也行)运行。所以这里开一篇来记录学习感受。

参考:Docker 完全指南
参考: Gitbook - Docker — 从入门到实践

不提那些难懂的术语,大白话就是:
一个Docker就是一个Linux的Live CD系统,跟USB系统一样,有完整的系统文件目录和程序。

我们可以在这个与外界隔离的便携系统里随便读写操作,只是每次进入它时候,都会恢复最开始的样子,像什么事都没发生一样。
我们可以像定制Live CD或WinPE一样,定制这个小系统里面默认装什么软件。一旦定制好了,就是不可更改的,非常稳定。

理解Docker的逻辑

一开始发现很乱很难理解,觉得所有人都把它说的太复杂了。直到后来发现,其实它的运行逻辑很简单。
实际上,可以把Docker看成是给电脑安装Linux系统时的Live CD,或者是给Windows用USB安装系统时的WinPE。这样会方便理解一点。

回想下自己在给PC或是虚拟机上安装Linux系统时,都会有个Live CD选项。也是就是你可以什么都不安装,直接进入系统,所有的工具都能用,所有的软件都能安装,所有的配置也可以改。只不过你重启过后,一切修改的地方都恢复原样了。

每篇攻略都会提到这三个基本概念:

  • 镜像 Image
    相当于一个系统光盘的ISO镜像文件,是只读的。你可以直接进入image中各种操作没有障碍,感觉就像进入Live CD系统了。只是所有操作都会在退出时消失,下次进image时候还是初始的样子。
  • 容器 Container
    就像给"ISO文件"加了一层可读写的外衣,所有的变动都会保存在Container里,而image还是image,不会变。就像你可以随便换衣服,但是身体不会变。
  • 仓库 Repo
    一般指的Dockerhub,就是一个像Github的网站,只不过不是收集代码,而是收集各种image镜像。你可以随意上传下载各大厂商或个人制作的镜像。

安装Docker

Docker分CE和EE两个版本,一个社区公开免费,一个商业付费。

参考官方:About Docker CE

Ubuntu上安装Docker

参考官方安装步骤:Get Docker CE for Ubuntu

准备工作:

#安装SSL相关,让apt通过HTTPS下载:
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# 添加docker的GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#检查key是否相符(9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88)
sudo apt-key fingerprint 0EBFCD88

#添加docker的apt下载源
sudo add-apt-repository  "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

#更新源
sudo apt-get update

安装docker:

$ sudo apt-get install docker-ce

卸载Docker:

$ sudo apt-get remove docker docker-engine docker.io

Mac上安装Docker

直接下载app:

image

树莓派上安装Docker

树莓派是基于ARM架构的,和PC不同。所以即使树莓派上能做一些docker镜像,也不能在别的PC上运行。反过来别的PC上的docker镜像,也不能在树莓派上运行。
如果需要找树莓派专用的镜像,那就在Dockerhub上搜索ARMRpi相关就能找到了。
有一个叫Hypriot的仓库制作了非常多树莓派专用docker,可以参考下。

树莓派安装Docker,最难的在于正确的选择源和添加GPG-key,才能找到版本适合的docker并下载。这个过程是非常繁琐且很难有统一方案的。
另外:官方的一键安装版本已经失效了。必须手动操作。

参考另一篇笔记:树莓派安装Docker

运行Docker

image

从Image镜像创建一个Container容器:

# 新建一个Container容器(如果本地有image则直接从它创建,如果没有则从网上下载)
# 进入docke的shell -t,即进入虚拟的一个系统,有自己的/root文件系统结构

$ docker run -it <repo>:<tag> <CMD>

#如:
$ docker run -it jekyll/jekyll:latest bash

# 为container指定名称(而不是只用ID来引用)
$ docker run -it --name <NAME> <image-ID>

查看已有的:

# 查看已有的images
$ docker images

# 查看已创建的containers
$ docker container ls -a

运行一个已有的Container:

# 先启动container
$ docker container <ID> start

# 运行(挂载)container,挂载后自动进入容器里的shell
$ docker attach <ID>

# 或者一句话完成(--attach)
$ docker start -a<ID> 

删除已有的:

# 删除image
$ docker rm <Image-ID>

# 删除container
$ docker rm <Container-ID>

无需sudo执行docker

为了每次执行docker不需要总是输入sudo,我们需要为docker创建一个用户组,并授予权限才行:

# 创建docker用户组
sudo groupadd docker

# 把当前用户加入到docker用户组
sudo gpasswd -a $USER docker

# 更新当前用户组变动(就不用退出并重新登录了)
newgrp docker

挂载Host主机上的文件夹

我们肯定不会满足于docker只访问自己的小世界里的文件系统(什么数据都没有),所以有必要让它能访问外界Host主机上的一些文件夹。比如我有一个docker是作为下载机用的,那么我肯定得让它把下载好的东西存到我的主机上,要不然就白下载了。

参考:Docker学习---挂载本地目录

挂载文件夹是在docker运行镜像的命令里就指定的(利用-v参数):

$ docker run -it -v <HOST-PATH>:<DOCKER-PATH> ubuntu64 /bin/bash

#或者作为只读挂载 (:ro)
$ docker run -it -v <HOST-PATH>:<DOCKER-PATH>:ro ubuntu64 /bin/bash

注意,挂载的双方都必须是绝对路径。

映射Docker里的端口到Host主机上的端口

如果Docker里运行的是Web服务比如Nginx,里面有一个网站,那你必须得把”虚拟机“里的端口映射到外部才能正常看到网页。

映射是在运行docker命令时指定的,比如把里面的80端口映射到外面的8888端口,命令如下:

$ docker run --name webserver -d -p 80:8888 nginx

然后你在主机上的浏览器访问http://localhost:8888,就可以看到nginx里的网页了。

image

Docker镜像保存更改

直接在镜像上改动的内容,会在退出时全部消失。但是我们经常需要把这些变动保存下来。

Docker保存这些变动的机制就是——生成另一个只读镜像。(-_-!)

虽然正常看来,这不太好吧。但实际上,这很好!
Docker镜像实际上是非常小的,所以生成另一个镜像也没有多费事。而且这种机制保证了每个镜像的不可随便修改的性质,这一点就极大的避免了混乱。

Docker保存更改有两种方式:

  • docker commit:就像git commit一样,把每次改动作为一个commit提交,可以追溯历史
  • Dockerfile:这是从头build构建一个镜像的配置文件,把你想改动的地方(如安装一个程序)写成一句bash命令,加到Dockerfile这个文件里,它就会按照你的要求执行所有的命令,然后生成一个新的镜像。

Commit可以追溯历史,但是变动了哪些地方是对外界黑箱的。
Dockerfile确实明明白白写清楚有哪些改变。

所以一般情况下,正式构建一个镜像,都是用Dockerfile的。

"docker commit" 将变动过的Container保存为镜像

参考:利用 commit 理解镜像构成

docker commit命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

慎用docker commit:

由于命令的执行,还有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。
此外,使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 docker diff 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。
而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 docker commit 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,399评论 15 147
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,398评论 0 120
  • docker基本概念 1. Image Definition 镜像 Image 就是一堆只读层 read-only...
    慢清尘阅读 8,663评论 1 21
  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,334评论 0 27
  • 前端时间做Vue项目的时候,要用到图片压缩处理,网上查阅了资料后,发现并不能满足实际的业务需求;于是,自己结合网上...
    Cryptic阅读 21,648评论 20 36