1.如何创建一个安全的Docker基镜像

2.Golang项目部署3,容器部署

3.一文教您如何通过 Docker 快速搭建各种测试环境

4.超值一篇分享,Docker:从入门到实战过程全记录

alpine镜像时间_屏幕镜像时间

环境部署一直是一个很大的问题,无论是开发环境还是生产环境,但是 Docker

将开发环境和生产环境以轻量级方式打包,提供了一致的环境。极大的提升了开发部署一致性。当然,实际情况并没有这么简单,因为生产环境和开发环境的配置是完全不同的,比如日志等的问题都需要单独配置,但是至少比以前更加简单方便了,这里以

PHP 开发作为例子讲解 Docker 如何布置开发环境。

一般来说,一个 PHP 项目会需要以下工具:

Web 服务器: Nginx/Tengine

Web 程序: PHP-FPM

数据库: MySQL/PostgreSQL

缓存服务: Redis/Memcache

这是最简单的架构方式,在 Docker 发展早期,Docker 被大量的滥用,比如,一个镜像内启动多服务,日志收集依旧是按照 Syslog

或者别的老方式,镜像容量非常庞大,基础镜像就能达到 80M,这和 Docker 当初提出的思想完全南辕北辙了,而 Alpine Linux

发行版作为一个轻量级 Linux 环境,就非常适合作为 Docker 基础镜像,Docker 官方也推荐使用 Alpine 而不是 Debian

作为基础镜像,未来大量的现有官方镜像也将会迁移到 Alpine 上。本文所有镜像都将以 Alpine 作为基础镜像。

Nginx/Tengine

这部分笔者已经在另一篇文章 Docker 容器的 Nginx 实践中讲解了 Tengine 的 Docker 实践,并且给出了

Dockerfile,由于比较偏好 Tengine,而且官方已经给出了 Nginx 的 alpine 镜像,所以这里就用

Tengine。笔者已经将镜像上传到官方 DockerHub,可以通过

<code>docker pull chasontang/tengine:2.1.2_f</code>

获取镜像,具体请看 Dockerfile。

PHP-FPM

Docker 官方已经提供了 PHP 的 7.0.7-fpm-alpine 镜像,Dockerfile 如下:

FROM alpine:3.4

# persistent / runtime deps

ENV PHPIZE_DEPS \

autoconf \

file \

g++ \

gcc \

libc-dev \

make \

pkgconf \

re2c

RUN apk add --no-cache --virtual .persistent-deps \

ca-certificates \

curl

# ensure -data user exists

RUN set -x \

&& addgroup -g 82 -S -data \

&& adduser -u 82 -D -S -G -data -data

# 82 is the standard uid/gid for "-data" in Alpine

# ://git.alpinelinux.org/cgit/aports/tree/main/apache2/apache2.pre-install?h=v3.3.2

# ://git.alpinelinux.org/cgit/aports/tree/main/ligd/ligd.pre-install?h=v3.3.2

# ://git.alpinelinux.org/cgit/aports/tree/main/nginx-initscripts/nginx-initscripts.pre-install?h=v3.3.2

ENV PHP_INI_DIR /usr/local/etc/php

RUN mkdir -p $PHP_INI_DIR/conf.d

##<autogenerated>##

ENV PHP_EXTRA_CONFIGURE_ARGS --enable-fpm --with-fpm-user=-data --with-fpm-group=-data

##</autogenerated>##

ENV GPG_KEYS 1A4E8B7277C42E53DBA9C7B9BCAA30EA9C0D5763

ENV PHP_VERSION 7.0.7

ENV PHP_FILENAME php-7.0.7.tar.xz

ENV PHP_SHA256 9cc64a7459242c79c10e79d74feaf5bae3541f604966ceb600c3d2e8f5fe4794

RUN set -xe \

&& apk add --no-cache --virtual .build-deps \

$PHPIZE_DEPS \

curl-dev \

gnupg \

libedit-dev \

libxml2-dev \

openssl-dev \

sqlite-dev \

&& curl -fSL "://php.net/get/$PHP_FILENAME/from/this/mirror" -o "$PHP_FILENAME" \

&& echo "$PHP_SHA256 *$PHP_FILENAME" | sha256sum -c - \

&& curl -fSL "://php.net/get/$PHP_FILENAME.asc/from/this/mirror" -o "$PHP_FILENAME.asc" \

&& export GNUPGHOME="$(mktemp -d)" \

&& for key in $GPG_KEYS; do \

gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \

done \

&& gpg --batch --verify "$PHP_FILENAME.asc" "$PHP_FILENAME" \

&& rm -r "$GNUPGHOME" "$PHP_FILENAME.asc" \

&& mkdir -p /usr/src \

&& tar -Jxf "$PHP_FILENAME" -C /usr/src \

&& mv "/usr/src/php-$PHP_VERSION" /usr/src/php \

&& rm "$PHP_FILENAME" \

&& cd /usr/src/php \

&& ./configure \

--with-config-file-path="$PHP_INI_DIR" \

--with-config-file-scan-dir="$PHP_INI_DIR/conf.d" \

$PHP_EXTRA_CONFIGURE_ARGS \

--disable-cgi \

# --enable-mysqlnd is included here because it's harder to compile after the fact than extensions are (since it's a plugin for several extensions, not an extension in itself)

--enable-mysqlnd \

# --enable-mbstring is included here because otherwise there's no way to get pecl to use it properly (see s://github/docker-library/php/issues/195)

--enable-mbstring \

--with-curl \

--with-libedit \

--with-openssl \

--with-zlib \

&& make -j"$(getconf _NPROCESSORS_ONLN)" \

&& make install \

&& { find /usr/local/bin /usr/local/sbin -type f -perm +0111 -exec strip --strip-all '{}' + || true; } \

&& make clean \

&& runDeps="$( \

scanelf --needed --nobanner --recursive /usr/local \

| awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \

| sort -u \

| xargs -r apk info --installed \

| sort -u \

)" \

&& apk add --no-cache --virtual .php-rundeps $runDeps \

&& apk del .build-deps

COPY docker-php-ext-* /usr/local/bin/

##<autogenerated>##

WORKDIR /var//html

RUN set -ex \

&& cd /usr/local/etc \

&& if [ -d php-fpm.d ]; then \

# for some reason, upstream's php-fpm.conf.default has "include=NONE/etc/php-fpm.d/*.conf"

sed 's!=NONE/!=!g' php-fpm.conf.default | tee php-fpm.conf > /dev/null; \

cp php-fpm.d/.conf.default php-fpm.d/.conf; \

else \

# PHP 5.x don't use "include=" by default, so we'll create our own simple config that mimics PHP 7+ for consistency

mkdir php-fpm.d; \

cp php-fpm.conf.default php-fpm.d/.conf; \

{ \

echo '[global]'; \

echo 'include=etc/php-fpm.d/*.conf'; \

} | tee php-fpm.conf; \

fi \

