什么是docker Docker入门教程第一篇

Docker是个新生的事物,概念类似虚拟化。网上关于Docker入门的东西已经很多了。不过本文探讨了Docker的特点、特性、原理,还介绍了具有中国特色的安装测试过程,另外还谈到了Docker的社区生态和Dockerfile,并使用Dockerfile构建一个nginx环境。

缘起

在几个月前听说Docker,但是一直没有时间去研究,前一段时间趁着azure免费试用,赶紧实验一下,但是卡在了ubuntu基础镜像的下载上(由于国内网络的特殊原因),所以也就搁浅了,这里把经验和体会分享一下。

Docker简介

我觉得简单来说,Docker就是一个应用程序执行容器,类似虚拟机的概念。但是与虚拟化技术的不同点在于下面几点:

1.虚拟化技术依赖物理CPU和内存,是硬件级别的;而docker构建在操作系统上,利用操作系统的containerization技术,所以docker甚至可以在虚拟机上运行。
2.虚拟化系统一般都是指操作系统镜像,比较复杂,称为“系统”;而docker开源而且轻量,称为“容器”,单个容器适合部署少量应用,比如部署一个redis、一个memcached。
3.传统的虚拟化技术使用快照来保存状态;而docker在保存状态上不仅更为轻便和低成本,而且引入了类似源代码管理机制,将容器的快照历史版本一一记录,切换成本很低。
4.传统的虚拟化技术在构建系统的时候较为复杂,需要大量的人力;而docker可以通过Dockfile来构建整个容器,重启和构建速度很快。更重要的是Dockfile可以手动编写,这样应用程序开发人员可以通过发布Dockfile来指导系统环境和依赖,这样对于持续交付十分有利。
5.Dockerfile可以基于已经构建好的容器镜像,创建新容器。Dockerfile可以通过社区分享和下载,有利于该技术的推广。

Docker的主要特性如下(摘自Docker:具备一致性的自动化软件部署):

文件系统隔离:每个进程容器运行在完全独立的根文件系统里。
资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。
网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址。
写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。
日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。
目前Docker正处在开发阶段,官方不建议用于生产环境。另外,Docker是基于Ubuntu开发的,所以官方推荐将其安装在Ubuntu的操作系统上,目前只能安装在linux系统上。

Docker的使用入门

Docker官方的安装指导挺详细的。但是由于国内的特殊情况,我这里基于这个安装指导,给出适用于国内开发者的入门过程。基于Ubuntu Precise 12.04 (LTS) (64-bit),推荐这个版本,其他版本参考官方安装手册。

1、Docker的安装
首先,Docker官方声称最好是运行在Linux内核3.8以上,所以要先进行内核升级

# install the backported kernel
sudo apt-get update
sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring

# reboot
sudo reboot

添加Docker仓库的key:

代码如下:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

添加镜像,这里直接用俄罗斯的Yandex

sudo sh -c "echo deb http://mirror.yandex.ru/mirrors/docker/ docker main > /etc/apt/sources.list.d/docker.list"
sudo apt-get update

安装Docker

sudo apt-get install lxc-docker

一般上面的步骤不会有任何问题。

2、Docker镜像下载

Docker运行至少需要一个ubuntu的基础镜像,这个镜像会在你初次尝试执行时自动下载,不过从国内直接用基本上就别想了,需要使用代理。这里用Docker中文社区提供的代理。出处1,出处2。

修改/etc/default/docker文件,取消注释http_proxy的部分:

# If you need Docker to use an HTTP proxy, it can also be specified here.
export http_proxy=http://192.241.209.203:8384/ 
经过笔者测试,上面这个代理也不是很稳定,可能用的人比较多吧。

可用的代理地址(持续关注中)

http://192.241.209.203:8384

然后,你就可以执行下面的命令,测试执行了,由于代理不是很稳定,可能需要多尝试几次(淡定):

sudo docker run -i -t ubuntu /bin/bash

下面这个截图是我成功pull完成,并测试hello world成功(大概尝试了3-4次):

Docker的社区和生态

仓库和镜像

评估一项开源技术很大程度上需要关注它的社区和生态。Docker的生态是通过推送和拉取特定的“镜像(image)包”来展开的。你可以从docker index上搜索需要的镜像。也可以通过下面的命令搜索:

