Docker 容器化部署实践之Dockerfile

简介: Docker 容器化部署实践之Dockerfile

就前面两篇文章Docker 容器化部署实践--入门Docker容器化部署实践Docker Compose,我讲了Docker常用命令的使用,通过docker-compose.yml文件进行Docker容器化的编排。

这其中我们基本都是直接Docker pull进行镜像拉取的。我们如果是使用一些基础组件,直接拉取官方当然是很方便,比如nginx,redis,mongo等等。

但是我们应用服务基本会做一些构建操作,做一些定制化操作,安装一些我们需要的特定包。所以今天我们来聊一下Docker的镜像制作,使用Dockerfile进行镜像的构建。


一个例子


为了更好的理解,我们这儿以 hub.docker.com 的官方redis进行为例进行讲解。注释请看命令后面。

FROM debian:stretch-slim  # 基于debian进行安装
RUN groupadd -r redis && useradd -r -g redis redis # 执行命令,创建用户组
ENV GOSU_VERSION 1.10 # 设置环境变量 gosu 类sudo工具
RUN set -ex; \
    \
    fetchDeps=" \
        ca-certificates \
        dirmngr \
        gnupg \
        wget \
    "; \
    apt-get update; \
    apt-get install -y --no-install-recommends $fetchDeps; \
    # 省略部分命令
ENV REDIS_VERSION 5.0.1
ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-5.0.1.tar.gz
ENV REDIS_DOWNLOAD_SHA 82a67c0eec97f9ad379384c30ec391b269e17a3e4596393c808f02db7595abcb
# for redis-sentinel see: http://redis.io/topics/sentinel
RUN set -ex; \
    \
    buildDeps=' \
        ca-certificates \
        wget \
        \
        gcc \
        libc6-dev \
        make \
    '; \
    apt-get update; \
    apt-get install -y $buildDeps --no-install-recommends; \
    # 省略部分命令
RUN mkdir /data && chown redis:redis /data
VOLUME /data  # 挂载匿名卷,避免容器存储层会发生写操作。
WORKDIR /data # 指定工作路径避免 RUN cd .. && do things
COPY docker-entrypoint.sh /usr/local/bin/ # 复制源文件sh到目标bin目录,文件权限保持不变
ENTRYPOINT ["docker-entrypoint.sh"] # 配置容器启动时运行的命令
EXPOSE 6379  # 声明需要监听的端口
CMD ["redis-server"]  # 设置镜像的启动命令


ENTRYPOINTCMD的区别是其中ENTRYPOINT是提供镜像的主命令,允许将镜像当成命令本身来运行,这里是结合辅助脚本docker-entrypoint.sh 使用,CMD 提供命令默认选项。docker-entrypoint.sh 文件和Dockerfile目录一个层级,下面是docker-entrypoint.sh 文件。


# docker-entrypoint.sh
#!/bin/sh
set -e
# first arg is `-f` or `--some-option`
# or first arg is `something.conf`
if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then
    set -- redis-server "$@"
fi
# allow the container to be started with `--user`
if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then
    find . \! -user redis -exec chown redis '{}' +
    exec gosu redis "$0" "$@"
fi
exec "$@"


如果我们要加入自己的配置文件,可以在基于官方redis添加Dockerfile和对应的redis.conf文件。


# Dockerfile
FROM redis
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ] # 后面配置文件是命令对应的参数。


上面的Dockerfile文件声明了镜像的基础镜像,记录着镜像的步骤命令,编写好上面的Dockerfile文件之后,我们使用docker build 命令就可以生成新镜像。


打包镜像要注意


  1. 精简镜像:尽量让每个镜像的用途都比较集中、单一;
  2. 避免不必要的包,比如编辑器
  3. 推荐使用 alpine 只有5MB 或者 debian等小巧镜像。
  4. 使用明确的版本号信息,而非latest,避免一些意外情况。
  5. 减少镜像层数,尽量合并指令,例如多个RUN指令可以合并为一条;
  6. 提高构建镜像速度,在目录下新建一个 .dockerignore 文件来指定要忽略的文件和目录同.gitignore.

另外如果我们没有使用自己构建的镜像,一定要注意第三方镜像的安全性,尽可能从官方维护拉取。因为Docker通过命名空间进行隔离,容器中的应用可以访问系统内核和部分系统文件。如果容器中应用是不可信的,会影响到本地系统。

最后官方提供了编写Dockerfile的最佳实践,感兴趣的同学强烈建议你点击原文进行查看。今天我们就分享到这儿,有问题欢迎交流。

容器化部署实践,我打算从基础操作到实战应用以一个系列进行分享,今天是第三篇Dockerfile 镜像构建,后期我将持续分享更多相关内容,从容器化入门使用到部署实践编排构建等等,欢迎大家持续进行关注。

相关文章
|
10月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
2474 10
|
9月前
|
应用服务中间件 网络安全 nginx
手把手教你使用 Docker 部署 Nginx 教程
本文详解Nginx核心功能与Docker部署优势,涵盖镜像拉取、容器化部署(快速、挂载、Compose)、HTTPS配置及常见问题处理,助力高效搭建稳定Web服务。
4003 4
|
10月前
|
JavaScript 算法 前端开发
【Docker项目实战】使用Docker部署paopao-ce微社区
【Docker项目实战】使用Docker部署paopao-ce微社区
694 84
【Docker项目实战】使用Docker部署paopao-ce微社区
|
10月前
|
存储 Docker Python
docker 部署 sftp
本文介绍SFTP服务的部署与配置,包括users.conf用户配置规则、Docker容器运行命令及上传目录权限说明,重点解析atmoz/sftp镜像的chroot机制与子目录映射,确保用户登录后正确访问/upload目录,并提供Python脚本实现文件上传示例。
827 12
docker 部署 sftp
|
9月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
421 5
|
10月前
|
运维 Linux 数据库
基于 Docker 部署 n8n 指南,新手一看就会
本教程详解如何通过 Docker 快速部署开源自动化工具 n8n,适合新手快速上手。内容涵盖官方部署步骤、常见难点及第三方一键部署方案,助你高效搭建自动化工作流平台。
2318 6
|
9月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
2754 8
|
9月前
|
存储 搜索推荐 数据库
🚀 RAGFlow Docker 部署全流程教程
RAGFlow是开源的下一代RAG系统,融合向量数据库与大模型,支持全文检索、插件化引擎切换,适用于企业知识库、智能客服等场景。支持Docker一键部署,提供轻量与完整版本,助力高效搭建私有化AI问答平台。
8102 8
|
9月前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
1201 4

相关产品

  • 容器服务Kubernetes版