&& { \

echo '[global]'; \

echo 'error_log = /proc/self/fd/2'; \

echo; \

echo '[]'; \

echo '; if we send this to /proc/self/fd/1, it never ears'; \

echo 'access.log = /proc/self/fd/2'; \

echo; \

echo 'clear_env = no'; \

echo; \

echo '; Ensure worker stdout and stderr are sent to the main error log.'; \

echo 'catch_workers_output = yes'; \

} | tee php-fpm.d/docker.conf \

&& { \

echo '[global]'; \

echo 'daemonize = no'; \

echo; \

echo '[]'; \

echo 'listen = [::]:9000'; \

} | tee php-fpm.d/zz-docker.conf

EXPOSE 9000

CMD ["php-fpm"]

##</autogenerated>##

如何创建一个安全的Docker基镜像

我们已经知道BBE对MP3播放器重现高保真原音信号的具有重要作用,但由于BBE Sound公司一直对于BBE技术有着非常严格的质量控制,因此并不是谁想用就能用的。虽然BBE技术的授权费用并不高,但想要得到BBE的授权并不是那么简单。在合作公司向BBE Sound提出申请后,BBE Sound首先就会派人对合作公司进行调查,在公司实力得到认可后,才会得到BBE的授权,而在使用了BBE技术的产品设计过程中,BBE Sound公司就会参于关于音效部分的设计,在最终的音质得到认可后,产品才可以加注BBE Sound的商标。也正是这种严谨的运作方式,让BBE商标成为音响界象征高超品质的识别标志。据笔者所知,目前世界上用BBE技术,并且很成功的MP3播放器只有iAUDIO一家,因此,这也是iAUDIO的MP3产品的一项重要技术优势。之前,iAUDIO的产品主要由JNC公司代理,世界上第一款具备BBE音效的经典产品JNC-S800就是iAUDIO的型号为iAUDIO4的贴牌产品。自从2004年底以iAUDIO的品牌正式进入国内市场后,先后推出了U2、G3、I5等三款MP3播放器,涵盖了锂电、5号、7号三种电池。可以说款款皆精品。2004年,凭一款U2夺得了日韩MP3市场的销量冠军,就足以说明问题。从技术指标上来讲,高达95dB的信噪比,配合神奇的BBE技术,使iAUDIO成为当之无愧的世界最强音响效果的MP3播放器。另外,iAUDIO的音乐播放软件技术,以及MP3的功能与界面设计等方面也是世界一流的。据悉,2005年推出的并将于近期在大陆面市的iAUDIO X5,也带有BBE音效,该机型用1.8微硬盘,彩屏,支持播放、浏览和文本阅读。这也将让喜欢BBE的用户可以有更多可供选择的机型。相信随着iAUDIO品牌的逐步被大家认识,其产品及其标志性BBE音效也一定会受到越来越广泛的欢迎。

BBE晰度语音技术是BBE Sound特许使用的核心音频增强技术,BBE Sonic Maximizer系列专业音频信号处理器也使用了该项技术。经BBE Sound 特许用于消费电子产品的其它技术要么集成了该项核心技术,要么在与BBE晰度音响一起使用时得到了优化以取得最佳效果。

BBE:给专业音响世界带来的福音

BBE Sonic Maximizer 系列专业音频处理器在音乐和音响领域非常受欢迎,因而成为访问者登录bbesound com cn的主要原因。为此,我们先列出音乐师和专业音响师能从本技术中获得的好处:

u 自然的音乐现实主义 - 音乐具有巨大的“现场实况感”。不象某些“激励”装置在乐声中加入令人厌烦的人工谐波,BBE不在乐声中加入任何人工成分,相反,它还调整乐声,让我们听到乐声中原有的细节和差别。

u 全频操作 - 高频乐声更清晰、更悦耳、细节更丰富;低频乐声则节奏紧凑、层次清晰、丰富而和谐。所有这一切都源于一个具有BBE处理功能的双按钮调节器。

u 语音可读性 - 音响承包商知道语音可读性对于功放的正确安装和客户的满意意味着什么。没有其它音频处理器能象BBE这样为语音带来自然的透明度和鲜明的层次感。难怪安装了BBE Sonic Maximizer处理器的功放系统在大到纽约JFK机场的巨型网络、小到全球千家万户中得到了广泛的使用。

u 电子和声学吉他 - 音质清晰、层次感强,具有发光效果。BBE语音处理带来了丰富的谐音,并大大提高了爆发力。弦上的每个音符都变得更清楚,让吉他脱离了“泥水”状态。

u 键盘和电子合成器 - 呈现出新的现实主义。打击和弹拨乐声听起来清楚而尖锐,弦声音域丰富,完全结构化,弦上的每个音符都保持了其完整性。

u 电子和声学低音乐器 -呈现音域丰富而且朴实的CD声音。五弦演奏人一定喜欢该功能为B弦带来的效果。有了它,乐声极其紧凑、底音强劲,现场感、透明度和震撼力都无与伦比。

u 嗓音 - 穿越功放设备,让人更清楚地领略你的歌喉,歌词再也不会埋没在混音中了。u 改善了效果处理 - 扩展了立体声混音和合唱的空间维度。无论是单个乐器的演奏,还是混音的录制,BBE在音效方面带来了翻天覆地的变化,并有效地避免了这些音效对乐器和嗓音特点的屏蔽。

u 录音室、家用和专业用 - 用于单曲录制、混录,当然在母盘的制作过程中也可使用 BBE,它将产生全部音乐频谱。用BBE制作的混音清新而富有活力。有了BBE,你不用加大音量就可以还原乐器的透明度或者提高语音的可读性。

u 广播清晰度 - 全球范围内的广播设施都依赖BBE实现最好的传输质量。从日本NHK的大型工程到洛杉矶调频94.7频道等本地音乐台,BBE都是保证现代广播质量的必然选择。

BBE:给消费电子世界带来的好处

BBE Sonic Maximizer处理器的各种优势使其成为专业音响领域最畅销的语音增强装置,基于同样的原因,许多世界闻名的消费电子制造商把BBE视为语音复制技术的下一次飞跃。

下面,我们来探讨一下BBE为晰度语音技术和消费电子领域带来了多少共同的利益、以及BBE为消费电子带来的独特好处。

u 自然的音乐现实主义 - 有了BBE,音乐就有了巨大的“现场实况感”;有了BBE处理技术,不管是在家里、车里、还是用随身听,您都能得到高保真体验,都能越来越接近只有在大型音乐会才能体验到的专业音质。

在苛求高质量音响的汽车音响配件市场,BBE也越来越显示出它的身手。知名厂商,如Alpine、Pioneer 和JVC 在其汽车音响产品中用了BBE技术。专业汽车音响爱好者和安装者都认为:只有安装了BBE的配件才能在汽车音响的竞争中立于不败之地。

u 语音的可读性 - 没有其它任何一种音频处理器能象BEE这样使语音具有自然的透明度,并有鲜明的层次感。正因为如此,每年有越来越多的电视台用BBE的技术。如果用了BBE的技术,即使在音量较低的情况下,语音中的每个字也非常容易听到,还很清楚。这在居住密集的地方—如公寓—将是一大优势,所以越来越多的高级居住设施都用了BBE的技术和产品。

