Docker 新手上路(二)——Dockerfile

这个系列一共分为5篇,是我初次接触 Docker 的总结。

这几篇是一个很粗略的新手入门。并不足以了解全貌,不过可以让你短时间内了解 Docker 为何物以及一些简单的操作,可以一看。

前几天新学习了 docker 的基本知识,包括安装、环境配置、获取和运行镜像等最基础的东西。今天学习一些 docker 的启动查看定制等操作。

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。 用过 PHP Laravel 框架的应该马上就理解了(其他例如java kotlin等也是类似),这个就和 composer.json 脚本一样,用来保证环境一致性的配置文件。

定制镜像需要用到下面几个命令

  • FROM 指定基础镜像
  • RUN 执行命令
  • BUILD 构建镜像

Dockerfile 正确的写法应该是这样:

FROM xxx

RUN buildDeps='gcc libc6-dev make' \
    && apt-get update \
    && apt-get install -y $buildDeps \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
    && mkdir -p /usr/src/redis \
    && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
    && make -C /usr/src/redis \
    && make -C /usr/src/redis install \
    && rm -rf /var/lib/apt/lists/* \
    && rm redis.tar.gz \
    && rm -r /usr/src/redis \
    && apt-get purge -y --auto-remove $buildDeps

然后在该目录执行

$ docker build -t nginx:v3 .

使用 docker build 命令进行镜像构建。其格式为:

docker build [选项] <上下文路径/URL/->

#build
      --no-cache=false Do not use cache when building the image
      -q, --quiet=false Suppress the verbose output generated by the containers
      --rm=true Remove intermediate containers after a successful build
      -t, --tag="" Repository name (and optionally a tag) to be applied to the resulting image in case of success
      
docker build -t image_name Dockerfile_path

PHP 获取类名、调用者类名方法名

先记一个案例。今天在写一个虚基类 AbstractUuidModel,因为要从 request 里批量将数据通过 Eloquent 保存至 model。而此时有很多 model 都需要这样一个操作,每个 model 都有20个以上的属性,一个一个赋值,真的是能把人写死。

为了提高效率,遂在虚基类中添加一个抽象度比较高的方法。

由 updateByConsole() 这个方法开始进入逻辑:

public function updateByConsole()
{
    $request = request();
    $flag = true;
    foreach ($request->all() as $key => $value) {
    	if(!$flag)continue;
        if(!$request->has($key))continue;
        if(is_string($value))$value = trim($value);
        $flag = $flag && $this->updateProperty($key,$value);
    }
    if($flag) $this->save();

    return $flag;
}

将每一个 input 交给 updateProperty() 这个方法。于是接下来是核心代码:


laravel 下正确添加扩展包

我们经常要往现有的项目中添加扩展包,有时候因为编码人员还不了解 Laravel,在一些不良开发文档的引导下,如下图来自 七牛云

又或者像这样:

前者,不经由 Laravel,使用原生 Composer, 舍弃了包的管理,显然有问题。后者,在现在的逻辑中,可能会对项目造成巨大的伤害——这个是一次性把所有扩展包更新到最新版本(避免这个问题可以针对单独一个包进行 update,或者在 composer.json 中指定版本号)。

所以今天好好看了下 composer 在 laravel 项目下的一些配置。


Docker 新手上路(一)

新学习了 docker。记录一下。这个系列一共分为5篇,是我初次接触 Docker 的总结。

这几篇是一个很粗略的新手入门。并不足以了解全貌,不过可以让你短时间内了解 Docker 为何物以及一些简单的操作,可以一看。

Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本! 使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!

无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,以在有限的时间内做更多有意义的事。

为什么要使用 Docker?

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

更高效的利用系统资源

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

一致的运行环境

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。

持续交付和部署

对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署 系统进行自动部署。

而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

更轻松的迁移

由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

更轻松的维护和扩展

Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

安装

先查看服务器的版本。lsb_release -a

Distributor ID:	Debian
Description:	Debian GNU/Linux 8.7 (jessie)
Release:	8.7
Codename:	jessie

添加源

按照教程的说法,Debian 8 的内核默认为 3.16,仅仅满足基本的 Docker 运行条件。如果打算使用 overlay2 存储层驱动,或某些功能不够稳定希望升级到较新版本的内核,可以添加 backports 源,升级到新版本的内核。 执行下面的命令添加 backports 源:

$ echo "deb http://http.debian.net/debian jessie-backports main" | sudo tee /etc/apt/sources.list.d/backports.list

升级到 backports 内核:

$ sudo apt-get update
$ sudo apt-get -t jessie-backports install linux-image-amd64

配置存储驱动

升级到 backports 的内核之后,会因为 AUFS 内核模块不可用,而使用默认的 devicemapper 驱动,并且配置为 loop-lvm,这是不推荐的。因此,不要忘记安装 Docker 后,配置 overlay2 存储层驱动。(这一步我跳过了,待熟悉以后再看看存储驱动选择的问题).

安装 Docker

在一切准备就绪后,就可以安装最新版本的 Docker 了,软件包名称为 docker-engine。将当前用户加入 docker 组,然后启动引擎。

$ sudo apt-get install docker-engine
// 如果没有这个包的话,源码安装 $ curl -sSL https://get.docker.com/ | sh
$ sudo usermod -aG docker $USER
$ sudo systemctl enable docker
$ sudo systemctl start docker


vim换行及删除空行

两个简单的命令,但是好容易忘记Orz。正则表达式用的还不熟练。在选择模式下,

  • 空格替换为换行

      :%s/ /\r/g 
    
  • 删除空行

      :g/^$/d
    

参考资料:


linux查看运行级别

Linux运行级别从0~6,共7个。

0:关机。不能将系统缺省运行级别设置为0,否则无法启动。
1:单用户模式,只允许root用户对系统进行维护。
2:多用户模式,但不能使用NFS(相当于Windows下的网上邻居)
3:字符界面的多用户模式。
4:未定义。
5:图形界面的多用户模式。
6:重启。不能将系统缺省运行级别设置为0,否则会一直重启。

  查看运行级别命令:

runlevel

  先后显示系统上一次和当前运行级别。如果不存在上一次运行级别,则用N表示。


1 2 73 74 75 76 77 90 91