sudo docker search

镜像可以看作是包含有某些软件的容器系统,比如ubuntu就是一个官方的基础镜像,很多镜像都是基于这个镜像“衍生”,该镜像包含基本的ubuntu系统。再比如,hipache是一个官方的镜像容器,运行后可以支持http和websocket的代理服务,而这个镜像本身又基于ubuntu。

通过pull来拉取镜像,将镜像下载到本地,比如

sudo docker pull hipache

通过images查看现在有哪些镜像:

sudo docker images

REPOSITORY   TAG     IMAGE ID   CREATED    VIRTUAL SIZE
ubuntu    13.10    9f676bd305a4  6 weeks ago   178 MB
ubuntu    saucy    9f676bd305a4  6 weeks ago   178 MB
ubuntu    13.04    eb601b8965b8  6 weeks ago   166.5 MB
ubuntu    raring    eb601b8965b8  6 weeks ago   166.5 MB
ubuntu    12.10    5ac751e8d623  6 weeks ago   161 MB
ubuntu    quantal    5ac751e8d623  6 weeks ago   161 MB
ubuntu    10.04    9cc9ea5ea540  6 weeks ago   180.8 MB
ubuntu    lucid    9cc9ea5ea540  6 weeks ago   180.8 MB
ubuntu    12.04    9cd978db300e  6 weeks ago   204.4 MB
ubuntu    latest    9cd978db300e  6 weeks ago   204.4 MB
ubuntu    precise    9cd978db300e  6 weeks ago   204.4 MB

上面的都是镜像,都从属于ubuntu仓库(一般仓库名应该是username/repository格式,如果是直接以repository作为仓库名的,是指官方发布的仓库)。我们拉取ubuntu的时候,实际上是把仓库里的镜像都拉下来了。每个镜像都有一个唯一的IMAGE ID,和一个易于记忆的TAG,可以通过IMAGE ID的前几位或者repository:TAG来标识一个镜像。

Dockerfile和通过Dockerfile来构建Nginx容器
除了pull,镜像也可以通过"编译"得到,这里的"编译"是指一种构建行为,通过手动编写或者从github获取Dockerfile来构建一个镜像。可以把Dockerfile看成是一个脚本,这个脚本会在容器每次启动时执行。一般在Dockerfile里面需要编写基础软件的安装脚本和配置脚本。下面这个Dockerfile是个例子:

#
# Ubuntu Dockerfile
#
# https://github.com/dockerfile/ubuntu
#

# Pull base image.
FROM ubuntu:12.10

# Update OS.
RUN echo "deb http://archive.ubuntu.com/ubuntu quantal main universe multiverse" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get upgrade -y

# Install basic packages.
RUN apt-get install -y software-properties-common
RUN apt-get install -y curl git htop unzip vim wget

# Add files.
ADD root/.bashrc /root/.bashrc
ADD root/.gitconfig /root/.gitconfig
ADD root/scripts /root/scripts

# Set working directory.
ENV HOME /root
WORKDIR /root

FROM指令表示这次构建需要基于ubuntu仓库的12.10这个TAG的镜像,如果本地不存在这个镜像的话,会自动下载镜像。镜像实际上就是编译好的结果。向上面这个Dockerfile,在原始ubuntu的基础上安装了很多常用的软件。

docker官方有Dockerfile的教程:https://www.docker.com/what-docker

实践

首先确保你已经完成上面的安装步骤,并拉取到基础镜像ubuntu:12.10。

现在我们用上面的Dockerfile来构建这个仓库(上面的Dockerfile实际上是github dockerfile项目的基本仓库dockerfile/ubuntu,所下面的命令直接从github下载Dockerfile来构建)

代码如下:

sudo docker build -t="dockerfile/ubuntu" github.com/dockerfile/ubuntu

下面是最后构建成功时的输出:

...
Processing triggers for ureadahead ...
 ---> 0a4392cf8e2d
Step 6 : ADD root/.bashrc /root/.bashrc
 ---> b0e86f348c09
Step 7 : ADD root/.gitconfig /root/.gitconfig
 ---> e2a9c001d457
