深入浅出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全球软件开发 ...
随机推荐
- sed中引用变量
sed 中引用变量 eval sed 's/string/$REPLACE/g' file awk 中引用变量 awk 在匹配字符串的时候,有时候需要需要引用变量. $pid= eval " ...
- 前端开发chrome console的使用 :评估表达式 – Break易站
本文内容来自:chrome console的使用 :评估表达式 – Break易站 从 DevTools 控制台使用它的某个评估功能查看页面上任意项目的状态. DevTools 控制台让您可通过特定方 ...
- hadoop集群篇--从0到1搭建hadoop集群
一.前述 本来有套好好的集群,可是不知道为什么虚拟机镜像文件损坏,结果导致集群不能用.所以不得不重新搭套集群,借此机会顺便再重新搭套吧,顺便提醒一句大家,自己虚拟机的集群一定要及时做好快照,最好装完每 ...
- HttpRuntime.Cache .Net自带的缓存类
.Net自带的缓存有两个,一个是Asp.Net的缓存 HttpContext.Cache,一个是.Net应用程序级别的缓存,HttpRuntime.Cache. MSDN上有解释说: HttpCont ...
- 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器
北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 论述当下网络时间同步 ...
- Java框架之Hibernate(一)
一.Hibernate - 核心接口 它是 JBoss Community team (社区团队) 开发的.Hibernate 是一个开源的,对象关系模型框架 (ORM),它对JDBC进行了轻量的封 ...
- c# winform 视频转字符动画
以上是大图展示, 原理比较简单,附件下载带了一个分辨率比较小的txt动画. 音乐删除了music.mp3, 如果需要自己下载一首歌曲,然后放在根目录名称“music.mp3”就可以了. 附件点我 ...
- es6 模板字变量和字符串占位符
开发者一直在寻找一种创建多行字符串的形式,但要使用单引号双引号字符串一定要在同一行才行. 老办法: 还有其他办法,虽然能实现,但是太啰嗦 es6模板自变量 使用反撇好(`)替换了单双引号 反撇好中的所 ...
- 【JavaScript的五种基本数据类型及转换】
js中有六种数据类型,包括五种基本数据类型(Number,String,Boolean,Null,Undefined),和一种混合数据类型就是特殊的(Object). "undefined& ...
- Codeforces 725B Food on the Plane
B. Food on the Plane time limit per test:2 seconds memory limit per test:256 megabytes input:standar ...