Docker容器技术揭秘原创
金蝶云社区-艾贺521
艾贺521
5人赞赏了该文章 392次浏览 未经作者许可,禁止转载编辑于2019年06月26日 22:08:54

Docker容器技术简介

谈到Docker,大家都会想到容器技术,那么容器是什么?生活中的书包,柜子,更形象的就如Docker的Logo图:集装箱。

image.png

在技术领域也有一些容器,如各种编程语言都提供的集合数据结构。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/DEBImage,Image Layer
运行环境JVM,PHP,Python,NodejsImage/Image Layer
进程启动方式Web Container,ScriptImage Entrypoint/CMD
进程资源隔离——Namespace,CGroup
端口冲突指定不同端口一个容器一个进程
日志输出文件文件(需要实时重写入宿主机)
安装包仓库Maven, NPM,PipDocker 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 overview


Docker Image生命周期

image.png

  • 通过Dockerfile来构建镜像,Dockerfie就是普通的文本文件

  • 通过save命令可以把镜像备份成一个文件,通过load从备份的文件恢复为镜像,save与load互补

  • 通过tag对镜像打标签,类似git的tag,标记镜像的版本号

  • 通过pull从registry拉取镜像,通过push推送到远程registry

  • 通过run来根据镜像启动一个容器,对容器进行commit生成一个新的镜像。

  • 容器可以启动,停止,重启


Docker的提供了很多命令行管理接口:详情参考:docker command-line interfaces (CLIs)

1560864471042.png


1560866118527.png

1560866198303.png


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一般包括三个步骤:

  1. 使用Dockerfile定义App的环境,以便于可再次重复利用

  2. docker-compose.yml文件中定义服务,以便于多个Docker应用可以协作起来

  3. 最后,运行docker-compose up,然后compose回启动和运行整个App。


我们来演示下DockerCompose的使用

  1. 创建目录

mkdir composetest
cd composetest
  1. 创建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)


  1. 创建另外一个依赖文件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"

这个文件包含两个服务,webredis web服务

  • Build 使用Dockerfile来构建镜像

  • Ports 主机转发5000端口到容器对应的5000端口

  • Volumes 挂载当前目录到容器内的/code目录下,我们可以直接修改本地文件,然后容器内会立即生效

构建和运行app
  1. 在当前目录下运行docker-compose up

docker-compose up
  1. 在浏览器中输入http://localhost:5000/


Note:

在配置的过程中,可能compose文件配置有错误,到底第一次无法启动服务。这时候重新构建服务。

docker-compose build --no-cache


最后

本文首先从容器开始讲起,介绍了容器的历史,后引入Docker,讲解其架构与其基本命令,然后对其关键的Image进行讲解。

再使用中,我们很少单独的使用Docker来操作,最后我们讲解了Docker Compose以及演示了如何使用DockerCompose。


希望对大家有所帮助


参考


注:

本文独家发布自金蝶云社区






赞 5