笔者在海外工作多年,所以文中多用英文单词,有些时候是为了更精准的描述,请见谅。希望这篇随笔能帮大家入门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的更多相关文章

  1. 深入浅出Docker(一):Docker核心技术预览

    Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.Docker提供了一种在安全.可 ...

  2. 深入浅出Docker(六):像谷歌一样部署你的应用

    1.概述 谷歌发起的开源项目从来都是广受技术圈的关注和讨论,本文将介绍的就是最新的容器编排管理系统Kubernetes.Kubernetes开源项目版本更新频繁,对于初次使用者来说其定义大量的技术术语 ...

  3. 深入浅出Docker(五):基于Fig搭建开发环境

    概述 在搭建开发环境时,我们都希望搭建过程能够简单,并且一劳永逸,其他的同事可以复用已经搭建好的开发环境以节省开发时间.而在搭建开发环境时,我们经常会被复杂的配置以及重复的下载安装所困扰.在Docke ...

  4. 深入浅出Docker(四):Docker的集成测试部署之道

    1. 背景 敏捷开发已经流行了很长时间,如今有越来越多的企业开始践行敏捷开发所提倡的以人为中心.迭代.循序渐进的开发理念.在这样的场景下引入Docker技术,首要目的就是使用Docker提供的虚拟化方 ...

  5. 深入浅出Docker(三):Docker开源之路

    背景 Docker从一开始的概念阶段就致力于使用开源驱动的方式来发展,它的成功缘于国外成熟的开源文化氛围,以及可借鉴的社区运营经验.通过本文详细的介绍,让大家可以全面了解一个项目亦或者一项技术是如何通 ...

  6. 深入浅出Docker(二):Docker命令行探秘

    1. Docker命令行 Docker官方为了让用户快速了解Docker,提供了一个交互式教程,旨在帮助用户掌握Docker命令行的使用方法.但是由于Docker技术的快速发展,此交互式教程已经无法满 ...

  7. 深入浅出 Docker

    一.什么Docker 从作用的角度: Docker是一个为开发人员和系统管理员开发.迁移和运行应用程序的平台.应用程序通过Docker打包成Docker Image后,可以实现统一的方式来下载.启动. ...

  8. docker好文收藏

    深入浅出Docker(一):Docker核心技术预览 2. 核心技术预览 Docker核心是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观.我们从虚拟化方法的四个方面:隔离性.可配额/可度 ...

  9. 【云计算】docker相关开源项目、工具

    十大基于Docker的开发工具 作者                     郭蕾        发布于     2014年8月19日     |              注意:QCon全球软件开发 ...

随机推荐

  1. MySQL优化五 SQL优化

    1.减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然 ...

  2. sublime自动保存(失去焦点自动保存)

    sublime是轻量的编辑器,经常用sublime编辑器来做一些小例子,使用起来很方便. 在使用sublime的时候需要不断的 ctrl + s 保存代码,才能看到效果. 这样的操作很繁琐,保存的多了 ...

  3. unity3d 打包个人记录

    证书问题Android:CreateCer.bat ztmyseabed 路径:tool/Build/Windows/Android下iOS:MacCer文件夹如何上传ipa:修改版本号version ...

  4. C++继承分析

    面向对象的三大特性之一就是继承,继承运行我么重用基类中已经存在的内容,这样就简化了代码的编写工作.继承中有三种继承方式即:public protected private,这三种方式规定了不同的访问权 ...

  5. js 跨域问题 汇总

    前言 相信每一个前端er对于跨域这两个字都不会陌生,在实际项目中应用也是比较多的.但跨域方法的多种多样实在让人目不暇接.老规矩,碰到这种情况,就只能自己总结一篇博客,作为记录. 正文 1. 什么是跨域 ...

  6. Python全栈考试(一)

    1.执行 Python 脚本的两种方式 1) 使用命令行执行Python脚本: python C:\tesst.py 2) 使用各种IDE软件.pycharm wing 2.简述位.字节的关系 位 ( ...

  7. angular2+ 组件中用@import进来的css不起作用

    一般来说是作用域的问题,首先你应该先看标签内是否有angular2内置生成的自定义属性比如: 在我们的@Component中,这三个是基本的设置. 页面上的标签会生成带有 _nghost-c1 和  ...

  8. .net整理

    CLR via C# 1 关于CLI,CTS,CLS,CIL,.Net Framework,CLR,FCL图 CLI:Common Language Infrastructure,是公共语言架构: C ...

  9. SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)

    在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...

  10. hdu_4497GCD and LCM(合数分解)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 GCD and LCM Time Limit: 2000/1000 MS (Java/Other ...