Docker 新手上路(三)

今天的好玩新闻有这几件事:

前几天新学习了 docker 的基本知识,包括安装、环境配置、获取和运行镜像等最基础的东西。今天看看一些简单的网络配置和相关的开源软件。更加深入的内容暂时就不研究了。毕竟作为新手上路已经足够了。

外部访问容器

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。

docker run --name web -d -p 1644:80 nginx
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
docker logs -f web

使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址

docker port web

使用 docker inspect xxx 可以获取特定容器内部网络和 ip 地址所有的变量,-p 标记可以多次使用来绑定多个端口

容器互联

(待完成)

参考资料:


Docker 新手上路(二)——Dockerfile

今天的好玩新闻有这几件事:

  • 英国梅姨一声硬脱欧,英镑兑美元涨了将近2.6%
  • 支付宝又搞起了敬业福,冠华是五福红包的产品经理。
  • 甲骨文北京裁员2000人。
  • 最近火起来一句话,“我可能是x假的x”。
  • 一位微信陌生好友给我推荐了一个专门收集互联网大会的网站

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

列出镜像

$ docker images
$ docker images -a // 中间层镜像
$ docker images xxx // 特定镜像

运行镜像

$ docker run -it --rm debian bash
$ docker run --name webserver -d -p 1644:80 nginx
$ docker run --name web2 -d -p 81:80 nginx:v2

定制镜像

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 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

PHP 的 get_class 方法

今天在写一个虚基类 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 项目下的一些配置。

composer 命令

先简单解释下 composer 命令。

  • composer install - 如有 composer.lock 文件,直接安装,否则从 composer.json 安装最新扩展包和依赖;
  • composer update - 从 composer.json 安装最新扩展包和依赖;
  • composer update vendor/package - 从 composer.json 或者对应包的配置,并更新到最新;
  • composer require new/package - 添加安装 new/package, 可以指定版本,如: composer require new/package ~2.5.

更多详情可以查看 Composer官方网站,或对应的中文网站


Docker 新手上路(一)

新学习了 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
$ 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 3 4 5 6 13 14 15 16 17