Docker中,容器是独立运行的一个或一组应用,以及应用运行的环境;对应传统的虚拟化,虚拟机可以理解为模拟操作系统和运行在上面的应用。
启动容器
启动容器一般有两种方式,一种是新建容器并启动,一种是将终止状态的容器重新启动,Docker容器非常的轻量级,能够很好的支持用户随时删除和创建容器。
新建并启动容器
docker使用docker run命令来新建并启动容器,如:
例如如下命令表示输出一个HelloWorld,之后终止容器。
[root@legaoyun10514 ~]# docker run centos:7.2.1511 bin/echo 'helloworld'
helloworld
|
下面是新建并启动一个容器,包含bash终端,允许用户进行交互
[root@legaoyun10514 ~]# docker run -i -t centos:7.2.1511 bin/bash
[root@b3dbe17e8ce4 /]# uname -a
Linux b3dbe17e8ce4 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@b3dbe17e8ce4 /]# cat /proc/version
Linux version 3.10.0-862.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Fri Apr 20 16:44:24 UTC 2018
[root@b3dbe17e8ce4 /]#
|
其中-i表示让容器的标准输入保持打开,-t表示让docker分配一个伪终端给容器,并绑定到容器的标准输入上
docker run命令的执行步骤是:
- 检查本地是否存在镜像,如果没有从共有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读镜像外面挂在一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个IP地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
启动已终止容器
可以利用docker start命令,将一个已终止容器启动运行。
容器的核心是所执行的应用程序,所需要的资源都是应用程序所必须的,除此之外没有其他资源占用,可以在伪终端中利用top或者ps命令查看容器中的进程信息。
[root@b3dbe17e8ce4 /]# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
20 pts/0 00:00:00 ps
|
可以看到容器中只运行了bash应用,所以docker的虚拟化是非常轻量级的,对资源的利用率非常高。
使用docker ps命令可以查看docker容器列表,其中
默认,不加参数表示,所有启动状态的容器
[root@legaoyun10514 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b3dbe17e8ce4 centos:7.2.1511 "bin/bash" 21 minutes ago Up 9 minutes blissful_proskuriakova
c8485a2e06bd centos:7.2.1511 "bin/bash" 24 minutes ago
|
使用 docker start启动已终止容器
[root@legaoyun10514 ~]# docker start c8485a2e06bd
c8485a2e06bd
|
后台(background)运行
一般情况下,需要docker容器在后台运行,而不是将容器的命令执行结果输出到宿主主机,后台运行docker容器可以通过-d参数来实现。
执行下面的命令,使用-d,和不适用-d的效果。
[root@legaoyun10514 ~]# docker run centos:7.2.1511 /bin/sh -c 'for i in `seq 100`; do echo $i; sleep 1; done'
1
2
3
4
5
… …
|
[root@legaoyun10514 ~]# docker run -d centos:7.2.1511 /bin/sh -c 'for i in `seq 100`; do echo $i; sleep 1;
48df4126c4a42fb92154812528697ce7438f28f00e669a95e8f4095958736b5d
|
后台运行的容器,可以通过docker logs [容器id]命令来查看容器命令的执行结果,如:
[root@legaoyun10514 ~]# docker logs 48df4126c4a4
1
2
3
4
… …
|
终止容器
使用docker stop来终止一个运行中的容器,如:
[root@legaoyun10514 ~]# docker stop b3dbe17e8ce4
b3dbe17e8ce4
|
当docker容器中的应用程序终结时,docker容器也会终结,如只启动/bin/bash终端的容器,当exit或者ctrl+d终结时,容器终止。
docker restart可以重新启动一个容器
进入容器
使用docker run -d容器启动的docker容器,可以使用docker attach命令或者nsenter命令进入容器,进行操作。
attach命令
[root@legaoyun10514 lot]# docker run -itd centos:7.2.1511
f37a4155b59a5814e80f05c6f69876b8c4931bc4d5478084698b14c314ad32ad
[root@legaoyun10514 lot]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f37a4155b59a centos:7.2.1511 "/bin/bash" 4 seconds ago Up 3 seconds relaxed_goldwasser
[root@legaoyun10514 lot]# docker attach relaxed_goldwasser
[root@f37a4155b59a /]# uname -a
Linux f37a4155b59a 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
|
attache命令使用时是有弊端的,当多个终端同事attach到一个容器中的时候,所有的窗口都会同步显示,当某个窗口的应用阻塞是,所有的终端也都会阻塞。
nsenter命令
通过-d参数启动容器后,根据容器id查询容器信息,容器信息中包含容器的进程ID
[root@legaoyun10514 lot]# docker inspect ebc3700aa8b1 | grep Pid
"Pid": 28210,
"PidMode": "",
"PidsLimit": 0
|
通过这个进程id就可以连接到容器中去
[root@legaoyun10514 lot]# nsenter --target 28210 --mount --uts --ipc --net --pid
[root@ebc3700aa8b1 /]#
|
导入导出容器
导出容器
使用docker export命令导出容器到本地文件系统,导出的文件称为容器的快照
[root@legaoyun10514 lot]# docker export 6e8941b320c4 > centos.tar
[root@legaoyun10514 lot]# ls
centos.tar
[root@legaoyun10514 lot]#
|
导入容器快照
使用docker import命令导入本地快照为镜像,并制定镜像标签
[root@legaoyun10514 lot]# docker import - testimport/centos < centos.tar
sha256:55ce6d23ccf360444a1c5e7d610ac03b401281544c4a6b9c21d9866d528b628d
[root@legaoyun10514 lot]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
testimport/centos latest 55ce6d23ccf3 7 seconds ago 195MB
|
使用docker load,docker import,docker save,docker load命令的区别:
- docker import可以重新指定镜像的名字,docker load不可以
- docker export是保存容器的当前状态,会丢失历史数据和元数据
- docker save用于持久化镜像,不会丢失历史数据和元数据
- docker load用于导入镜像,不能指定镜像的名称
删除容器
可以使用docker rm来删除一个处于终止状态的容器,但是不能删除运行状态的容器,如
[root@legaoyun10514 lot]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e8941b320c4 centos:7.2.1511 "/bin/bash" 11 minutes ago Up 11 minutes zen_mirzakhani
ebc3700aa8b1 centos:7.2.1511 "/bin/bash" 21 minutes ago Exited (0) 11 seconds ago eager_roentgen
[root@legaoyun10514 lot]# docker rm zen_mirzakhani
Error response from daemon: You cannot remove a running container 6e8941b320c4d8a833944888bf421b07deba49d6dc8cdac0293cc7f1d7e91895. Stop the container before attempting removal or force remove
[root@legaoyun10514 lot]# docker rm eager_roentgen
eager_roentgen
[root@legaoyun10514 lot]#
|
如果要删除运行状态的容器,需要使用docker rm -f 命令来删除
清理所有处于终止状态的容器
删除所有终止状态的容器
docker rm $(docker ps -a -q)
删除所有容器
docker rm -f $(docker ps -a -q)
(完)