BBE也不断被世界电视制造巨头(如索尼、松下、日立和胜利等)用到自己的产品中。

u 真正逼真的**体验 - 将5.1体验的空间维度扩展到无与伦比的程度。用带BBE的A/V系统观看DVD动作影片,可以让您惊心动魄,因为诸如喷气式飞机或爆炸声异常逼真,而绝不仅仅是声音大。用BBE,原本听不见的声音细节也能展现出来,例如演员手中拿的玻璃杯中的冰块的细微的移动声。这个例子恰如其分的说明了为什么BBE专业音响的口号是“展现你从来没听到过的声音”。

u 改善了仿真环绕效果 - 大多数电视机的“环绕音响”让声音更模糊,让人听起来很吃力,必须把音量调高才能听懂台词。BBE能使“环绕音响”效果的空间性能最大化,同时保持BBE专长的透明度和清晰度不变。

消费电子制造商将很快用新发布的BBE ViVA(一种语音增强技术),它集成了BBE晰度语音处理技术的特别“环绕音效”。

--------------------------------------------------------------------------------

BBE 技术开创了语音保真的新时代!

BBE 高保真音响 - 语言的楷模,行动的高标!

所有经过扬声器放大的音乐在保真性方面都会有所损失(或轻微失真),这是由扬声器固有的特点造成的。BBE 系统通过弥补相位和振幅失真的方式纠正了这些问题,并最终通过一种能让扬声器更全面、更忠实地复制原声的方式将信号输送到扬声器。

原声

未经放大

显示的第一部分瞬态信号 BBE 关机 - 音频系统复制的声音

注意初始瞬态信号的丢失;

波峰失真 BBE 开启- 通过BBE 处理复制的声音

纠正了失真

纠正了相位时延

瞬态信号和谐波:音乐的色彩代码

为便于理解BBE语音处理技术的工作原理,设想一下扬声器的特点和我们对它的期望。扬声器最重要的功能之一就是复制瞬态信号的能力,瞬态信号就是声音开始时短暂的高能量爆发,接着,瞬态信号就演化为谐波。正是这些瞬态信号和谐波具有的不同振幅和相位关系为每首歌曲增加了独特的色彩和特点。

对瞬态信号和谐波的振幅或相位进行任何改变都会使声音产生失真。如果大幅度改变声音信号的瞬态响应,则有可能使敲打铙钹发出的声音听起来象是汽车碰撞的声音;同样,如果改变了竖笛音调的振幅或相位关系,可能使其听起来更象是长笛、或者象双簧管的法国号。

振幅和相位

扬声器的瞬态响应通常是通过振幅响应(对输入信号的响应速度)表现出来的,基本上与相位响应无关(高频信号和低频信号是否在适当的时候被复制)。准确表现出声音的相位和振幅的能力决定了扬声器的瞬时、平稳或持续响应的质量。

如果扬声器的振幅响应曲线是线性的,那么高频信号和低频信号之间的关系就是正确的。如果扬声器的相位响应曲线是线性的,那么高频信号和低频信号将会按正确的时间顺序到达人的耳朵,这就是声音的忠实复制,但实际情况往往并非如此。

为什么现场的声音会如此悦耳?

我们在现场欣赏音乐演奏时,所有的高音和低音完全按乐器演奏的样子传到我们的耳朵里。如果将这场音乐会录制下来、并在扬声系统中播放出来,扬声器将产生频率依存相移。随着信号频率的增加,扬声器线圈的电感将产生越来越高的阻抗,结果产生了时延。因而,那些带有很大负相移的频段(高频段)将比轻度相移的频段(低频段)晚一些才能到达人的耳朵。对人的耳朵来说,合成信号在时域范围内产生了失真。具有瞬间变量(如打击乐和弦乐的声音,如鼓声、吉他声、钢琴声和键琴声等)的音频文件受此类现象的影响最大,使得整个声音变得分散或混沌。

为纠正这些扬声器结构固有的问题,BBE公司开发出一种电路,它具有两个基本功能,其中之一是调节低、中和高频相位之间的关系。考虑到扬声器倾向于在甚高频信号中逐渐加入更长的时延,BBE语音处理系统在低频信号中逐渐加长时延,这样就为扬声器产生的时延曲线形成了镜像曲线,减弱了相位失真。

BBE 系统的第二个功能是增强了高频和低频信号。扬声器在极端高音和低音范围内的效率并不高。大多数语音复制系统都包括一个用于放大高低频信号的电路,这也说明扬声器效率低是个既成事实。但是,BBE系统提供了一个由动态程序驱动的增强功能,并与相位弥补功能相结合,一举还原了原声音乐的壮丽和清晰。

BBE ⅥVA

BBE ViVA晰度立体声音响原声自然立体声图像,高保真。

增加声像的宽度感、深度感和高度感,并保持晰的方向感。

高度稳定的中央声道。

提升声像高度

扬声器置于屏幕下方时,BBE ViVA 能将声像提升到合适的位置(背投电视和液晶电视)。

性能改进

用更自然,更清晰的声音取代传统的立体声音响.

广泛的兼容性

BBE ViVA能与新闻报道、戏剧表演、**、音乐、体育及游戏等领域兼容 (BBE ViVA可一直保持在开机状态。

换节目时,不需要每次都切换音频模式)。单声道节目以单声道格式保存,以保持文件的格式。

BBE ViVA+

增强效果 在BBE ViVA 音响中加入了BBE Mach3Bass 低音增强器,以产生更重的低音效果。

解决方案

模拟和数字方式。

BBE T2

BBE T2(电话技术)是一个增强电话声音清晰度的处理过程。电话声音受其带宽的严重限制,而该种技术通过渐进增强谐波高频并补偿其相位差的方式实现声音处理。

电话产业中涌现的新型数字压缩技术和复用技术极大地提高了电话的通信效率,但美中不足的是,这些改进是以大大降低音质为代价的。现代数字电话的音质未必比过去的模拟电话的音质好。BBE T2及其系列产品(BBE T2M、T2C、T2R及T2X)以其领先的技术(如MP处理、自动增益控制和<2X过取样技术)有效地还原了数字电话的被降低的音质。这些支持技术将BBE T2的性能提高到了最佳的水平,比其它任何电话技术更能让用户体验到原声音质。

--------------------------------------------------------------------------------

应用领域

电话机、移动电话、无绳电话、语音邮件、对讲机、内部电话和复读机等。

性能改进

声音清晰度和语音清晰度

MP处理(BBE T2M、T2R、T2X)

BBE T2M和T2R用了BBE MP处理机制。BBE MP基于这样的工作原理:在声音源文件中加入偶次谐波,从而有效地还原了移动电话和长途电话中经过数字压缩后损失的声音亲切感和细腻程度。BBE MP还纠正了高频谐波的时间校准,高频谐波根据频率按比例前移。这种合并处理使大脑更容易分析并理解声音。

该处理机制的另一个优点是,经过BBE MP处理后还原的谐波能将音量提高3分贝(RMS),而峰间摆动则保持不变。这样,利用同一种换能器和驱动器的BBE T2M、2R和T2X能将最大声压级(SPL)提高3分贝。

