docker初探

好吧,其实这个标题是假的。
我在不知不觉中已经用了很多次docker了。
但是docker的构建,编译和运行大部分是同事完成的。

还有很多docker的知识我还不是很懂,所以打算借此机会学习一下。
会参考一些教程网站,例如:

  1. Docker入门教程(一)介绍
  2. Docker中文社区站-Docker入门教程

首先,运行任何"docker"(容器),都需要两个步骤:

  1. 构建镜像
  2. 运行容器

整个过程可以简单地理解为写代码打包(构建镜像),双击在本地运行(运行容器)。
构建镜像可以理解为"docker"(容器)是编译型语言,类似Java,C/C++,需要先编译。
其次,编译完的可执行文件需要双击才能运行,光编译完没啥用,除了拿来发布。

镜像有什么用呢,其实就是自己打包好的环境。
现在我的笔记本(win)就因为我之前瞎鼓捣些项目,有些环境又不是很完善,整个环境有些乱了。
鼓捣完了之后,又不舍得卸载,而且还卸不干净。

如果你把你搭建好的环境打包放出去给别人下载,其他人就不用重复踩你踩过的坑了。
而且随用随下,用毕即弃。是不是听起来好像一次性餐具?但是这是电子世界,你丢弃一次性01串不会造成污染(用电的不算)。

好了,说了那么多废话,继续回到话题上来。

现在我们就先不讲构建镜像了。我们先用别人构建好的镜像。
先跑这个命令下载镜像:docker pull ubuntu
我此时下载的镜像是这样的,随版本更新,以下hash值会不一样。

Using default tag: latest
latest: Pulling from library/ubuntu
75c416ea735c: Pull complete
c6ff40b6d658: Pull complete
a7050fc1f338: Pull complete
f0ffb5cf6ba9: Pull complete
be232718519c: Pull complete
Digest: sha256:a0ee7647e24c8494f1cf6b94f1a3cd127f423268293c25d924fbe18fd82db5a4
Status: Downloaded newer image for ubuntu:latest

docker images就可以看到你下载过的镜像。

REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
ubuntu                 latest              d355ed3537e9        14 hours ago        119 MB

好,我们现在让它跑起来:docker run -it ubuntu bash
可以看到命令行变成root@4d3f61c27b6c:/#了。
这个时候,你可以敲任何ubuntu命令了。

这条命令的意思是,在ubuntu这个镜像上run(运行)bash这条命令。
-it呢,等于-i -t
-i就是Keep STDIN open even if not attached,就是交互模式。
-t就是Allocate a pseudo-TTY,分配一个虚拟TTY?
-t参数模拟ssh登陆容器(这个描述应该不准确),然后用-i参数来接受来自用户的输入`。

我尝试了一下,如果只有-i参数,那它会啥都不输出。
虽然是交互模式,但是没有tty,所以输出内容不会传输过来到宿主机。
如果只有-t参数,虽然有输出,但是无法接收来自用户的输入。
但是-it(或者-ti)就即能接收用户的输入,也可以显示容器的输出(这个描述应该也不准确)。

你大概已经折腾了一天,该睡觉了吧?
在linux里敲exit就可以退出bash。

咦?那我明天也运行docker run -it ubuntu bash就好了吗?
你可以试试啊~进入linux后,你会发现你昨天做的改动都没有了。
机子名也变了。敲exit退出。

在宿主机(安装了docker的机子)敲docker ps -a就可以看到,我们刚刚运行的容器已经结束了。

λ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
0e152599996f        ubuntu              "bash"              45 seconds ago      Exited (0) 1 second ago                        naughty_wilson
4d3f61c27b6c        ubuntu              "bash"              3 minutes ago       Exited (0) 2 minutes ago                       happy_shockley

这里的-a表示all,不带-a的情况下,只会显示正在运行的容器。

如果要它一直运行下去的话怎么办?
这里就先留个问题给读者。(其实是我要睡觉了)

标签:none

仅有 1 条评论

  1. Kuiki Kuiki

    没错,开头的那个同事就是我

添加新评论