喵の窝

我可能遇上了假主机 - docker使用小记 (壹)

一切麻烦的开始

前段时间,小喵突然手痒想把自己服务器上的系统从Ubuntu 14.04升级到16.04。系统的升级过程倒是挺顺利,用几个脚本就轻松搞定了。但是系统升级完成以后,主机上的apache,mysql各种报错。于是小喵无奈地滚回了磁盘。升级计划也搁浅。
直到最近,小喵终于下定决定,本着长痛不如短痛,大不了整个磁盘GG的心态,又开始升级服务器系统了。于是,小喵在键盘上敲下了

sudo rm -rf /

啊呸。是小喵把重要资料都转移到了数据盘以后,清空了系统盘。然后给系统盘换上了Ubuntu 16.04的镜像。于是一个干净的系统就诞生了。本来按照正常流程,小喵接下来需要安装apache和mysql。但是为了以后维护偷懒方便,小喵决定尝试一下docker。而这也开启了小喵的探(作)索(死)之旅。

安装 && `Hello World’

Docker的安装很简单,官方文档中介绍了各种平台下的安装方法。除此之外,阿里云还对自家的ecs云服务器提供了单独的安装脚本。安装完成之后,最好还配置一下Docker加速镜像,阿里云有详细的文档介绍如何配置。

安装好docker之后,启动终端,执行

1
$ docker run hello-world

如果看到以下输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/

则表示Docker安装成功。

基本概念

镜像

上面的命令中,hello-world代表一个镜像(image)。在Docker中,一个镜像代表一个打包好的程序。hello-world所打包好的程序就是显示上面的字符串(从`Hello from Docker!’开始)。

容器

正在运行的镜像或者已经完成运行的镜像称为容器(container)。镜像和容器的关系有点类似于类和实例。大家可以自行体会。
这个时候如我我们运行

1
$ docker ps -a

则可以看到类似于下面的输出

1
2
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
3f8f46156194 hello-world "/hello" 14 minutes ago Exited (0) 15 minutes ago musing_montalcini

如果你执行了很多次上面的hello-world命令的话,则可以看到多个容器。由于hello-world镜像的功能仅仅是打印字符,然后退出,所以容器的状态应该都是退出状态。
使用

1
$ docker rm <container id> 或者 <container name>

可以删除容器。我们可以使用这个命令把已经结束运行的hello-world容器都删除。

docker仓库

我们再仔细看一下hello-world的输出,在`Hello from Docker!’之前。还输出了一些信息。这是因为第一次创建hello-world容器时,本地还没有hello-world的镜像。这时,Docker会从Docker仓库下载hello-world镜像。如果我们之前配置了加速服务器,则会从加速服务器下载,否则会从Docker的官方服务器下载。这时,如果再用docker run命令创建一个hello-world的容器的话,则不会从服务器下载镜像,也就没有对应的输出了。


> TO BE CONTINUED …