压缩器/自动增益控制(C) (BBE T2C、T2R、T2X)

BBE T2C、T2R和T2X产品用了独特的BBE压缩器/自动增益控制(C)技术。不论输入信号如何波动,该过程都能将音量自动调整到合适的水平,而且,我们独特的压缩算法能检测到可能的P和S声音饱和,并能进行“闪避”处理(即暂时减少增益)以避免声音在真正出现前达到饱和状态。

带宽延伸 (BBE T2X)

通过BBE MP和过取样技术的融合,BBE T2X 将带宽延伸到电话音频范围之外,从而产生了极其清晰的、自然的声音。

听力障碍(HI)模式

BBE T2的HI模式为听力障碍者提供了有效增强清晰度的功能,而不再需要对人体有害的高频助听器。HI模式额外增加了一个带有相位调整功能的、适度的高频助听器。这样,有听力障碍的用户也能听到自然而清晰的声音了。

解决方案

模拟(BBE T2)和数字(BBE T2、T2C、T2M、T2R、T2X)。

BBE OPTIMA

晰度声音处理技术

数码谐波的增强和恢复

专业级3波段压缩器/自动增益控制 (C)

适用于音频设备

微型组合音响、随身立体声音响、耳机立体声音响、

汽车音响、台式电脑、膝上电脑

--------------------------------------------------------------------------------

BBE MP处理技术

BBE MP处理技术通过数码压缩,恢复并增强丢失的谐波,从而改善经过数字压缩的音质(如MP3)。BBE MP从原材料中产生偶次谐波,有效恢复声音的温情、细腻与细微差别。

BBE MP可将声级平均提高3个分贝,同时保持峰间摇摆不变。由于声音输出高出3个分贝,信噪比也相应地得到了改善。

3波段压缩器/自动增益控制(C)

自动调整不同录音及广播信道之间的音频电平波动。

以同样的音量回放由无经验用户录制的MP3唱片。

增强音乐中柔和部分的增益,同时保持高音部分音量不变(适合于嘈杂的环境,如汽车音响或随身个人音响)。

BBE独有的3波段压缩器/自动增益控制以极为简约的软件提供发烧友级的音质。

改善立体影像(BBE Optima3)

通过3维声场处理技术恢复因数码压缩(尤其是背景音乐的压缩)而丢失的立体影像,简单而有效。

解决方案

数码

BBE MP

MP3 (和全“损失”数位压缩) 音频增强和复原技术

从数位压缩中恢复优质真空管声音

--------------------------------------------------------------------------------

BBE MP (最小化多项非线性饱和)技术通过数位压缩恢复和增强谐波损失,进而提高经数位压缩处理的音频(如MP3)音效。BBE MP从原始资料中再生声音,因而有效地恢复声音的温暖感、细腻感和细微差别。

通过过取样技术,BBE MP将MP3/WMA档的高频段扩展到CD级频段,将CD的频段扩展到超级CD或DVD频段。

--------------------------------------------------------------------------------

⒈ 产品适用面广

MP3播放机、MD播放机、CD播放机、身历声耳机、微型组合音响、携带型身历声、车载身历声、TV、卫星无线设备 (XM、天狼星) 、网路电台、电话机等等。

⒉ 适用的技术

全数位压缩(损失压缩) 音频和CD (PCM)、MPEG层音频(MP1、MP2、MP3)、MP3PRO、MPEG4音频、AAC、ATRAC (MD)、AC-3、DTS、天狼星、XM、IBOC、CD (PCM)、电话机等。

⒊ 增强

用数位压缩技术恢复和增强谐波损失。

恢复谐波的相位校准。

恢复经数位压缩後缩小的立体图像,恢复全立体性能。

展现音乐中精致、优美而有趣的细微情节。

恢复数位压缩处理後受损的声音的温暖感。

用过取样技术扩展高频段。

⒋ 解决方案

很简单的数位软体(1/10-1/100的可比性)

BBE MP的工作原理

数位压缩

We Form: 波形

Level: 电平

Compression: 压缩

Original: 原声

Frequency: 频率

Frequency Spectrum: 频谱

数位压缩主要是在频域内进行的。左上图所示的波形为示波器上显示的声波,在“A”点取样,其声谱以右上图所示的“原声”曲线表示。从本质上来说,这是个取样的过程。集到的声谱看起来很复杂。校平这根复杂的曲线可以消除大部分(90%以上)声音、而不至於在很大程度上影响音质(如右上图示有“压缩”字样的光滑曲线所示,这正是数字压缩的核心所在),所以一般情况下还是可以接受的。

系统以大约40 KHz的频率、在时域范围内继续取样,生成如下所示的频谱系列。

Time: 时间

Original audio spectrum: 原声声谱

数位压缩在频域和时域内进行,以频域为主。频域压缩和时域压缩後产生的频谱如下图简化所示(注:为便於理解,我们将该图大大简化了。许多资讯因此被删除并永久丢失了,这也正是此类压缩被称为“损失”压缩的原因所在)。还有,MP3的取样率往往低于CD的取样率,导致某一频率(取样频率的一半)以上的音频资讯全部丢失(请注意下图所示高於某一频率的音频资讯的突然丢失)。这一特定频率因情况而异,取决于频谱范围。

Time: 时间

Digitally compressed audio spectrum: 经数位压缩处理的音频频谱

由这种资料档案还原而来的声音音质不错,还是钢琴的声音,喇叭的声音也没变,但声音的细腻感、细微差别和音乐感却没了,声音也了无生趣。BBE可以发现和增强压缩后的谐波、纠正时间校准,进而恢复和增强音频。但是,全部丢失了的谐波只能重新生成了。

MP处理

MP处理 (最小化多项非线性饱和) 可以有效地从“原声”生成如下图所示、标有“用MP处理生成的谐波”字样的谐波。将偶次谐波和奇次谐波融入原声时,偶次谐波产生的声音听起来比较和谐、温暖感较强、也很舒服;而适量的奇次谐波则使声音更为明快、更为强烈。这样处理的声音温暖感较强、较舒服,也比较出色(这种方式类似于真空管放大器,这种放大器也会生成偶次谐波和奇次谐波,因而真空管放大器的声音听起来比更为高级的固态放大器更温暖、更舒服)。

Fundamental: 基音

Generated harmonics by MP process: MP处理产生的谐波

Frequency: 频率

MP process: MP处理

这种MP处理技术包括整个音频带宽,均匀地覆盖低频到高频的频段,但不能增强任何一个特定的频段、也不会改变该频段的颜色。下图所示为融入重新生成的谐波的频谱图。以较高速度取样的MP处理甚至能重新生成音频信号,因而补充了全部丢失了的高频音频。

Time: 时间

Frequency: 频率

BBE MP processed audio spectrum: 用 BBE MP处理的音频频谱

BBE MP处理过程

