What is Docker?
Docker是一个开源的应用容器(Container)引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任意流行的linux机器上。
Docker是一个重新定义了程序开发测试、交付和部署过程的开放平台(Platform)。
小结:
- Docker的英文本意是“搬运工”
- 作为技术栈,Docker搬运的是集装箱(container),集装箱里装的是任意类型的App,开发者通过docker可以将App变成一种标准化的、可移植的、自管理的组件,可以在任何主流系统中开发、调试和运行。它不依赖于任何语言、框架或系统
- 目标:实现轻量级的操作系统虚拟化解决方案
- Slogan:Build once,Run anywhere
- 基础:Linux Containers(LXC)
- Go语言实现
- Open source,Apache 2.0协议
Docker 简介
Docker底层实现
Docker底层的核心技术包括Linux上的Namespace(命名空间),Cgroups(控制组,control groups),UFS(union file system)和Container format(容器格式)
大家虽然都共用一个内核和某些运行时环境(例如一些系统命令和系统库),但是彼此却看不见,都以为系统中只有自己的存在。这种机制就是容器(Container),利用Namespace(命名空间)来做权限的隔离控制,利用Cgroups(控制组,control groups)来做资源分配。
Namespace实现资源隔离
Cgroups实现资源分配
- Linux内核机制,提供系统资源管理框架
- 作用:
- 资源限制
- 优先级分配
- 资源统计
- 任务控制
Docker三大核心
- 镜像Image
- 容器Container
- 仓库Repository
a. Image(镜像)
文件的层次结构,以及包含如何运行容器的元数据, Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上。
Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接实现。
b. Container(容器)
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境,Docker 利用容器来运行应用。
c. Repository(仓库)
仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为public registry和private registry
目前,最大的公开仓库是 Docker Hub(docker公司运营),存放了数量庞大的镜像供用户下载。
Docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个image时候,只需要从仓库上pull下来即可。
Docker结构
- Docker使用C/S结构
- Docker client和Docker daemon(守护进程)进行交互。Docker daemon负责对docker container的创建,运行,构造和分发等操作
- Docker client和Docker daemon可以运行在同一系统上,或者可以使用docker client连接远程的docker daemon
- Docker client和Docker daemon使用REST API通信,通过UNIX套接字或网络接口进行通信
Docker通常应用场景
- web应用的自动化打包和发布
- 自动化测试和持续集成、发布
- 在服务型环境中部署和调整数据库或其他的后台应用
- 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的SaaS或PaaS或ZaaS环境
Docker应用
docker 安装
多种安装方式
- Install using the repository
- Install from a package
- Install using the convenience script
具体安装步骤参考官网https://docs.docker.com/get-started/。注:Linux安装最后需要无需使用sudo来运行docker。
docker 使用
- $ service docker start ------Docker守护进程
- $ docker run hello-world ------Docker下载打印镜像
- $ docker images ------查看所有镜像
- $ docker run -i -t ubuntu ------自下载和启动Ubuntu容器
docker 常用命令
- $ docker images ------查看镜像
- $ docker run ------通过image启动container,可加更多参数
- $ docker ps ------查看running 中的container
- $ docker ps -a ------查看所有状态的container
- $ docker stop ------停止正在运行的container
- $ docker restart ------重启container
- $ docker rm ------删除container
- $ docker rmi ------删除镜像
- $ docker logs ------查看container log,可添加更多参数
注:docker 可允许通过外部访问容器端口方式来提供网络服务 -p 参数来指定端口映射
eg:$ docker run -d -p 80:8080 -p 50000:50000 jenkins/jenkins:lts
浏览器访问本地localhost:80或局域网内访问本机IP:80,可访问jenkins服务
docker volume(数据卷)
docker volume是提供一个或多个容器使用的特殊目录。
- 进程和数据的分离
- 实际保存在容器之外,从而允许在不影响数据的情况下销毁、重建、修改、删除容器
- 用于数据持久化
- 数据卷的使用,类似Linux下对目录或者文件进行mount操作
- 数据卷的共享,可以在多个容器之间共享数据卷
参数 -v 或 --volume 挂载数据卷
eg:$ docker run -d -p 80:8080 -9 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts
将容器中的/var/jenkins_home挂载到本地磁盘上
其他命令
- $ docker update[OPTIONS] CONTAINER [CONTAINER...] ------更新容器的一些配置参数
- $ docker exec [OPTIONS] CONTAINER COMMAND [ARG...] ------在running状态中的container执行命令
docker first App
Docker workflow
1. 本地新建一个test.py文件,内容如下:
print "Hello World!"
2. 本地可通过python运行该文件
$ python test.py
3. 在统计目录下,新建Dockerfile文件,内容如下:
FROM python:2.7-alpine
ADD . /dockertest
CMD ["python","/dockertest/test.py"]
$ ls ,可找到dockerfile test.py
4. 通过docker build打包
$ docker build -t .myfirstapp:10
5. docker images 查看该image
$ docker images 会产生image ID
6. 通过docker run运行该image
$ docker run [image ID]