docker初探
好吧,其实这个标题是假的。
我在不知不觉中已经用了很多次docker了。
但是docker的构建,编译和运行大部分是同事完成的。
还有很多docker的知识我还不是很懂,所以打算借此机会学习一下。
会参考一些教程网站,例如:
首先,运行任何"docker"(容器),都需要两个步骤:
- 构建镜像
- 运行容器
整个过程可以简单地理解为写代码打包(构建镜像),双击在本地运行(运行容器)。
构建镜像可以理解为"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
的情况下,只会显示正在运行的容器。
如果要它一直运行下去的话怎么办?
这里就先留个问题给读者。(其实是我要睡觉了)
没错,开头的那个同事就是我
看的我热血沸腾啊https://www.ea55.com/
文章的确不错啊https://www.cscnn.com/
真棒!