我是架构师张飞洪,钻进浩瀚代码,十年有余,人不堪其累,吾不改其乐。如果你和我的看法不一样,请关注我的头条号,我们一起奇闻共赏,疑义相析。
接下来来讲解Docker三大组件之一的容器,如果说镜像是静态的只读文件,那么容器就是带有运行时需要的可写文件层。也可以这样理解,镜像是对象的模板——类,容器是类生成的对象,镜像只有一个,对象可以有很多个。
创建容器
1.新建容器
docker create -it ubuntu:lastest
该命令创建的容器处于停止状态,可以使用docker start启动。
2.启动容器
docker start 容器id
3.创建并启动容器
等价于docker create,再执行docker run
下面的指令,输出一个hello world后,自动终止。
docker run ubuntu /bin/echo 'hello'
该指令背后一系列别隐藏操作,包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
- 利用镜像创建一个容器,并启启动该容器;
- 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的的网桥接口中,桥接一个虚拟接口口到容器中;
- 从网桥的地址池配置一个IP地址给容器, 口执行用户指定的应用程序;
- 执行完后,容器被自动终止。
下面的命令启动一个bash终端,允许用户进行交互:
docker run-it ubuntu:14.04 /bin/bash
其中,-t 选项让docker分配一个伪终端并绑定到容器的标准输入上,-i 则让容器的标准输入保持打开。 更多的命令选项可以通过 man docker - run命令来查看。
在容器内用ps命令查看进程,可以看到只运行了bash应用,并没有运行其的进程。
用户可以按ctrl+d或输入exit命令来退出容器。
4.守护态运行
更多的时候,需要让docker容器在后台以守护态形式运行。此时通过添加 -d 参数来实现。
下面的命令会在后台运行容器:
docker ubuntu /bin/sh -c "while true; do echo hello world; sleep 1;done"
ce554267d7a4c34eefc92c5517051dc37b918b588736d0823e4c846596b04d83
容器启动后会返回一个唯一的id。
此时,要获取容器的输出信息,可以用docker logs ce5
终止容器
docker stop ce5
终止的容器通过 docker start重新启动
docker restart 会将运行容器先终止,然后重新启动
进入容器
在使用-d参数时,容器启动后会进人后台,用户无法看到容器中的信息,也无法进行操作。
这个时候如果需要进入容器进行操作,有多种方法,包括使用官方的 attach或exec命令,以及第三方的 nsenter工具等。
1.attach
docker run -it ubuntu
docker ps
docker attach 容器id
2.exec[推荐]
例如,进人到刚创建的容器中,并启动bash
docker exec -it 453698741 /bin/bash
root @453698741: /#
可以看到,一个 bash终端打开了,在不影响容器内其他应用的前提下,用户户可以很容易与容器进行交互。
过指定 -it 参数来保持标准输入打开,并且分配一个伪终端。
该操作是最为推荐的方式!
