介绍
根据 wikipedia 中的介绍
Docker 是一个开源项目,让应用程序部署在软件容器下的工作可以自动化进行,借此在linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。
Docker 利用 Linux 核心中的资源分脱机制,来创建独立的软件容器。这可以在单一Linux实体下运作,避免启动一个虚拟机招成的额外负担。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括了进程树,网络,用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU,存储器,block I/O与网络。Docker是用能力打包应用程序及虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序可以在任何地方运行,无论是公有云,私有云,单机等等。
原理
docker 是利用Linux的内核虚拟化技术(LXC),提供轻量级的虚拟化,以便隔离进程和资源。LXC不是硬件的虚拟化,而是Linux内核级别的虚拟化,相对于传统的虚拟机,节省了很多硬件资源。
NameSpace
LXC是利用内核namespace技术,进行进程隔离。其中pid, net, ipc, mnt, uts等,namespace将container的进程,网络,消息,文件系统和hostname隔离开。
Control Group
LXC利用的宿主机共享的资源,虽然用namespace进行隔离,但是资源使用没有受到限制,这里就需要用到Control Group技术,对资源使用进行限制,设定优先级,资源控制等等。
Docker优点
简化环境管理
传统的软件开发与发布环境复杂,配置繁琐,经常会出现代码在开发环境可以运行,一旦部署到服务器上就运行不了。这个问题很常见,开发环境,测试环境,生产环境,每个环节都有可能出现这样那样的问题,如果能够在各个环境中实现一键部署,就会方便很多,docker 彻底解决了这个问题。
虚拟化更加轻量级
说到容器,说到虚拟化,很多人总会想到虚拟机,想到VMware,VirtualBox等工具,不同于这些虚拟技术,docker 虚拟化更加轻量级,传统的虚拟机都是先虚拟出一个操作系统,然后在操作系统上完成各种各样的配置,这样并不能充分的利用物理机的性能,docker 则是一种操作系统级别的虚拟技术,它运行在操作系统之上的用户空间,所有的容器都共用一个系统内核甚至公共库,容器引擎提供了进程级别的隔离,让每个容器都像运行在单独的系统之上,但是又能够共享很多底层资源,因此docker 更为轻量,快速和易于管理。
docker 应用场景
- 加速本地开发
- 自动打包和部署应用
- 创建轻量,私有的PaaS环境
- 自动化测试和持续集成/部署
- 部署并扩展Web应用,数据库和后端服务器
- 创建安全沙盒
- 轻量级的桌面虚拟化
docker 三大核心组件
- 镜像
镜像是一个只读的静态模板,它保存了容器需要环境和应用的执行代码,可以将镜像看成是容器的代码,当代码运行起来之后,就成了容器,镜像和容器的关系也类似于程序和进程的关系。 - 容器
容器是一个运行时环境,是镜像的一个运行状态,它是镜像执行的动态表现。 - 库
库是一个特定的用户存储镜像的目录,一个用户可以建立多个库来保存自己的镜像。
docker 相关技术
- 隔离性
- 可度量性
- 移植性
- 安全性
环境准备
操作系统:CentOS7.6.1810
软件源:阿里云镜像
- 安装依赖
docker 依赖是系统必不可少的工具,需要提前安装。
yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加软件源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker-ce
yum clean all yum makecache fastyum -y install docker-ce
- 启动服务
systemctl start docker
- 查看安装版本
docker version
简单使用docker
- 代码目录
app.py Dockerfile requirement.txt
- app.py
#-*- coding:utf-8 -*-
import os
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
- requirements.txt
Flask==1.1.1
- Dockerfile
FROM python:3.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "/code/app.py"]
FROM
:Dockerfile中一个非常重要的命令,作用是指定一个基础镜像来进行构建进程。比如上面指定了python3.7作为基础镜像,后续的一切操作都会以这个镜像作为基础来进行定制。FROM必须是Dockerfile首个命令。
ENV
:修改path,即增加/usr/local/bin
这个环境变量。
ADD
:将本地代码放到虚拟容器中,它有两个参数,第一个是代表本地当前路径;第二个是代表虚拟容器中的路径。即将本地项目的所有内容放到虚拟容器的/code目录下,以便在虚拟容器中运行代码。
WORKDIR
:指定工作目录,也就是刚才的/code,在虚拟容器中的目录。
RUN
:执行某些环境准备工作,docker容器中只有python3.7的环境,还需要python的库,这里安装python库
CMD
:运行项目的命令行命令。
创建镜像
docker build -t mydemo_img .
mydemo_img
:创建的镜像名称。
.
:表示当前目录。
docker images :查看镜像是否创建成功。
运行镜像
docker run -it -p 8000:5000 --name mydemo mydemo_img
-it
:表示交互时终端的容器,非启动后立刻结束的容器
-p 8000:5000
:表示将docker的8000端口,映射到Linux虚拟机的5000端口。
--name mydemo
:给容器取一个名字,可以省略
mydemo_img
:容器是用哪个镜像启动(一个容器,必须依赖一个镜像启动)
常用命令
Ctrl + p + q
:退出容器,但不关闭容器。
注意:直接输入
exit
会退出且关闭容器,工程就stop了。或者Ctrl+c
,会报错KeyboardInterrupt,工程也stop了。
docker ps
:查看正在运行的容器。
docker ps -a
:查看所有容器。
docker start 容器ID
:启动已经关闭的容器。
docker attach 容器ID
:重新进入容器,查看程序打印的日志。
Ctrl+d
:退出容器且关闭,docker ps
也查看不到。
docker ps -a
:查看容器
docker images
:查看镜像
docker rm 容器ID
:删除容器
docker rmi 镜像ID/镜像名
:删除镜像
docker inspect 容器ID
:返回一个Json文件记录Docker容器的配置和状态信息
docker export 容器ID > update.tar
: 将容器导出到容器的镜像文件
docker import - 镜像名 < update.tar
:将容器的镜像文件创建一个新镜像
docker run -it 镜像名
:创建完成之后,生成并启动镜像的容器。
run_error.png注意:如果不行,报错:
Error response from daemon: No command specified
就在后面加 /bin/bash,然后进程code的package目录,手动启动程序:python server.py
docker save -o update1.tar update
:镜像保存为镜像文件(update是一个已经存在的镜像)docker load < update1.tar
:从镜像文件中生成一个新的镜像。
load_err.png有时可能会报错:
open /var/lib/docker/tmp/docker-import-559669842/bin/json: no such file or directory
用这个命令可以解决:
cat update1.tar | docker import - update1
:update1.tar 为镜像文件名称,update1为镜像名称。
网友评论