深入浅出docker
笔者在海外工作多年,所以文中多用英文单词,有些时候是为了更精准的描述,请见谅。希望这篇随笔能帮大家入门docker。由于在海外连博客园有些慢,所以我图片用的比较少,以后再考虑一下如何更好的解决图片上传问题。
docker 已经是比较成熟的技术了,尤其是现在搭配kubernetes,swarm 让企业级部署更加轻松。以前主要是虚拟机技术,在host os上通过hypervisor连多个guest os,比较heavy。Docker则是在host os上直接联通多个container(相关联的container共享bin/library),属于更轻量级的架构。

Docker 架构
docker client, docker daemon, docker.io registry
docker daemon(dockerd)是一个用来管理container的守护进程,它支持unix, tcp, fd几种联通方式,通常情况下相同机器CLI访问用的是unix domain socket(/var/run/docker.sock),记得要把用户名添加到docker group中,否则在不用sudo的情况下,会没有权限访问/var/run/docker.sock,接下来我会再提一下。
docker.io registry,平时用git会有github,docker也会有docker hub, docker.io registry就是常用的docker image存放的地点.
写:你自己可以通过docker build/docker commit创建image, 然后通过docker login/docker tag/docker push 上传image
读:可以通过docker search 找到想要的image,比如 docker search nginx, 注意search结果里面标明OFFICIAL 【OK】是官方维护的稳定版本,剩下的基本都是个人项目。docker pull用来把image pull/extract到本地,你会发现pull的时候,是多个layer并发pull/extract, 如果是企业级应用,可以用企业内部的registry, 然后caching hot pull path,这样pull 几个或者几十G的image速度会更快。当然很多layer是共享的,所以只是第一次pull会慢一些,以后就是用本地的cache了。
Docker 安装
follow 官方文档就可以了,我主要在Mac和Linux上装过,唯一要注意的就是:sudo usermod -a -G docker $your_username,可以通过cat /etc/group | grep docker来确认是否已经把用户添加到docker group里面. 还有一点 docker 默认安装路径是/var/lib/docker, 可以通过在/etc/default/docker添加 DOCKER_OPTS="-g $otherpath" 来更改路径,通常适用于默认分区空间不够需要使用更大分区的情况。注意如果你已经运行了一段时间,然后更改docker路径之后,会发现之前的image和container都不见了,那是因为它们还在旧的路径中。
Docker 命令
docker images 显示repository和tag,image ID, 创建事件,大小。repository:tag 这个格式相当于docker image的uri。tag 主要是控制版本, 比如常用的latest
docker ps 显示正在运行的container 和它们的状态, “-a" 显示所有运行过的container(包括已退出的)
这里要简单描述一下image和container的区别,image是静态的snapshot,而container是运行了这个snapshot,可以实时通信,同时可以docker commit成新的image保留下来。
docker rename 重命名,docker run 会随机给生成的container默认的名字(这个太有趣了),你会想要重命名为你能记住的名字
docker run, 这就是最重要的生成container的命令了,如果你想要进行交互,那么需要用docker run -it $uri /bin/bash, 这样你就可以直接用bash进行交互,如果是运行像nginx这种服务器,就直接-d 让它们在背景运行就可以了。
docker attach, 这个通常不会怎么用到,因为它的弊端在于一旦退出,attached进程也跟着结束了,这可能往往不是你想看到的 :)
docker exec, 这个更常用,因为它解决了上面提到的问题 docker exec -it $uri /bin/bash
注意如果你用多个docker run,那么会生成多个container,你可能只是想docker run一次,接下来以后就用docker exec访问就可以了,初学者容易犯错误。
docker rmi 删除image,注意如果你有正在运行的container,它会报错,除非你强制删除。注意就算你强制删除,你会发现依赖的container仍然可以正常使用(设计的好!)即使关闭,重启啥的依然能用(牛逼!),只是不能生成新的container了。
docker rm 删除container
docker inspect 查看image内容
Docker image
这就属于进阶题目了,下面举个简单的例子:
FROM debian:stable
MAINTAINER huashao1985 <huashao1985@lalala.com> RUN apt-get update
RUN apt-get upgrade
你会发现每一行代码都会生成一个docker layer,这4行docker layer就组成了一个docker image。如果想要减少layer的数量,可以用比如 RUN apt-get udpate && apt-get upgrade的方式。
Docker 容器生命周期
下面聊聊容器的生命周期,docker run会启动一个新容器,然后容器可以被docker stop,也可以被docker start,docker ps可以看到当前容器的状态。
Docker port
最后聊聊docker port,比如你在docker里面启动了nginx(准备以后专门找机会聊聊nginx),它的映射可能是0.0.0.0:32678->80/tcp, 0.0.0.0:32679->443/tcp,可以通过 docker port $image $CONTAINERPORT查看。那么如果我想把nginx绑定到我想指定的端口该怎么办呢?可以这样: docker run -d -p 8080:80 --name=$CONTAINER_NAME $IMAGE
好了,这次大概就聊这些,happy docker!
深入浅出docker的更多相关文章
- 深入浅出Docker(一):Docker核心技术预览
Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.Docker提供了一种在安全.可 ...
- 深入浅出Docker(六):像谷歌一样部署你的应用
1.概述 谷歌发起的开源项目从来都是广受技术圈的关注和讨论,本文将介绍的就是最新的容器编排管理系统Kubernetes.Kubernetes开源项目版本更新频繁,对于初次使用者来说其定义大量的技术术语 ...
- 深入浅出Docker(五):基于Fig搭建开发环境
概述 在搭建开发环境时,我们都希望搭建过程能够简单,并且一劳永逸,其他的同事可以复用已经搭建好的开发环境以节省开发时间.而在搭建开发环境时,我们经常会被复杂的配置以及重复的下载安装所困扰.在Docke ...
- 深入浅出Docker(四):Docker的集成测试部署之道
1. 背景 敏捷开发已经流行了很长时间,如今有越来越多的企业开始践行敏捷开发所提倡的以人为中心.迭代.循序渐进的开发理念.在这样的场景下引入Docker技术,首要目的就是使用Docker提供的虚拟化方 ...
- 深入浅出Docker(三):Docker开源之路
背景 Docker从一开始的概念阶段就致力于使用开源驱动的方式来发展,它的成功缘于国外成熟的开源文化氛围,以及可借鉴的社区运营经验.通过本文详细的介绍,让大家可以全面了解一个项目亦或者一项技术是如何通 ...
- 深入浅出Docker(二):Docker命令行探秘
1. Docker命令行 Docker官方为了让用户快速了解Docker,提供了一个交互式教程,旨在帮助用户掌握Docker命令行的使用方法.但是由于Docker技术的快速发展,此交互式教程已经无法满 ...
- 深入浅出 Docker
一.什么Docker 从作用的角度: Docker是一个为开发人员和系统管理员开发.迁移和运行应用程序的平台.应用程序通过Docker打包成Docker Image后,可以实现统一的方式来下载.启动. ...
- docker好文收藏
深入浅出Docker(一):Docker核心技术预览 2. 核心技术预览 Docker核心是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观.我们从虚拟化方法的四个方面:隔离性.可配额/可度 ...
- 【云计算】docker相关开源项目、工具
十大基于Docker的开发工具 作者 郭蕾 发布于 2014年8月19日 | 注意:QCon全球软件开发 ...
随机推荐
- python的defaultdict
defaultdict是dict的一个子类,接受一个工厂函数作为参数,当访问defaultdict中不存在的key时,会将工厂函数的返回值作为默认的value. class defaultdict(d ...
- Python新式类继承的C3算法
在Python的新式类中,方法解析顺序并非是广度优先的算法,而是采用C3算法,只是在某些情况下,C3算法的结果恰巧符合广度优先算法的结果. 可以通过代码来验证下: class NewStyleClas ...
- StringMVC @RequestMapping method属性
@RequestMapping(value="/testMethod",method=RequestMethod.POST) public String testMethod(){ ...
- golang 多维数组
具体的题目如下:(就是将多维数组的行列互换) A multi-dimensional array is an array of arrays. 2-dimensional arrays are the ...
- jQuery 数据操作函数(九)
.clearQueue() 从队列中删除所有未运行的项目. .data() 存储与匹配元素相关的任意数据. jQuery.data() 存储与指定元素相关的任意数据. .dequeue() 从队列最前 ...
- JS 实现图片的预加载(转载)
图片预加载是web开发中一种应用相当广泛的技术,比如我们在做图片翻转显示等特效的时候,为了让图片在转换的时候不出现等待,我们最好是先让图片下载到本地,然后在继续执行后续的操作. 下面的函数实现了一个我 ...
- 第十四章:Python の Web开发基础(一) HTML与CSS
本課主題 HTML 介绍 CSS 介绍 HTML 介绍 HTML 的头部份,重点: 定义HTML 的编码:<meta charset="UTF-8"/> 定义标题: & ...
- [Spark内核] 第38课:BlockManager架构原理、运行流程图和源码解密
本课主题 BlockManager 运行實例 BlockManager 原理流程图 BlockManager 源码解析 引言 BlockManager 是管理整个Spark运行时的数据读写的,当然也包 ...
- 文字太多?控件太小?试试 TextView 的新特性 Autosizeing 吧!
Hi,大家好,我是承香墨影! Android 8.0 已经发布了有一阵子了,如果你有在关注它,你应该会知道它新增了一个对于 TextView 字体大小变动的新特性:Autosizing. 本身这个新特 ...
- 关于对JavaScript待于完善的一些知识点
学习JavaScript也存在一段时间,以下是个人对JavaScript中抽象的知识点记录备案,将有待于后面逐个完善...... 1.JavaScript在内存中的体现(内存中栈堆与基本类型及引用类型 ...