笔者在海外工作多年,所以文中多用英文单词,有些时候是为了更精准的描述,请见谅。希望这篇随笔能帮大家入门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. chrome console的使用 : 异常和错误的处理 – Break易站

    本文内容来自:chrome console的使用 : 异常和错误的处理 – Break易站 利用 Chrome DevTools 提供的工具,您可以修复引发异常的网页和在 JavaScript 中调试 ...

  2. Python爬取视频(其实是一篇福利)

    窗外下着小雨,作为单身程序员的我逛着逛着发现一篇好东西,来自知乎 你都用 Python 来做什么?的第一个高亮答案. 到上面去看了看,地址都是明文的,得,赶紧开始吧. 下载流式文件,requests库 ...

  3. 又趟一个坑,IO卡信号DI和DO的信号类型

    工控IO卡可以感应到各种电信号,传感器的状态变化. DI信号包括数字开关信号(ture,false\0,1),光信号的变化(上升沿,下降沿). DO信号包括脉宽和数字开关信号(ture,false\0 ...

  4. Ubuntu 搭建简单的git server

    Git 可以使用四种主要的协议来传输资料:本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 Git 协议. 在此,我们将会讨论那些协议及哪些情形应该使用(或避免使用)他 ...

  5. 【后缀数组】洛谷P3809模板题

    题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...

  6. JAVA读取和写入properties文件

    1.读取 Properties prop = new Properties(); try { //这个getResourceAsStream方法就是把文件转为inputStream的方式 prop.l ...

  7. LevelDB的源码阅读(二) Open操作

    在Linux上leveldb的安装和使用中我们写了一个测试代码,内容如下: #include "leveldb/db.h" #include <cassert> #in ...

  8. C#在与java对接时候的UrlEncode的坑

    最近与建行接口做对接和与一家短信运营商做对接时候遇到了这个坑 在java中对UrlEncode 时候哪些url非安全字符被转为%数字和大写字幕组合,比如:zhangsan/d 会被转为 zhangsa ...

  9. Vijos-P1057题解

    题目如下: https://www.vijos.org/p/1057 思路分析: 输入文件第一行为两个整数n,m(1<=n,m<=1000),接下来n行,每行m个数字,用空格隔开.0表示该 ...

  10. Maven适配多种运行环境的打包方案

    项目从开发到部署会历经多个运行环境,如开发环境.测试环境和生产环境,不同环境中项目的配置文件通常也会不同,典型的如数据库连接配置.我们当然不希望每次部署打包前都去修改配置文件以适配环境,利用Maven ...