以频率为基础按比例前移线性相位的BBE处理先于MP处理进行。MP处理能基於整个音频频段均匀地生成高次谐波。经 BBE处理的音频时间校准会逐渐减小(频率越高就越早),使生成的高次谐波的时间相位前移。BBE处理技术让电脑更容易分析声音,所需的谐波也比较少(与基音相比,时间相位前移了的谐波更便于电脑分析声音,这是心理声学的常识)。

Time advance: 时间相位前移

Time delay: 时延

Time: 时间

Frequency: 频率

BBE MP processed audio spectrum: 用BBE MP处理的音频频谱

BBE处理能逐渐增强频率较高的声音。在MP处理生成的谐波中,高频成分比低频成分多。BBE处理增益能降低这种差异。

BBE MP处理技术能将经数位压缩後受损的声音转化为温暖感较强、更丰富、更细腻、更清晰、更强烈的声音。

用MP处理技术扩展频率范围

MP3

MP3档包含以可以接受的音质复制声音所需的最少资讯,但只保留1/20的原声资讯,剩馀的资讯则永久丢弃了(其实,您可以在同一张光碟上存储20倍的音乐)。压缩档大小的另外一种策略是缩小频率范围。很显然,MP3音乐的高频资讯比CD少,这一点很值得关注。经数位压缩处理的任何音频信号(包括WMA)都有这个问题。

Level: 电平

MP3 data: MP3数据

Sudden Cut-off at relatively low frequencies (cut-off frequency varies): 频率相对较低时的突然截止(截止频率不是固定不变的)

Frequency: 频率

MP3 frequency response: MP3频率回应

BBE MP处理技术能恢复频段内的谐波;而且,如下图所示,借助48 KHz和96 KHz频点的过取样技术,它还能将高频带宽扩展到24 KHz或48 KHz。

Level: 电平

Generated harmonics by MP process: MP处理技术产生的谐波

High frequency expanded by MP process: MP处理技术扩展後的高频段

Frequency: 频率

MP3 frequency expansion by MP process: 用MP处理技术扩展MP3频率

下图所示为戴安娜·克拉尔演唱的“我记得你”的部分频谱图,从中可以看出BBE MP处理技术的效果。上图表示频率在16 KHz以下的测试音频,在32 KHz的频点向下取样原始CD可以清除高频成分。如下图所示,可以用BBE MP处理技术再生频率受限制的测试音频16KHz以上的谐波(每个节拍刚开始时的效果都是很明显的)。下图中央部位为6 KHz-8 KHz频段产生的谐波,这类谐波的频率高於16KHz,数目也较多。

L-ch

R-ch

戴安娜·克拉尔演唱的“我记得你” CD,32 KHz频点向下取样,48 KHz频点重新取样,声音档案

L-ch

R-ch

戴安娜·克拉尔演唱的“我记得你”,32 KHz向下取样,48 KHz频点用BBE MP处理技术处理,声音档案

本页比上述更为详细。因为显示和/或列印质量欠佳,不是看得很清楚,即使这样,连下图比较暗的地方也能很精细地恢复整首歌曲的谐波。

戴安娜·克拉尔演唱的“我记得你” CD,32 KHz向下取样,48 KHz频点重新取样,声音档案

戴安娜·克拉尔演唱的“我记得你”,32 KHz向下取样,48 KHz频点BBE MP技术处理,声音档案

与上述对应的以下三幅表示相同时间点的频率分析。

第一幅表示频率上限为22 KHz的原声CD的频率回应,第二幅表示音频频率均为16KHz以下、频率受到限制的测试材料。

戴安娜·克拉尔演唱的“我记得你” 原声CD,48 KHz频点重新取样,声音档案

戴安娜·克拉尔演唱的“我记得你” CD,32 KHz向下取样,48 KHz频点重新取样,声音档案

从下面第三幅图可以看出BE MP处理的结果:MP处理技术再生了频率在16 KHz以上的所有信号,从而将高频段扩展至24 KHz(这一频率甚至高於原声CD 22 KHz的频率上限)。从图中还可以看出,原声CD的频率回应也被精确复制了。

戴安娜·克拉尔演唱的“我记得你”,32 KHz向下取样,声音档案,48 KHz频点BBE MP技术处理

就效果而言,这种技术和MP3 PRO解码技术类似。两者的区别在於:MP3 PRO解码器只对其已编码的音频有效,而MP处理技术对MP3和MP3 PRO音频都有效。此外,MP处理技术也适用於各类数位音频格式,如WMA和AAC。

常规CD

在一般的音频场合,常规CD的音质是很不错的。但是,新型超级CD或DVD的音质远远超过了CD,因为超级CD或DVD的取样速率比CD高(带宽比CD宽)、音频信号位元位元数也比CD多。

Level: 电平

Regular CD: 常规CD

Upper frequency limit of CD: CD的频率上限

Generated harmonics by MP process: 用MP处理技术生成的谐波

Extended upper frequency limit by over-sampling (96 KHz): 用96 KHz频点过取样技术扩展频率上限

BBE MP将CD的高频回应扩展至超级CD或DVD的水平,这可以用过取样技术实现。如上图所示,96 KHz频点过取样技术将CD的频率上限由22 KHz扩展到48 KHz,处理後的声音流畅多了、也更细腻了。

下一页的波形图为Emmylou Harris演唱的“我还想著别人”。上图所示为44 KHz频点对CD重新取样所得的声音档案,它是原声CD的精确复制;下图则为BBE MP处理技术在48KHz频点稍微过取样所得的结果。从图中可以看出,大波形图上面有很多高频成分(小振动),这些高频成分就是BBE MP处理产生的谐波。

Emmylou Harris演唱的“我还在想著别人”,44 KHz频点对CD重新取样,声音档案

Emmylou Harris演唱的“我还想著别人”,48 KHz频点用BBE MP处理技术处理,声音档案

电话机

电话机的窄带宽(特别是相对较低的4 KHz频率限制,它会降低声音的清晰度)使各人在电话的声音互不相同。

Level: 电平

Generated harmonics by MP process: 用MP处理技术生成的谐波

High frequency expanded by MP process (16 KHz over-sampling): MP处理(16 KHz频点过取样)技术扩展後的高频段 Frequency: 频率

MP处理通过过取样技术扩展4 KHz的频率上限。如上图所示:在16 KHz频点(不是通常的8 KHz频点)对信号重新取样後,频率上限由4 KHz扩展到8 KHz。将MP处理技术和BBE T2(电话技术)结合起来使用能将通常的300Hz % 4 KHz带宽扩展到300Hz % 8 KHz,信号的清晰度和可理解性也大大提高了。

BBE Sound Inc. Powered

Golang项目部署3,容器部署

** 构建一个Ja环境基镜像 **

正如我刚解释的,Alpine Linux是一个构建自有镜像时不错的选择,因此,我们在此将使用它来构建简洁高效的Docker镜像,我们开始吧!

组合:Alpine + bash

每个Dockerfile第一个指令都是指定它的父级容器,通常是用于继承,在我们的例子中是<code>alpine:latest</code>:

sh

FROM alpine:latest

MAINTAINER cSphere <docker@csphere.cn>

我们同时声明了谁为这个镜像负责,这个信息对上传到Docker Hub的镜像是必要的。