Step 8 : ADD root/scripts /root/scripts
 ---> 678febabdbdc
Step 9 : ENV HOME /root
 ---> Running in c4afef311cf1
 ---> eaa3ae3277a8
Step 10 : WORKDIR /root
 ---> Running in d50c273c75b8
 ---> c9ecf5bc3227
Successfully built c9ecf5bc3227
Removing intermediate container 1a3d1f794c49
Removing intermediate container 9f72df8abb63
Removing intermediate container 5694d1e3e77e
Removing intermediate container 6a184821f89c
Removing intermediate container 8195bd05fc36
Removing intermediate container d50c273c75b8
Removing intermediate container 70de07353ecf
Removing intermediate container 73e3f6204613
Removing intermediate container 5dd948415981
Removing intermediate container c4afef311cf1

此时会多出一个仓库:

sudo docker images
REPOSITORY   TAG     IMAGE ID   CREATED    VIRTUAL SIZE
dockerfile/ubuntu latest    c9ecf5bc3227  About a minute ago 294.2 MB
...

现在我们可以来构建dockerfile/nginx了(当然,从一开始你就可以直接pull这个镜像)

sudo docker build -t="dockerfile/nginx" github.com/dockerfile/nginx

完成后,会看到编译好的镜像:

sudo docker images
REPOSITORY   TAG     IMAGE ID   CREATED    VIRTUAL SIZE
dockerfile/nginx latest    68508350c656  About a minute ago 308.3 MB
dockerfile/ubuntu latest    c9ecf5bc3227  16 minutes ago  294.2 MB
...

现在是时候看到真正的效果了!用下面这个命令运行容器:

sudo docker run -d -p 80:80 dockerfile/nginx

这个命令会以daemon的方式运行容器,通过下面命令查看正在运行的容器:

sudo docker ps
CONTAINER ID  IMAGE      COMMAND    CREATED    STATUS    PORTS    NAMES
98c474a7dd6a  dockerfile/nginx:latest nginx    6 seconds ago  Up 6 seconds  0.0.0.0:80->80/tcp trusting_hawking

访问你主机的80端口,可以看到nginx的欢迎页面了!这时,我们来看看本机的进程sudo ps -ef:

root  1428 952 0 15:19 ?  00:00:00 nginx: master process nginx
root  1429 417 0 15:19 ?  00:00:00 /sbin/udevd --daemon
www-data 1441 1428 0 15:19 ?  00:00:00 nginx: worker process
www-data 1442 1428 0 15:19 ?  00:00:00 nginx: worker process
www-data 1443 1428 0 15:19 ?  00:00:00 nginx: worker process
www-data 1444 1428 0 15:19 ?  00:00:00 nginx: worker process

似乎有些接近事物的本质了!nginx的进程实际上是在本机上的,这意味着,容器中程序的执行仍然是使用本机操作系统的,容器并不自己构建操作系统,而是以某种隔离的方式依赖本机操作系统工作。这就是Docker和虚拟机的本质区别。

你可以像下面这样,将本机的目录映射给这个"nginx容器"。<sites-enabled-dir>目录下应该有nginx的配置文件片段

代码如下:

docker run -d -p 80:80 -v <sites-enabled-dir>:/etc/nginx/sites-enabled -v <log-dir>:/var/log/nginx dockerfile/nginx

PS:这步笔者没有成功,日志路径是可以map的,但是sites-enable-dir中的配置始终不行。继续诊断中。
镜像的共享与Dockfile的分发
可以共享你的镜像和用来构建的Dockfile分享给社区:

Docker index是官方的镜像目录,可以从里面得到大量的预编译好的镜像
Dockerfile Project一个托管Dockerfile的仓库集合

原理
总的来说Docker的核心技术如下:

命名空间
AUFS(advanced multi layered unification filesystem)
cgroup

