如何构建Docker镜像
更新时间:2023-06-14
DockerHub已经为广大开发者提供了大量优秀的的可用镜像,详情可查看DockerHub 官网。
由于实际场景的多样性,并非所有应用都能在DockerHub找到对应的镜像来使用。您可以通过以下教程学习如何构建个性化Docker镜像。
Docker生成镜像目前有两种方式:
- 通过Dockerfile自动构建镜像;
- 通过对已有容器执行Commit命令打包生成镜像。
Dockerfile自动编译生成
下面以Dockerhub官方提供的WordPress为例,可转到 github 查看详情
相关的Dockfile源码如下:
Plain Text
1 FROM php:5.6-apache
2
3 # install the PHP extensions we need
4 RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev && rm -rf /var/lib/apt/lists/* \
5 && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
6 && docker-php-ext-install gd mysqli opcache
7
8 # set recommended PHP.ini settings
9 # see https://secure.php.net/manual/en/opcache.installation.php
10 RUN { \
11 echo 'opcache.memory_consumption=128'; \
12 echo 'opcache.interned_strings_buffer=8'; \
13 echo 'opcache.max_accelerated_files=4000'; \
14 echo 'opcache.revalidate_freq=2'; \
15 echo 'opcache.fast_shutdown=1'; \
16 echo 'opcache.enable_cli=1'; \
17 } > /usr/local/etc/php/conf.d/opcache-recommended.ini
18
19 RUN a2enmod rewrite expires
20
21 VOLUME /var/www/html
22
23 ENV WORDPRESS_VERSION 4.6.1
24 ENV WORDPRESS_SHA1 027e065d30a64720624a7404a1820e6c6fff1202
25
26 RUN set -x \
27 && curl -o wordpress.tar.gz -fSL "https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz" \
28 && echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c - \
29 # upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
30 && tar -xzf wordpress.tar.gz -C /usr/src/ \
31 && rm wordpress.tar.gz \
32 && chown -R www-data:www-data /usr/src/wordpress
33
34 COPY docker-entrypoint.sh /usr/local/bin/
35 RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
36
37 # ENTRYPOINT resets CMD
38 ENTRYPOINT ["docker-entrypoint.sh"]
39 CMD ["apache2-foreground"]
上述Dockerfile文件中的描述如何完成WordPress应用所需基础环境构建。
在终端创建一个文件夹来保存该Dockerfile文件,并通过 docker build 命令来构建镜像。
Plain Text
1 [root@instance-hlf45x1g-1 worldpress]# docker build -t worldpress:latest ./
2 Sending build context to Docker daemon 3.072 kB
3 Step 1 : FROM php:5.6-apache
4 Trying to pull repository docker.io/library/php ...
5 5.6-apache: Pulling from docker.io/library/php
6 386a066cd84a: Pull complete
7 269e95c6053a: Pull complete
8 ......
通过 docker images 命令即可查看到构建完成的镜像。
Plain Text
1 [root@instance-hlf45x1g-1 worldpress]# docker images
2 REPOSITORY TAG IMAGE ID CREATED SIZE
3 worldpress latest 9f0b470b5ddb 13 minutes ago 420 MB
4 docker.io/php 5.6-apache eb8333e24502 7 days ago 389.7 MB
使用Dockerfile来构建镜像有以下建议:
- 尽量选择Docker官方提供基础镜像作为基线。
- Dockerfile前几行的指令应尽量选择一般性、通用性的指令完成相关依赖软件的安装及操作,从而有效利用缓存。
- 只安装必须的软件包,减小镜像大小。
- 多条 RUN 命令使用'\'连接,有利于理解且方便维护。
- 通过 -t 标记构建镜像,有利于管理新创建的镜像。
- 清晰的注释,提高可读性。
- 完成构建后,请先进行本地启动验证其功能性。
执行Commit实现打包生成镜像
通过Dockerfile可以快速构建镜像,而通过commit为如何将一个已经存在的容器镜像化提供了解决方案。
通过commit构建镜像操作如下:
1.运行并进入基于基础镜像的容器内。
Plain Text
1 [root@instance-hlf45x1g-1 ~]# docker run -i -t centos
2.安装需要的软件,并添加配置。
Plain Text
1 [root@c4f1basa4w76 /]# yum update && yum install openssh-server
2 Loaded plugins: fastestmirror, ovl
3 base | 3.6 kB 00:00:00
4 extras | 3.4 kB 00:00:00
5 updates | 3.4 kB 00:00:00
6 (1/4): base/7/x86_64/group_gz | 155 kB 00:00:00
7 (2/4): extras/7/x86_64/primary_db | 166 kB 00:00:00
8 (3/4): base/7/x86_64/primary_db | 5.3 MB 00:00:00
9 (4/4): updates/7/x86_64/primary_db
10 ......
11 ......
12 ......
13 Dependency Installed:
14 fipscheck.x86_64 0:1.4.1-5.el7 fipscheck-lib.x86_64 0:1.4.1-5.el7 openssh.x86_64 0:6.6.1p1-25.el7_2 tcp_wrappers-libs.x86_64 0:7.6-77.el7
3.配置完成后打开新终端保存该镜像。
Plain Text
1 [root@instance-hlf45x1g-1 ~]# docker ps
2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3 c4f1basa4w76 centos "/bin/bash" 13 minutes ago Up 13 minutes fashion_surl
4 [root@instance-hlf45x1g-1 ~]# docker commit c4f1basa4w76 my_centos:1.0
5 sha256:65325ffd2af9d574afca917a8ce81cf8a710e6d1067ee611a87087e1aa88e4a4
6 [root@instance-hlf45x1g-1 ~]# docker images
7 REPOSITORY TAG IMAGE ID CREATED SIZE
8 my_centos 1.0 65325ffd2af9 16 seconds ago 307.8 MB