就这样,你就有了往下操作的基础,接下来安装我们选好的shell,把下边的命令加上:

sh

RUN apk add --no-cache --update-cache bash

CMD ["/bin/bash"]

最终的Dockerfile是这样:

```sh

FROM alpine:latest

MAINTAINER cSphere < docker@csphere.cn >

RUN apk add --no-cache --update-cache bash

CMD ["/bin/bash"]

```

好了,现在我们构建容器:

sh

$ docker build -t my-ja-base-image .

Sending build context to Docker daemon 2.048 kB

Step 1 : FROM alpine:latest

---> 2314ad3eeb90

Step 2 : MAINTAINER cSphere <docker@csphere.cn>

---> Running in 63433312d77e

---> bfe947137a

Removing intermediate container 63433312d77e

... 省略若干行

Step 4 : CMD /bin/bash

---> Running in d2291684b7

---> ecc443d68f27

Removing intermediate container d2291684b7

Successfully built ecc443d68f27

并且运行它:

sh

$ docker run --rm -ti my-ja-base-image

bash-4.3#

成功了!我们有了一个运行着bash的Alpine Linux。

一文教您如何通过 Docker 快速搭建各种测试环境

容器部署即使用 docker 化部署 golang 应用程序,这是在云服务时代最流行的部署方式,也是最推荐的部署方式。

跨平台交叉编译是 golang 的特点之一,可以非常方便地编译出我们需要的目标服务器平台的版本,而且是静态编译,非常容易地解决了运行依赖问题。

使用以下指令可以静态编译 Linux 平台 amd64 架构的可执行文件:

生成的 main 便是我们静态编译的,可部署于 Linux amd64 上的可执行文件。

我们需要将该可执行文件 main 编译生成 docker 镜像,以便于分发及部署。 Golang 的运行环境推荐使用 alpine 基础系统镜像,编译出的容器镜像约为 20MB 左右。

一个参考的 Dockerfile 文件如下:

其中,我们的基础镜像使用了 loads/alpine:3.8 ,中国国内的用户推荐使用该基础镜像,基础镜像的 Dockerfile 地址: s://github/johngcn/dockerfiles ,仓库地址: s://hub.docker/u/loads

随后使用 " docker build -t main . " 指令编译生成名为 main 的 docker 镜像。

需要注意的是,在某些项目的架构设计中, 静态文件 配置文件 可能不会随着镜像进行编译发布,而是分开进行管理和发布。

例如,使用 MVVM 模式的项目中(例如使用 vue 框架),往往是前后端非常独立的,因此在镜像中往往并不会包含 public 目录。而使用了 配置管理中心 (例如使用 consul / etcd / zookeeper )的项目中,也往往并不需要 config 目录。

因此对于以上示例的 Dockerfile 的使用,仅作参考,根据实际情况请进行必要的调整。

使用以下指令可直接运行刚才编译成的镜像:

容器的分发可以使用 docker 官方的平台: s://hub.docker/ ,国内也可以考虑使用阿里云: s://.aliyun/product/acr 。

在企业级生产环境中, docker 容器往往需要结合 kubernetes 或者 docker swarm 容器编排工具一起使用。

容器编排涉及到的内容比较多,感兴趣的同学可以参考以下资料:

超值一篇分享,Docker:从入门到实战过程全记录

目录

一、镜像加速

Docker 默认是从官方镜像地址 Docker Hub 下下载镜像,由于服务器在国外的缘故,导致经常下载速度非常慢。为了提升镜像的下载速度,我们可以手动配置国内镜像加速器,让下载速度飚起来。

国内的镜像加速器选项较多,如:阿里云,DaoCloud 等。

本文主要说说如何配置阿里云的镜像加速器。

2.1 登录阿里云获取加速信息

s://dev.aliyun/

2.2 配置 Docker

2.2.1 确定 Docker Client 版本

在配置之前,首先需要 确定 Docker Client 的版本,推荐是 1.10.0+ :

2.2.2 配置镜像加速器

PS: 这里以 CentOS 系统为例,如果你是别的系统,可以参考阿里云配置加速器官方文档。

通过修改 daemon 配置文件 /etc/docker/daemon.json 来使用加速器:

执行下面命令:

2.3 验证一下速度

以下载 mongodb 为例,看下速度:

配置了加速器过后,速度终于飚起来了。

二、快速安装&搭建 Mysql 环境

本节中,我们将学习如何通过 Docker 快速安装与搭建 Mysql 环境。

2.1 下载 Mysql 镜像

这里以 Mysql 5.7 为例:

下载完成后,通过 docker images 检查一下镜像是否下载成功:

2.2 先以最简单方式启动

先以简单的方式启动:

命令执行完成后,你也可以通过 docker ps 命令来确认下容器是否启动成功。若成功,我们需要将容器中的目录文件复制到宿主机中,分别包括:

完成这一切后,让我们将刚刚运行的容器删除掉。

PS: mysql 是我们运行容器时,指定的名称,当然,你也可以先执行 docker ps , 通过容器 ID 来删除。

2.3 正式运行 Mysql 容器

接下来,正式运行 Mysql 容器:

其他不变,额外添加了两个挂载子命令:

执行命令完成后,查看下容器是否启动:

可以看到,容器运行成功

2.4 通过 Mysql 客户端连接一下试试

通过 MySQL 客户端连接刚刚创建的 mysql, 看看能否连接成功:

连接成功了!

三、快速安装&搭建 Redis 环境

本节中,我们将学习如何利用 Docker 安装&搭建 Redis 环境。

3.1 下载 Redis 镜像

首先拉取 Redis 镜像, 这里我选择的是 redis:alpine 轻量级镜像版本:

下载完成后,通过 docker images 确认镜像是否已经下载到本地:

3.2 运行 Redis 容器

命令说明:

命令运行完成后,查看容器是否启动成功:

可以看到 redis 容器已经启动成功了!

3.3 连接刚刚创建好的容器

执行如下命令,连接 redis:

四、快速安装&搭建 MongDB 环境

本节中,我们将学习如何通过 Docker 快速安装与搭建 MongoDB 环境。

4.1 下载 MongoDB 镜像

这里以 mongo 4 版本为例,下载镜像:

下载完成后,确认一下镜像是否下载成功:

4.2 运行 MongoDB 镜像

下载成功后,运行 mongoDB 镜像:

执行命令完成后,查看下容器是否启动:

4.3 添加管理员账号

执行命令:

然后,创建一个拥有最高权限 root 账号:

创建成功后,你会看到 Successfully added user :

4.4 用新创建的 root 账户连接,测试一下

连接成功后,我们可以执行相关 sql:

显示所有的数据库:

使用某个数据库:

输入命令 exit ,退出连接!

五、快速安装&搭建 Elasticsearch 环境

本节中,我们将学习如何通过 Docker 快速安装与搭建 Elasticsearch 环境。

5.1 下载 Elasticsearch 镜像

这里以 Elasticsearch 6.5.0 为快速安装&搭建 Elasticsearch 环境例:

下载完成后,通过 docker images 检查一下镜像是否下载成功:

