docker三大核心概念:仓库、镜像、容器
容器是一个可运行的实例,来自于不可读写的镜像。如果说虚拟机是一套完整的操作系统,和抛在上面的应用,那么docker容器就是一个能独立运行的应用和环境。
创建容器
# docker create -it centos:new (可以是id或tag)
0cfa01f903624613581413910eed796f111287520311e2284c8c00ef27ce3a23
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0cfa01f90362 centos:new "/bin/bash" 46 seconds ago Created prickly_sinoussi
-i 参数让docker分配一个伪终端并绑定到容器的stdin,-t则让容器的stdin保持开启。此命令创建的容器处于停止状态。
启动容器
使用docker start <id/tag>
启动容器。
#docker sart 0c
0c
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0cfa01f90362 centos:new "/bin/bash" About a minute ago Up 2 seconds prickly_sinoussi
上面的过程比较繁琐,可以一键创建并运行
用以下命令输出一个“hello”并退出容器:
# docker run centos /bin/echo "hello"
hello
和本地执行/bin/echo 'hello'
一样。
利用docker run创建容器的时候,后台的执行顺序:
- 检查本地是否有指定镜像,没有就下载
- 利用镜像创建容器,并启动容器
- 分配一个文件系统给容器,并在只读的镜像层外挂在一层可读写层
- 从宿主机网桥接口中桥接一个虚拟接口到容器中
- 从网桥的地址池配置一个ip给容器
- 执行用户的命令
- 执行完自动终止容器
那么怎样创建一个保持开启的容器呢?
下面的命令启动一个bash终端,并允许用户交互:
# docker run -it centos /bin/bash
[root@a95912722aa0 /]#
在此模式下,用户可以进行命令交互:
[root@a95912722aa0 /]# ls
anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@a95912722aa0 /]# ps
PID TTY TIME CMD
1 ? 00:00:00 bash
15 ? 00:00:00 ps
在这个容器中,只运行了bash,不会运行其他无关程序。
用户可以按Ctrl+D或者输入exit来退出容器。
当容器退出后,容器就从运行状态进入停止状态,因为容器运行的意义就是跑应用,停止应用就等于停止容器。
那如果我要创建一个容器,持续运行某个应用,怎么办?
让容器处于daemon状态,需要用-d
参数:
# docker run -dit centos /bin/bash
addac53c53c7242e9094dd8b77931f1a385f8c14225a055f414da0fc6ba47510
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
addac53c53c7 centos "/bin/bash" About a minute ago Up About a minute lonely_perlman
可以看到,这容器已经在后台运行了,那要怎么样进入这个容器中呢?
后面会说到。
进入容器
上面创建的daemon容器,用户无法直接看到容器的输出信息,那么就得进入容器,有2种方法:
attach
attach是docker自带的命令,格式为:docker attach CONTAINER
# docker attach add
[root@addac53c53c7 /]#
exec命令(推荐)
此命令可以进入容器并执行命令,例如进入到刚刚创建的容器中,启动一个python界面:
# docker exec -it add /usr/bin/python
Python 2.7.5 (default, Nov 6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
退出当前应用就退出了容器,但是因为容器是一个daemon形式,所以查看docker ps:
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
addac53c53c7 centos "/bin/bash" 46 minutes ago Up 4 minutes lonely_perlman
它还是以bash的初始状态运行着。
容器停止、删除操作
经过上面的操作,其实很容易推出以下命令:
docker stop <id> # 容器停止
docker restart <id> #容器重启
docker rm <id> #容器删除(必须在容器停止之后)
这些都是基本格式,其中的参数当时用到了可以再查。