内容主要包括 1. docker原理 2. alpine系统 3. php的编译安装 4. 镜像的制作

关于docker

docker作为容器化技术,方便运维对目前分布式、集群的部署进行编排 以及 机器的扩容。docker本质并不是一个硬件隔离的系统,而是通过文件系统以及进程等资源的namespace功能实现了表面上的隔离,在宿主机上 docker 容器其实本质是一个进程。容器实现了软件运行环境的隔离,也就是说对底层包的依赖lib与宿主机进行隔离,这样在进行部署或者增加机器的时候不用关心宿主机的环境,宿主机只需要提供内核以及docker服务就好。

linux系统的启动过程是:

1
2
3
4
5
6
7
# https://www.cnblogs.com/codecc/p/boot.html
BIOS 硬件加电自检 查找并加载MBR
MBR 查找BootLoader 加载grub
GRUB 通过grub配置加载系统内核
Kernel 装载驱动 挂载rootfs 执行/sbin/init
Init OS初始化 执行 runlevel 相关程序
Runlevel 启动指定级别的服务

docker在上面说了,其实是一个线程,所以docker并没有bios、mbr、grub、kernel 这些过程,docker容器使用的是宿主机的内核

docker在使用上其实分为 镜像(image)与容器(container)
镜像相关命令

1
2
3
4
5
6
7
8
docker images 				列出所有的镜像
docker rmi [image_id] 删除镜像
docker pull [image_name] 下载镜像
docker build Dockfile 通过脚本构建镜像
docker load
docker save
docker commit
docker push

容器相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
docker ps -a 						列出所有的容器
docker create -it -v -p [image_id] 创建容器
docker run -it -v -p [image_id] 创建并启动容器
docker start [image_id] 启动容器
docker restart [image_id] 重启容器
docker stop [image_id] 停止容器
docker rm [container_id] 删除容器
docker rename [old_name new_name] 修改容器名字
docker exec -it [image_id cmd] 在容器里执行命令 且 交互式的
docker top [image_id]
docker logs [image_id]
docker export [image_id] ???
docker import [image_id] ???

综上来看 docker其实在文件上来讲就是一个文件系统,下文要说的嵌入式系统 alpine 就提供这样的文件系统,我们接下来会使用他的文件系统来制作base image。alpine是一个嵌入式的 所以系统占用空间非常小,docker官方镜像也在使用alpine作为base image,也可以docker pull alpine或者docker官方的镜像,我这边拉取的镜像存在网络问题,所以我是自己import文件系统制作的镜像。

通过系统文件制作镜像

1
2
3
4
5
6
7
8
9
10
wget http://dl-cdn.alpinelinux.org/alpine/v3.7/releases/x86_64/alpine-minirootfs-3.7.0-x86_64.tar.gz
gunzip alpine-minirootfs-3.7.0-x86_64.tar.gz
cat alpine-minirootfs-3.7.0-x86_64.tar | docker import - alpine:3.7.0

# 此时执行 `docker images` 就可以看到你创建的镜像
docker iamges

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
alpine 3.7.0 b05c13e3639e 47 seconds ago 4.139 MB

关于alpine

alpine官网有对这个系统的简单介绍

Small. Simple. Secure.
Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.

可以看出alpine与centos相比,主要的不同是使用了不同的底层包的工具链,centos使用的是glibc 而 alpine使用的是 musl libc

alpine除了小外,官网提供的pkg系统也是很全的,软件比较新 比 yum 好用的多,我在编译php的过程中可以使用apk完成所有的第三方包的下载安装,不需要自己手动编译第三方包

apk命令

1
2
3
4
5
6
7
8
9
10
11
# 常用命令
apk add [pkg_name]
apk del [pkg_name]
apk search [pkg_name]
apk info [pkg_name]
apk update

# 常用参数
--no-cache 不要从本地缓存中读取
--repository [url] 指定pkg仓库地址 有时候需要下载非stable版(edge) 的时候需要

在alpine里编译php

在alpine进行php源码的编译需要对应平台的编译工具,需要用到的编译工具如下

1
2
3
4
# 这些是通用的gcc编译工具
make autoconf
# 这些看了下大概的介绍 主要是提供了 dl 这样的工具等
build-base abuild binutils

下载php代码 并解压

1
2
wget https://github.com/php/php-src/archive/php-7.2.4.tar.gz
tar -zxvf php-7.2.4.tar.gz

configure

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
./buildconf --force # 生成configure
# 安装依赖包
apk add \
# 命令行 \
bison readline readline-dev \
# 格式 压缩 \
libxslt libxslt-dev libxml2 libxml2-dev openssl openssl-dev bzip2 bzip2-dev curl curl-dev \
# 图片 \
freetype freetype-dev libpng libpng-dev libwebp libwebp-dev libjpeg-turbo libjpeg-turbo-dev \
libsodium libsodium-dev \

# 加密 这里没有稳定版需要指定edge分支的源
apk add argon2 argon2-dev --repository http://dl-cdn.alpinelinux.org/alpine/edge/main --no-cache

#configure 这里主要编译了cli php-fpm
./configure \
--prefix=/usr/local/php-7.2.4 \
--disable-cgi \
--enable-fpm \
--with-readline \
--with-bz2 \
--with-zlib \
--enable-zip \
--with-password-argon2 \
--with-sodium \
--with-openssl \
--enable-mbstring \
--with-gd \
--with-webp-dir \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--enable-gd-jis-conv \
--enable-exif \
--enable-bcmath \
--with-curl \
--enable-sockets \
--with-xsl \
--with-pdo-mysql=shared,mysqlnd \
--disable-rpath \
--without-pear \

make && make install

然后还要安装一些扩展 redis swoole mongodb

1
2
3
4
5
6
wget http://pecl.php.net/get/redis-4.0.0.tgz && tar -zxf redis-4.0.0.tgz
wget http://pecl.php.net/get/swoole-2.1.3.tgz && tar -zxf swoole-2.1.3.tgz
wget http://pecl.php.net/get/mongodb-1.4.2.tgz && tar -zxf mongodb-1.4.2.tgz

/usr/local/php-7.2.4/bin/phpize && ./configure --with-php-config=/usr/local/php-7.2.4/bin/php-config
make && make install

制作docker镜像

通过上一步我们得到了主要的两个二进制文件 bin/php sbin/php-fpm 以及 对应的配置文件
在制作镜像的时候只需要把对应的依赖包装上 然后将这两个二进制文件丢进镜像就好了

安装依赖包

1
2
3
4
5
# 依赖包不需要dev包了,这里不需要编译
apk add bison readline libxslt libxml2 openssl bzip2 curl freetype libpng libwebp libjpeg-turbo libsodium
# 这里的argon2 包需要dev包
apk add argon2 argon2-dev --repository http://dl-cdn.alpinelinux.org/alpine/edge/main --no-cache