分享 Docker 入门

zhaozijie · 2015年03月23日 · 最后由 riskgod 回复于 2016年03月15日 · 11343 次阅读

Docker 是什么

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

上面是官方的解释,用通俗一点的话来形容就是用下面这样的一个集装箱 (container) 把运行的程序装进去,放到任何 Linux 机器上都可以。

docker 和 virtual machine 不一样的地方

docker 更加轻量,需要更少的资源。 但是 vm 的隔离更加好。

优点
  • 快速交付和部署
  • 更容易扩展
  • 更高效的虚拟化
  • 更加简单的管理

docker 的架构

  • Daemon
  • Client
  • Docker.io Registry

Docker 的几个重要概念

  • 镜像 (Image)
    • Docker 镜像就是一个可读的模板。
  • 容器 (Container)
    • Docker 利用容器来运行应用。
    • 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
  • 仓库 (Repository)
    • 仓库是集中存放镜像文件的场所。

安装

ubuntu14.04 默认的源有 docker,但是版本太老了,我们演示下通过 Docker 源安装最新版本: 首先确认你的 APT 系统能够处理 https 的 URLs:如果你的主机不存在 /usr/lib/apt/methods/https 这个文件,先安装 apt-transport-https 包:

[ -e /usr/lib/apt/methods/https ] || {
  apt-get update
  apt-get install apt-transport-https
}

然后添加 Docker 镜像的 key 到你的本地 local keychain。

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

添加 Docker 镜像到 apt 软件源,更新和安装 lxc-docker 包。

$ sudo sh -c "echo deb https://get.docker.com/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker

然后使用下面的命令查看是否安装成功。

$ docker version

Docker 起步

如果搞明白 Docker 的基本概念,使用起来非常简单。下面我们开始创建我们的第一个容器:

$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'

如果是第一次使用的话,应该会出现如下类似的输出:

Unable to find image 'ubuntu:14.04' locally
511136ea3c5a: Pull complete
511136ea3c5a: Download complete
f3c84ac3a053: Download complete
a1a958a24818: Download complete
9fec74352904: Download complete
d0955f21bf24: Download complete
Status: Downloaded newer image for ubuntu:14.04
Hello world

来解释一下这个其中的过程,docker run 的作用是创建一个容器。如果不熟悉一个命令的作用可以使用 --help 参数。

$ docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

ubuntu:14.04 是我们的镜像,docker 会先去本地查找是否有 docker 镜像,如果没有会去 docker 仓库下载。

Unable to find image 'ubuntu:14.04' locally # 本地没有找到

Status: Downloaded newer image for ubuntu:14.04 # 成功下载 可以使用docker images 来查看本地已经有的

/bin/echo 'Hello world' 是我们想在容器运行的命令。如果我们看到终端输出 Hello world.

守护进程 docker

我们上一个 docker 容器运行 echo 命令后就停掉了,这一般都不用于现实生活中。我们创建一个容器让它以守护进程的模式运行。

我们可以这样运行docker run命令:

$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
3f5f9f691bcc8fc509e5844ca4e9ad1fcbdd59279505b24d74722da9f7dce547

我们运行 docker 但是我们指定了一个-d标识。-d标识告诉 docker 运行容器在后台模式运行。所以返回了这个 container 的 id。

我们也指定了一个相同的镜像:ubuntu:14.04

我们指定命令行运行:

/bin/sh -c "while true; do echo hello world; sleep 1; done"

这是一个输出的 hello word 进程:一个脚本会一直输出"hello word"

docker ps命令可以查询 docker 进程的所有容器。

    $ sudo docker ps
    CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS               NAMES
3f5f9f691bcc        ubuntu:14.04        "/bin/sh -c 'while t   About a minute ago   Up About a minute                       nostalgic_perlman

现在我们知道它运行。我们需要在我们容器内使用docker logs命令来查看产生的 log。

$ sudo docker logs insane_babbage
hello world
hello world
hello world
. . .

这样不断的出现 hello world,我们可以推断出刚才那个那个容器一直在运行。

Docker 在中国

下载 docker 镜像的时候可能比较慢,可以考虑使用 daocloud 来加速。

总结

docker 的镜像 (image) 就像一个一个的集装箱,容器 (container) 基于镜像运行的进程,

推荐阅读

http://stackoverflow.com/questions/16047306/how-is-docker-io-different-from-a-normal-virtual-machine https://docs.docker.com/

原文链接: http://blog.bringstudio.com/dockerru-men/


这周末参加 ruby 分享会,分享 docker 相关的,不知道大家有啥建议吗?

Dokku 如何?

挺好,学到东西了。 对于完全没有 docker 经验的人很有帮助。

建议: 弄一个更加实用的例子。 循环打印 hello world 没什么价值。是否能举个例子让大家觉得 docker 马上就能给自己带来好处(比如改变开发或者部署的方式),那样的话一下子兴趣就来了。比如说, 能否用 docker 来改善目前的 rails 开发和部署?

👍 ,希望 LZ 列出来一个能够直接帮助 Rails 开发的实例,总感觉原理概念什么的是使用之后的事情了

标题图不错

#1 楼 @mimosa 这个我们私下讨论。

#2 楼 @tylerlong 那周末就讲 docker with rails

#3 楼 @huopo125 好的。

#2 楼 @tylerlong docker 上架构 rails 网站,很轻松。Docker 就是针对简化开发部署环节,缩短周期的,正好满足你这个需求。

#3 楼 @huopo125 先装个 docker, pull 些别人上传的优秀的 image,然后 run 些程序,初级还是很容易上手的。 推荐本中文书 docker_practice 感谢 @limkurn 的推荐。

#9 楼 @mimosa 大概看了下,很棒啊。考虑放到 github 上吗?

#9 楼 @mimosa 我以前不是用第三方脚本来写,这倒是个有趣的方法。问个问题,如果这么用,你改变 shell 文件内部内容,他重新 build,image/fs layer 会不一样吗,比如修改一个 ruby 的版本

有几个问题,Docker container 貌似一般是 “用后即焚”,如果要放数据库是不是不太适合?(好像最新一期的 Teahour.fm 也提到这个问题). 另外 Docker 推崇的好像是开箱即用,每个 container 只跑最少的东西,是不是应该把 Rails, Ngnix, Redis, MongoDB, MQ 等等分别跑在不同的 container 里?

#13 楼 @southwolf Persistance Volume,持久化数据可以通过创建 Volume,在 docker run 的时候-v 指定对应的 volume,类似 mount。 通常而言,应用程序和数据是分开跑在不同的 container 里面,而且一个数据库 container 是可以同时供多个 app container 来使用的。

#13 楼 @southwolf 我觉得挺合适的,备份数据库只需要 commit 一下就好了。。

这个东西相当给力,可以实现快速部署

hi 楼主可否留个微信?想问些相关问题

需要 登录 后方可回复, 如果你还没有账号请 注册新账号