由于本人才疏学浅,有兴趣的朋友可以扩展阅读一下,一定会对Docker有更深刻的认识的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Docker快速入门以及环境配置详解

    前言 数据科学开发环境配置起来让人头疼,会碰到包版本不一致.错误信息不熟悉和编译时间漫长等问题.这很容易让人垂头丧气,也使得迈入数据科学的这第一步十分艰难.而且这也是一个完全不常见的准入门槛. 还好,过去几年中出现了能够通过搭建孤立的环境来解决这个问题的技术.本文中我们就要介绍的这种技术名叫Docker.Docker能让开发者简单.快速地搭建数据科学开发环境,并支持使用例如Jupyter notebooks等工具进行数据探索. 简介 Docker 最初 dotCloud 公司内部的一个业余项目

  • Docker学习笔记之docker入门

    学习的一些疑问 如何热更新镜像(images)?(你可以快速启动或者销毁容器.这种时间几乎是实时的) 如何热更新游戏服? 好处在于各个应用之间环境相互独立,即使某一个容器崩溃也不会影响到其它容器: 每个容器使用端口如何维护?(方法1写在Dockerfile里面,不灵活:方法2在run的时候-p指定): 那这样的话,会存在好多linux用户,相当于每一个容器就要维护一个物理机(虚拟): 需要一套工具来管理维护镜像.容器的操作和状态: 目前主流使用docker都是应用到哪些场景中? 1. docke

  • 使用IPython来操作Docker容器的入门指引

    现在Docker是地球上最炙手可热的项目之一,就意味着人民实际上不仅仅是因为这个才喜欢它. 话虽如此,我非常喜欢使用容器,服务发现以及所有被创造出的新趣的点子和领域来切换工作作为范例. 这个文章中我会简要介绍使用python中的docker-py模块来操作Docker 容器,这里会使用我喜爱的编程工具IPython. 安装docker-py 首先需要docker-py.注意这里的案例中我将会使用Ubuntu Trusty 14.04版本. $ pip install docker-py IPyh

  • 什么是Docker? Docker入门教程

    概述 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的  Linux 机器上,也可以实现 虚拟化 . docker的配图很形象.一只鲸鱼(容器)上面装载着货物(应用). docker安装 debian/ubuntu等系统可以直接下载deb进行安装 docker repo sudo dpkg -i package-name.deb 其他平台参照 docker官网 docker hello world 安装好docker之后,执行

  • docker快速入门教程

    10分钟教会大家如何玩转Docker,这是 1.前言 进入云计算的时代,各大云提供商AWS,阿里云纷纷推出针对Docker的服务,现在Docker是十分火爆,那么Docker到底是什麽,让我们来体验一下. 2.Docker是什麽 Docker是一个开源的应用容器引擎,可以把应用以及依赖包放到一个可移植的容器中,然后发布到任何流行的 Linux 系统上,通过这种方式实现虚拟化. 提到虚拟化,大家应该十分熟悉了,有VMware,Xen,KVM等等很多.那么,Docker和VM有什么不同呢,我们用官网

  • Docker安装和简单使用入门教程

    安装 由于我本人使用的linux系统,原生支持docker,相对安装还是比较简单的 1:使用下面的官方脚本安装: wget -qO- https://get.docker.com/ | sh 2:输入下面的命令验证是否可以查看版本号,可以就是安装成功 sudo docker version 3:建议把当前使用的用户加到Docker用户组,就可以不用很次都sudo了 sudo usermod -aG docker your_username 4:重新登录,sudo权限才会成效 logout 至此,

  • Docker安装和基础用法 Docker入门教程第二篇

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5)Docker 网络 1. 安装 1.1 在 Ubuntu 14.04 上安装 Docker 前提要求: 内核版本必须是3.10或者以上 依次执行下面的步骤: sudo apt-get update sudo apt

  • Visual Studio ASP.NET Core MVC入门教程第一篇

    ASP.NET Core MVC入门教程第一节课,具体内容如下 1.开始环境 visual studio 2017 社区版或其他版本.安装时勾选"Web和云"组中的"ASP.NET及网页开发"项和"其他工具"组中的".NET Core平台开发"项. 2.创建一个网页应用 (1)在 Visual Studio中, select 文件 >新建 >项目. (2) 在"新项目"对话框中的左面板中,点击&

  • 什么是docker Docker入门教程第一篇

    Docker是个新生的事物,概念类似虚拟化.网上关于Docker入门的东西已经很多了.不过本文探讨了Docker的特点.特性.原理,还介绍了具有中国特色的安装测试过程,另外还谈到了Docker的社区生态和Dockerfile,并使用Dockerfile构建一个nginx环境. 缘起 在几个月前听说Docker,但是一直没有时间去研究,前一段时间趁着azure免费试用,赶紧实验一下,但是卡在了ubuntu基础镜像的下载上(由于国内网络的特殊原因),所以也就搁浅了,这里把经验和体会分享一下. Doc

  • openCV入门学习基础教程第一篇

    目录 前言:计算机眼中的图片 1. 图片的读取与显示 1.1 图片的读取 1.2 显示的图片 1.2.1 显示原始图片 1.2.2 灰度图 1.3 BGR转换成灰度图.RGB 2. 保存图片 3. 视频的读取与显示 4. 截取图像部分 5. 颜色通道提取 6. 边界填充 7. 数值计算 8. 图像融合 9. 知识点总结* 总结 前言:计算机眼中的图片 计算机中图片由许多个像素点组成,如一个500x500的图片,表示长宽各由500个像素点组成. 计算机中一个像素点的值在0-255表示该点亮度  0

  • BootStrap入门学习第一篇

    本文实例为大家分享了BootStrap入门学习的第一篇,供大家参考,具体内容如下 1.环境搭建 中文官网下载地址:http://www.bootcss.com/ 右击选中的WEB项目,点击导入,选择文件系统,然后下一步,选择BootStrap文件目录路径,如下: 完成后,WEB项目下的css.img.js就出现相应文件,说明导入成功. 然后导入较新版本的JQuery库,目录结构如下: 至此环境搭建完成. 3.BootStrap基本模板 <!DOCTYPE html> <html lang

  • Javascript入门学习第一篇 js基础第1/2页

    Javascript学习第一篇 js基础 1 , javascript字符集: javascript采用的是Unicode字符集编码. 为什么要采用这个编码呢? 原因很简单,16位的Unicode编码可以表示地球人的任何书面语言.这是语言 国际化的一个重要特征.(大家也许见过用中文写脚本,比如:function 我的函数() {}  ); Javascript中每个字符都是用2个字节表示的.(因为是16位编码) 2 ,大小写敏感: js是一种区分大小写的语言. 注意下:以前我也犯过的错误. HT

  • MySQL基础教程第一篇 mysql5.7.18安装和连接教程

    从这篇开始,用一个新的系列文章去介绍和学习MySQL.为什么要学习MySQL,从产品角度来说,大部分软件的数据库服务还是采取关系型数据库,主要的数据库产品有Oracle.微软的MSSQL.IBM的DB2.和我们要介绍的MySQL.MySQL是很多中小型的网站服务器中数据库的首选,它有免费版,也有商业版,目前是Oracle的产品.从测试人员的角度来说,越来越多的软件产品是和数据有关,例如电商,和一些某一个领域内的数据库服务查询的软件产品.测试人员除了要做基本的软件功能测试之外,公司更希望测试人员可

  • 土人系列AS入门教程--实战篇

    这次我们要进入实战,我要教你们做一个很简单的游戏,下面的每句代码我都会加上注释,如果你看过上面的教程,我想要全部理解应该不会困难. 现在让我们开始吧.这个游戏是我初学的时候按教程做的一个游戏,所以印象比较深刻.这个游戏叫做蜗牛赛跑,流程是这样的:画面上有若干条赛道,每条赛道上面有一只蜗牛,每只蜗牛爬行的速度不一样.游戏开始了,你要猜猜哪只蜗牛先跑到终点.如果你猜对了,You Win,否则,Game Over. 第1步,我们先设置场景的大小 600*400 px ,运行速度为 48帧/秒 这个是我

  • javascript入门教程基础篇

    一. 简介 1. 什么是javascript JavaScript 是网景(Netscape)公司开发的一种基于客户端浏览器.面向(基于)对象.事件驱动式的网页脚本语言. 2. 为什么要使用javascript 表单验证 网页特效 小游戏 Ajax 3.快速入门 在程序中,如果想编写js代码,有两种办法: 1)在html文件中,在一对script标记中,直接编写 <script language='javascript'> document.write('hello'); </scrip

随机推荐