5.2 先简单运行 Elasticsearch 镜像

下载成功后,简单运行 Elasticsearch 镜像:

命令执行完成后,你也可以通过 docker ps 命令来确认下容器是否启动成功。

可以看到 es 容器运行成功了,接下来,进入容器中:

安装 analysis-ik 中文分词插件:

PS: es 从 v5.5.1 版本开始支持自带的 es 插件命令来安装,如果你安装的版本不是 6.5.0,需要将命令中的版本号修改一下,具体参考 s://github/medcl/elasticsearch-analysis-ik

安装成功后,退出容器:

删除刚刚运行的容器:

PS: 当然了,你也可以通过容器的 ID 来删除。

5.3 复制相关文件

5.4 修改 es 相关配置

进入我们刚刚指定的 config 配置目录,修改 jvm.options 文件:

PS: 因为小哈测试服务器就 2G 内存,这里我改成了 JVM 内存占用 300m, 如果你的内存够用,可不用改。

修改 elasticsearch.yml 文件, 添加如下配置:

解释一下添加的配置,设置节点为 master 节点,并允许跨域访问,以便后面使用 head 插件图形化界面访问。

5.5 运行 Elasticsearch 容器

这次,我们额外添加了相关挂载命令:

5.6 测试一下,瞅瞅 es 是否能够正常访问

测试一下,看 es 是否启动成功:

OK, 到此 es 的单节点环境就搭建好了!

欢迎工作一到五年的Ja工程师朋友们加入Ja程序员开发: 721575865

群内提供免费的Ja架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

作者 | 天元浪子

来源 | CSDN博客

想要真正理解Docker,就不得不从虚拟化技术的发展历程说起。普遍认为虚拟化技术经历了物理机时代、虚拟机时代,目前已经进入到了容器化时代。可以说,Docker是虚拟化技术不断发展的必然结果。

那么,什么是容器呢?容器和虚拟机有什么不同?Docker和容器又是什么关系呢?搞明白这几个问题,Docker的概念就清晰了。

1.1 虚拟机和容器

借助于VMWare等软件,可以在一台计算机上创建多个虚拟机,每个虚拟机都拥有独立的操作系统,可以各自独立的运行程序。这种分身术虽然隔离度高(操作系统级),使用方便(类似物理机),但占用存储多(GB级)、启动速度慢(分钟级)的缺点也是显而易见的。

相较于虚拟机,容器(Container)是一种轻量型的虚拟化技术,它虚拟的是最简运行环境(类似于沙盒)而非操作系统,启动速度快(秒级)、占用存储少(KB级或MB级),容器间隔离度为进程级。在一台计算机上可以运行上千个容器,这是容器技术对虚拟机的碾压式优势。

1.2 容器、镜像和Docker

Docker是一个开源的应用容器引擎,可以创建容器以及基于容器运行的程序。Docker可以让开发者打包他们的应用和依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

听起来很简单,但是在Docker和容器之间,还隐藏着一个镜像的概念,令初学者颇感困惑。本质上,Docker镜像是一个特殊的文件系统,它提供容器运行时所需的程序、库、、配置等文件。Docker镜像类似于一个py文件,它需要Docker的运行时(类似于Python解释器)运行。镜像被运行时,即创建了一个镜像的实例,一个实例就是一个容器。

1.3 Docker 和 k8s

作为容器引擎,Docker为容器化的应用程序提供了开放的标准,使得开发者可以用管理应用程序的方式来管理基础架构,实现快速交付、测试和部署代码。随着容器的大量使用,又产生了如何协调、调度和管理容器的问题,Docker的容器编排应运而生。

k8s是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理,是一个开源的,用于管理云平台中多个主机上的容器化的应用,k8s的目标是让部署容器化的应用简单并且高效,k8s提供了应用部署、规划、更新、维护的一种机制。

Docker和k8sr都是以containerd(容器化标准)作为运行时,因此使用Docker创建的镜像完全可以在k8s中无障碍的使用。

2.1 在ubuntu中安装

在linux系统中安装Docker非常简单,官方为我们提供了一键安装脚本。这个方法也适用于Debian或CentOS等发行版。

安装过程如果出现超时,不要灰心,多试几次,总会成功的。安装完成后,Docker只能被root用户使用,可以使用下面的命令取消权限限制:

然后,重启docker服务:

最后,关闭当前的命令行,重新打开新的命令行就可以了。

顺便提一下,如果在CentOS下安装,可能会出现一堆类似于下面的错误:

这是由于docker和Podman冲突造成的,需要先卸载Podman:

2.2 在Win10中安装

Docker的运行,依赖linux的环境,官方提供了Docker Desktop for Windows,但是它需要安装Hyper-V,Hyper-V是微软开发的虚拟机,类似于 VMWare 或 VirtualBox,仅适用于 Windows 10。这个虚拟机一旦启用,QEMU、VirtualBox 或 VMWare Workstation 15 及以下版本将无法使用!如果你必须在电脑上使用其他虚拟机(例如开发 Android 应用必须使用的模拟器),请不要使用 Hyper-V!

我的电脑是win10家庭版,不能直接安装hyper-v,需要将下面的命令保存到cmd文件中:

然后在cmd文件上点击右键,选择使用管理员运行。执行完毕后会重启,在重启的过程中进行安装。

2.3 Hello world

docker服务启动的情况下,运行下面的命令:

此命令的含义是:

第一次运行时,因为本地没有ubuntu:20.04镜像,docker会自动从镜像服务器下载。下载过程可能需要多试几次,只要成功一次,以后执行就不再需要下载了。

docker官方还提供了一个hello-world镜像,可以直接运行:

此命令省略了镜像版本和运行参数,docker使用latest作为版本,即最新版本。

从hello world的例子中,也可以体验到,docker实例的运行是非常快的。

docker官方的镜像库比较慢,在进行镜像操作之前,需要将镜像源设置为国内的站点。

新建文件/etc/docker/daemon.json,输入如下内容:

然后重启docker的服务:

3.1 列出本地所有镜像

执行命令 docker images 可以查看

当前我本地只有刚才安装的两个镜像。

3.2 从镜像库中查找镜像

执行命令 docker search 镜像名称可以从docker镜像库中查找镜像。

最好选择官方(OFFICIAL)的镜像,这样的镜像最稳定一些。

3.3 下载新的镜像

执行命令docker pull 镜像名称:版本号即可下载新的镜像。

镜像下载后,就可以使用镜像来创建容器了。

4.1 启动容器

执行命令docker run即可启动容器,也就是创建某个镜像的实例。docker run命令非常复杂,可以先执行一个docker run --help来查看帮助:

比如我们要执行python的shell,需要添加-it参数,即:docker run -it python:3.8

4.2 将宿主机的文件挂载到容器

docker容器与宿主机是隔离的,要想让容器内的程序能访问宿主机上的文件,需要通过-v参数将宿主机的文件挂载到容器中。

比如我们在宿主机上有一个hello.py,可以打印hello,想要在python容器中执行,就需要进行挂载。-v后还需要接两个参数,分别是宿主机的目录和容器内的目录,两者使用:分隔,路径必须都是绝对路径。

