Docker是一个工具,可以帮助解决安装、拆卸、升级、分发和管理软件等常见问题。而这一切都是通过容器所实现的。使用Docker运行一个软件其实是在一个容器内运行,容器可以隔离所有的资源,做到更可靠的安全性。
Docker与传统的虚拟机不同,虚拟机也可以提供需要的资源隔离,但是虚拟机需要维持一个操作系统的副本,带来了显著的资源开销。而Docker不使用硬件虚拟化,运行在Docker容器中的程序接口直接和Linux内核进行交互,没有额外的中间层,减少了资源开销。容器可以理解为将原有的应用程序进行包装的外壳,每个容器内的程序只能访问自己壳内的东西。
使用Docker创建的容器运行在用户空间中,每一个运行的容器只能访问属于自己容器内的内存空间和资源。容器是通过镜像进行生成的。镜像就是Docker通过打包和分发的软件,它是一个容器中运行程序的所有文件的捆绑快照,一个镜像可以生成多个容器,而每个容器之间是不能进行文件共享的。镜像在Docker生态系统中是可交付的基本单位。
Docker可以使得机器内的软件组织更加有序,同时提高了可移植性,保护了机器安全。
Docker安装地址:
https://docs.docker.com/installation/
Docker容器的其中流程:
每次使用docker run xxx
启动一个容器时,Docker首先在本地寻找镜像xxx
,如果安装了则直接启动镜像,否则Docker将在Docker Hub上查找镜像xxx
,如果在Docker Hub上找到了镜像xxx
,下载镜像xxx
并在本机中安装,Docker创建一个新容器并启动该程序。
启动容器
- 使用Docker启动一个Nginx容器:
docker run --detach --name web nginx:latest
首先在Docker Hub上的Nginx仓库下载、安装nginx:latest
镜像,然后运行软件。--detach
选项表示在后台启动该程序,程序启动但不会附着到终端。这样的进程成为守护式进程,适合那些在后台静默运行的程序。可以缩写为-d
。--name
选项对已知值的进程进行重写。 - 运行一个交互式容器:
docker run --interactive --tty --link web:web --name web_test busybox:latest /bin/sh
通过Docker运行的交互式容器,将部分终端绑定到正在运行的容器的输入或输出上。--interactive
选项告诉Docker保持标准输入流对容器开发。--tty
选项告诉Docker为容器分配一个虚拟终端,可以允许发送信号给容器。可以缩写为-it
。同时运行一个叫sh
的shell程序,这样就可以在容器内运行任何程序。 - 检查正在运行的容器:
docker ps
- 查看每个容器的日志:
docker logs xxx
容器的PID命名空间
每一个运行的程序或进程,在Linux机器上都有一个唯一编号,叫做进程表示符(PID)。一个PID命名空间是一组识别进程的数字,Linux可以创建多个PID命名空间,每个命名空间都有一套完整的PID(每个PID命名空间都将包含自己的PID1、PID2等等)。为每个容器创建一个命名空间是Docker的关键特征。
如果没有PID命名空间,容器无法区分其他主机或容器上运行的具有相同ID的空间。可以通过命令docker create
(该容器是被停止状态创建的)或docker run
中设置--pid=host
来尝试创建没有PID命名空间的容器。
容器标识
Docker会给每个容器分配一个唯一的标识符,这一个16进制编码的1024位数字。当容器以守护模式启动时,其标识符将被打印到终端,这个标识符可以在任何命令中使用。这个ID在极高的概率下是唯一的,不空能发生冲突,所以ID的前十二个字符在同一个计算机上发生冲突几乎不可能,所以大多数Docker界面使用前12个字符标识容器。
- 在shell命令中,可以将结果分配给一个shell变量,以后再次使用:
CID=$(docker create nginx:latest)
echo $CID
- 获得最后创建的那个容器的截断ID:
CID=$(docker ps --latest --quite)
或CID=$(docker ps -l -q)
容器状态
Docker容器有四个状态:运行中、暂停中、已退出和重新启动中。
构建与环境无关的系统
- 只读文件系统
只读文件系统可以保证容器不能更改它所包含的文件产生的信息。同时,容器中的攻击者无法破坏文件。--read-only
标志可以标示一个容器是只读文件系统。
docker run -d --name wp --read-only Wordpress:4
- 环境变量的注入
环境变量是通过其执行上下文提供给程序的健值对。可以在改变一个程序的配置时,无需修改任何文件或更改用于启动该程序的命令。Docker提供了一个机制,可将环境变量注入到一个新的容器中。使用命令显示当前执行上下文(终端)中的所有环境变量。
docker run --env busybox:latest env
- 存储卷
建立持久化容器。
网友评论