docker打包镜像

如何使用Dockerfile打包一个镜像的过程

Posted by 张晨 on January 22, 2021

说明书

学习过docker或者用过docker的朋友们肯定知道docker的镜像。但是大部分朋友只是使用镜像启动,很少去关心过如何打包一个镜像,今天我就来和大家分享我打包docker镜像的过程和说明。

首先,你得要有个需求,就是你要打包什么样的镜像,你是用来干什么的。就比如说,你要打包一个YII2的运行环境,或者你要打包一个swoft的运行环境。当你有了这个需求之后,你就要想办法给它编译一个它的运行环境,接下来我就以我要打包一个YII2的运行环境为例,打包一个基础镜像。

疑问解答

  • 什么是镜像

    镜像就是一个已经部署好基础环境的程序,你只需要使用docker把这个程序运行起来,你就得到了这个环境,你可以在这个环境上做你想做的事情。

  • 什么是容器

    镜像运行起来之后就是一个容器,同一个镜像可以启动多个容器,容器之间互不影响,没有关系。唯一的关系可能就是,他们使用的镜像是一样的。

  • 镜像在哪里来

    docker官方是有提供一个镜像仓库的,你可以在里面找到你想要的大部分镜像。直接docker pull下来就好了。(下面有演示)

    你也可以有自己的镜像厂库,例如阿里云的容器服务。大家可以去参考阿里云

    你也可以通过Dockerfile文件自己打包镜像,或者通过docker commit(不推荐)将现有容器创建为镜像

  • 什么是Dockerfile

    Dockerfile是用来编译镜像的文件,这就是一个简单的文本文件,里面写满了命令,命令就是你要打包的整个过程。docker提供了一个unix的基础内核,你要在这里基础上,执行一条一条的命令,配置好你要的环境。打包的整个过程就是在执行这些命令,等全部执行完了,也就打包成功了。但是,通常我们会引用别人已经打包的某个基础镜像,这样方便很多。

步骤

明白需求

我们新启动一个项目是使用PHP开发的,和企业微信有关的,企业微信是有一个sdk包的,需要将这个扩展添加到PHP上面去。而且我们这套项目是yii2框架的。我们必须使用的扩展是Redis、MongoDB扩展。

所以现在需求就很明白了。

  1. PHP运行环境
  2. YII2运行环境
  3. 企业微信sdk扩展
  4. Redis扩展
  5. MongoDB扩展

找基础镜像

我们使用的yii2的框架,yii2肯定是有提供基础镜像的,所以我们先去找找看,yii2是否有提供基础镜像。果不其然,yii2是有提供官方的基础运行环境的。然后我们在这个镜像的基础上面添加我们要的扩展就好了。

运行基础镜像,安装所需的环境

1
2
3
4
5
6
7
8
9
10
11
# 拉取yii2提供的镜像
docker pull yiisoftware/yii2-php:7.4-fpm

# 后台运行镜像
docker run -d yiisoftware/yii2-php:7.4-fpm
# 运行成功之后会显示这个镜像名
# 441189**********
# 只需要前面几位就可以了

# 进入容器
docker exec -it 441189 bash

以下命令是在容器中操作的

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 查看已有扩展
php -m

# 查看mongodb版本
php --ri mongodb

# 安装Redis扩展
pecl install redis

# 应用redis扩展
docker-php-ext-enable redis

# 查看Redis是否安装成功
php -m | grep redis

# 查看Redis版本
php --ri redis

# 安装企业微信sdk
# https://github.com/pangdahua/php7-wxwork-finance-sdk
git clone https://github.com/pangdahua/php7-wxwork-finance-sdk.git

# 进入目录下载微信sdk扩展
cd php7-wxwork-finance-sdk

# 下载微信企业sdk
wget https://rescdn.qqmail.com/node/wework/images/sdk_20190313.zip
# 结果发现报错了。说我们没有wget命令。那我们就安装一个

# 安装wget命令
apt-get update
apt-get install wget

# 重新下载企业微信sdk
wget https://rescdn.qqmail.com/node/wework/images/sdk_20190313.zip

# 解压缩
unzip sdk_20190313.zip

# 编译命令
# 准备环境
phpize
# 编译环境 with-wxwork-finance-sdk这是企业微信Csdk目录。这个要填写正确哦
./configure --with-php-config=/usr/local/bin/php-config --with-wxwork-finance-sdk=/app/php7-wxwork-finance-sdk/sdk_20190313/C_sdk/
# 编译和安装
make && make install

# 应用扩展
docker-php-ext-enable wxwork_finance_sdk.so

# 查看扩展
php -m
# 结果发现报错了,原因是和intl扩展冲突了。我们把这个扩展注释掉
# 参考: https://github.com/pangdahua/php7-wxwork-finance-sdk/issues/28

# 查看一下php的配置文件目录内容
ls /usr/local/etc/php/conf.d/

cat /usr/local/etc/php/conf.d/docker-php-ext-intl.ini
# 注释掉它
echo ";extension=intl.so" > /usr/local/etc/php/conf.d/docker-php-ext-intl.ini

# 查看我们的扩展是否装好
php -m | grep wxwork_finance_sdk
# 大功告成。我们的环境已经装好了

编写Dockerfile文件

现在我们就可以根据刚才我们在容器里面执行过的命令。来写打包文件了。

还记得我们在里面用git clone了一个项目和用wget下载了一个企业微信SDK吗?

我们不要把这个过程放在打包过程中了。我们直接先在宿主机下载好。再拷贝进去就好了

如下是我的Dockerfile文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 企业微信基础镜像打包

# yii2基础镜像
FROM yiisoftware/yii2-php:7.4-fpm

# 拷贝php7-wxwork-finance-sdk 和 微信sdk进去
COPY ./php7-wxwork-finance-sdk /app/php7-wxwork-finance-sdk

# 安装Redis扩展和wxwork-finance-sdk
RUN apt-get update \
    && pecl install redis \
    && docker-php-ext-enable redis \
    && cd /app/php7-wxwork-finance-sdk \
    && phpize \
    && ./configure --with-php-config=/usr/local/bin/php-config --with-wxwork-finance-sdk=/app/php7-wxwork-finance-sdk/sdk_20190313/C_sdk \
    && make && make install \
    && echo ";extension=intl.so" > /usr/local/etc/php/conf.d/docker-php-ext-intl.ini \
    && docker-php-ext-enable wxwork_finance_sdk.so

打包和发布我们的镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 在你的Dockerfile同级目录中执行 最后面这个.一定要
docker build -t wxwork:latest .
# 到现在你的镜像就可以用了,但是你可能需要把它发布到你的镜像仓库里面去
# 下面以我的仓库为例

# 登录docker
docker login --username=zhangrongxxxx
# 自己输入密码

# 重新打一个tag
docker image tag wxwork:latest zhangrongxxxx/wxwork:latest

# 推送到仓库
docker push zhangrongxxxx/wxwork:latest
# 完成

总结

其实自己打包镜像也是非常简单的,主要是你要找好自己的基础镜像,然后运行这个基础镜像,安装你要的环境,把命令记下来。然后全部写到Dockerfile文件里面去。一次性执行打包成镜像。然后这个镜像就不会变了。

这篇文章建立在已经对docker已经有了解的情况下。如果是零基础的话,还是有难度的。下期教大家docker零基础的内容,敬请期待。

对文章中有什么不懂的或者文章中的错误可以直接联系我哦email: admin@zrongdong.com

参考链接