我的hello.py保存在主目录的/docker_test目录中,将这个目录挂载到容器的/docker_test目录,然后在容器内执行python /docker_test/hello.py:

4.3 容器的端口映射

我们修改一下hello.py,创建一个socket服务端,并监听5000端口,当有客户端连接时,打印客户端的地址,先客户端发送hello,然后关闭连接:

在容器内执行:

接下来,尝试用telnet命令连接,结果却是失败的。原因是,127.0.0.1是宿主机的ip地址,5000是容器的端口,这与我们的习惯稍微有些不同。事实上,docker的容器是非常轻量的,它并没有自己的网络,要想访问容器的端口,需要进行端口映射,将容器的某端口映射到宿主机的端口,客户端连接时,只要与宿主机的端口进行连接就可以了。

需要注意的是,上面的代码创建的服务器,无论如何也不可能被客户端连接,因为代码中绑定了127.0.0.1的ip,在容器中运行时,需要绑定所有ip,即0.0.0.0。

然后,再使用-p参数,-p还需要三个参数,即宿主机的ip地址、宿主机的端口、容器的端口,三者之间使用:分隔。一般的,可以将宿主机的ip地址省略,只写宿主机的端口:容器的端口即可。

这样,就将容器的5000端口映射到了宿主机的5001端口,使用:

即可与容器中的服务器进行连接。

4.4 容器管理

上面的服务运行之后,可以使用docker ps命令,查看运行中的容器:

显示的内容有下面几列:

要想结束容器,可以使用docker kill 容器ID命令。

一般而言,当我们的程序开发完成后,会连同程序文件与运行环境一起制作成一个新的镜像。

要制作镜像,需要编写Dockerfile。DockeFile由多个命令组成,常用的命令有:

注意,Docker镜像中有一个层的概念,每执行一个RUN命令,就会创建一个层,层过多会导致镜像文件体积增大。尽量在RUN命令中使用&&连接多条shell命令,减少RUN命令的个数,可以有效减小镜像文件的体积。

5.1 自制显示文本文件内容镜像

编写cat.py,接收一个文件名,由python读取文件并显示文件的内容:

这个例子比较简单,缩写Dockerfile如下:

这个Dockerfile的含义是:

需要说明的是,ENTRYPOINT有两种写法:

这里用第二种写法,是因为我们要在外部给容器传递参数。执行命令编译Docker镜像:

这个命令中,-t的含义是目标,即生成的镜像名为hello,版本号为1.0,别忘了最后那个.,这叫到上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

这样,我们的第一个镜像就制作完成了,使用下面的命令执行它:

即可看到~/docker_test/cat/files/test.txt的内容。

5.2 自制web服务器镜像

我们使用tornado开发一个网站,而python的官方镜像是没有tornado库的,这就需要在制作镜像时进行安装。

测试的ws.py如下:

编写Dockerfile文件如下:

在此我们验证一下CMD与ENTRYPOINT的区别。在Dockerfile所在有目录下执行如下命令:

执行完成后,再使用docker images使用就可以看到生成的镜像了,然后使用下面的命令运行:

在浏览器中输入宿主机的ip和8000端口,就可以看到页面了。

在这个例子中,我使用的运行命令是CMD,如果在docker run中指定的其他的命令,此命令就不会被执行,如:

此时,容器中被执行的是python命令,而不是我们的服务。在更多情况下,我们希望在docker run命令中为我们的服务传参,而不是覆盖执行命令,那么,我们应该使用ENTRYPOINT而不是CMD:

上面这种写法,是不支持传递参数的,ENTRYPOINT和CMD还支持另一种写法:

使用这种写法,docker run命令中的参数才可以传递给hello.py:

这个命令中,--port=9000被作为参数传递到hello.py中,因此容器内的端口就成了9000。

在生产环境中运行时,不会使用-it选项,而是使用-d选项,让容器在后台运行:

这种方式下,即使当前的控制台被关闭,该容器也不会停止。

5.3 自制apscheduler服务镜像

接下来,制作一个使用apscheduler编写的服务镜像,代码如下:

Dockerfile也是信手拈来:

生成镜像:

应该可以运行了,文件复制需要两个目录,在运行时,可以使用两次-v来挂载不同的目录:

前面用到的官方python镜像大小足足882MB,在这个基础上,再安装用到的第三方库,添加项目需要的等,大小很容易就超过1个G,这么大的镜像,网络传给客户非常的不方便,因此,减小镜像的体积是非常必要的工作。

docker hub上有个一python:3.8-alpine镜像,大小只有44.5MB。之所以小,是因为alpine是一个用了busybox架构的操作系统,一般用于嵌入式应用。我尝试使用这个镜像,发现安装一般的库还好,但如果想安装numpy等就会困难重重,甚至网上都找不到解决方案。

还是很回到基本的路线上来,主流的操作系统镜像,ubuntu的大小为72.9MB,centos的大小为209MB——这也算是我更喜欢使用ubuntu的一个重要原因吧!使用ubuntu作为基础镜像,安装python后的大小为139MB,再安装pip后的大小一下子上升到了407MB,要是再安装点其他东西,很容易就赶上或超过python官方镜像的大小了。

看来,寻常路线是很难压缩镜像文件体积了。幸好,还有一条曲线救国的路可走,这就是多阶段构建法。

多阶段构建的思想其实很简单,先构建一个大而全的镜像,然后只把镜像中有用的部分拿出来,放在一个新的镜像里。在我们的场景下,pip只在构建镜像的过程中需要,而对运行我们的程序却一点用处也没有。我们只需要安装pip,再用pip安装第三方库,然后将第三方库从这个镜像中复制到一个只有python,没有pip的镜像中,这样,pip占用的268MB空间就可以被节省出来了。

1、在ubuntu镜像的基础上安装python:

然后运行:

这样,就生成了python:3.8-ubuntu镜像。

2、在python:3.8-ubuntu的基础上安装pip:

然后运行:

这样,就生成了python:3.8-ubuntu-pip镜像。

3、多阶段构建目标镜像:

这个dockerfile需要解释一下了,因为它有两个FROM命令。

第一个是以python:3.8-ubuntu-pip镜像为基础,安装numpy,当然,在实际应用中,把所有用到的第三方库出写在这里。

第二个FROM是以FROM python:3.8-ubuntu镜像为基础,将第三方库统统复制过来,COPY命令后的–from=0的意思是从第0阶段进行复制。实际应用中再从上下文中复制程序代码,添加需要的ENTRYPOINT等。

最后,再运行:

这然,用于我们项目的镜像就做好了。比使用官方python镜像构建的版本,小了大约750MB。

到此,我们的镜像已经制作好了,可是,镜像文件在哪,如何在生产环境下运行呢?

刚才使用docker images命令时,已经看到了生成的镜像:

我们可以使用docker se命令将镜像保存到指定的文件中,保存的文件是一个.tar格式的压缩文件:

将hello.tar复制到生产环境的机器上,然后执行导入命令:

就可以使用了。