Docker容器技术简介
谈到Docker,大家都会想到容器技术,那么容器是什么?生活中的书包,柜子,更形象的就如Docker的Logo图:集装箱。
在技术领域也有一些容器,如各种编程语言都提供的集合数据结构。Map,Set,List,Queue,Heap。各种WebContainer,Tomcat。
而Docker是Linux的一种容器技术,底层利用CGroup。
容器有哪些特性:
提供一种标准,如Docker Logo图。
给上层工具提供标准化的操作方式,屏蔽细节。
包装运输
应用管理和调度
Linux容器技术的演进:可参考A Brief History of Containers: From the 1970s to 2017
2000: FreeBSD Jails
2001: Linux VServer
2004: Solaris Containers
2005: Open VZ (Open Virtuzzo)
2006: Process Containers
2008: LXC
2011: Warden
2013: LMCTFY
2013: Docker
2017: Container Tools Become Mature,容器工具变得成熟
K8S成为容器管理编排的标准
Docker介绍
Enterprise Container Platform for High-Velocity Innovation Securely build, share and run any application, anywhere
企业级的容器平台来进行高速的创新,更加安全的构建,共享,运行任何应用,任何地点。
Docker与现有应用技术对比:
对比维度 | 现状 | Docker |
---|---|---|
安装包 | War/Jar RPM/DEB | Image,Image Layer |
运行环境 | JVM,PHP,Python,Nodejs | Image/Image Layer |
进程启动方式 | Web Container,Script | Image Entrypoint/CMD |
进程资源隔离 | —— | Namespace,CGroup |
端口冲突 | 指定不同端口 | 一个容器一个进程 |
日志输出 | 文件 | 文件(需要实时重写入宿主机) |
安装包仓库 | Maven, NPM,Pip | Docker Registry |
Docker架构
Docker使用client-server架构,client与Docker的deemon进程进行通信,Daemon进程负责构建,运行,分发Docker 容器。
Client与Daemon可以运行在相同或不同的服务器上,采用REST,或者Unix Socket或者网络接口进行通信。
Daemon: 监听某个Docker API请求,管理Docker的Images,Containers,网络,或者存储,不同daemon之间也可以进行通信。
Client:用户与Docker进行交互的主要方式
Registry:存储Docker镜像,Dockerhub是官方提供的镜像存储服务,存储几十万种镜像
Docker Image生命周期
通过Dockerfile来构建镜像,Dockerfie就是普通的文本文件
通过save命令可以把镜像备份成一个文件,通过load从备份的文件恢复为镜像,save与load互补
通过tag对镜像打标签,类似git的tag,标记镜像的版本号
通过pull从registry拉取镜像,通过push推送到远程registry
通过run来根据镜像启动一个容器,对容器进行commit生成一个新的镜像。
容器可以启动,停止,重启
Docker的提供了很多命令行管理接口:详情参考:docker command-line interfaces (CLIs)
Dockerfile
刚才提到通过Dockerfile可以创建Docker镜像,而Dockerfile就是普通的文本文件,在编写完Dockerfile之后,运行,构建成Image之后,可以再使用Docker RUN来运行镜像。
// 构建镜像 docker build <docker-file>
Dockerfile解释参考:Dockerfile Reference
给一个小例子:
# 基本镜像 FROM centos # 维护者 MAINTAINER aihehe123@gmail.com # 添加 nginx-1.12.2.tar.gz 到 /usr/local/src ADD nginx-1.12.2.tar.gz /usr/local/src # 在容器内运行命令,解决依赖关系 RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel RUN useradd -M -s /sbin/nologin nginx # 挂载主机的目录 ONBUILD VOLUME ["/data"] #切换目录 /usr/local/src/nginx-1.12.2 WORKDIR /usr/local/src/nginx-1.12.2 # 编译 nginx RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install # 设置环境变量 ENV PATH /usr/local/nginx/sbin:$PATH # 暴露端口 EXPOSE 80 # 容器启动的入口点 ENTRYPOINT ["nginx"] CMD ["-g"]
DockerCompose
Docker-compose是一个定义和运行多个Docker应用的工具,你可以使用YMAL文件来配置你的服务,然后使用docker-compose命令,创建和启动所有你配置的的服务。compose可以在任何工作环境中使用,生产环境,开发环境,持续集成等等。
使用compose一般包括三个步骤:
使用
Dockerfile
定义App的环境,以便于可再次重复利用在
docker-compose.yml
文件中定义服务,以便于多个Docker应用可以协作起来最后,运行
docker-compose up
,然后compose回启动和运行整个App。
我们来演示下DockerCompose的使用
创建目录
mkdir composetest cd composetest
创建app.py文件,python文件有严格的行缩进关系。如果缩进不一样会报错。
from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host='redis', port=6379) @app.route('/') def hello(): count = redis.incr('hits') return 'Hello From Aihe! I have been seen {} times.\n'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
创建另外一个依赖文件
requirements.txt
,python的依赖关系。
flask redis
创建Dockerfile文件
内容如下
FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"]
在compose文件定义服务
文件内容如下
version: '3' services: web: build: . ports: - "5000:5000" volumes: - .:/code redis: image: "redis:alpine"
这个文件包含两个服务,web
与redis
web服务
Build
使用Dockerfile来构建镜像Ports
主机转发5000端口到容器对应的5000端口Volumes
挂载当前目录到容器内的/code目录下,我们可以直接修改本地文件,然后容器内会立即生效
构建和运行app
在当前目录下运行docker-compose up
docker-compose up
在浏览器中输入
http://localhost:5000/
Note:
在配置的过程中,可能compose文件配置有错误,到底第一次无法启动服务。这时候重新构建服务。
docker-compose build --no-cache
最后
本文首先从容器开始讲起,介绍了容器的历史,后引入Docker,讲解其架构与其基本命令,然后对其关键的Image进行讲解。
再使用中,我们很少单独的使用Docker来操作,最后我们讲解了Docker Compose以及演示了如何使用DockerCompose。
希望对大家有所帮助
参考
注:
本文独家发布自金蝶云社区