【Docker 】提升开发效率的 Docker 实践技巧

冉升10个月前行业资讯786

在现代软件开发中,Docker 已成为重要的工具之一。本文将介绍如何利用 Docker 的构建缓存、自定义镜像、私有镜像仓库,以及环境变量来优化开发流程。

一、构建缓存

合理安排 Dockerfile 中的指令顺序,可以显著提高镜像构建速度,尤其是当依赖项不变时。

使用构建缓存:

将依赖项的安装和代码复制分开,Docker 可以利用缓存加速构建。


示例:

# 将依赖项复制到镜像中,利用缓存
COPY package.json .
RUN npm install
# 只有在代码变更时才会重新构建这一步
COPY . .
RUN npm run build

二、自定义镜像

根据项目需求,可以基于现有镜像创建新的自定义镜像。

基于现有镜像创建新镜像

从一个基础镜像开始,添加所需的自定义内容。

示例

FROM ubuntu:latest
RUN apt-get update && apt-get install -y curl
COPY my_script.sh /usr/local/bin/
ENTRYPOINT ["bash", "/usr/local/bin/my_script.sh"]

三、管理和分发 Docker 镜像

有效管理和分发 Docker 镜像是团队协作的关键。

3.1 使用 Docker Hub

将本地镜像推送到 Docker Hub,以便于分享和部署。

示例

# 登录到 Docker Hub
docker login

# 打标记镜像
docker tag my_image myusername/my_image:latest

# 推送到 Docker Hub
docker push myusername/my_image:latest

3.2 创建私有 Registry

如果需要私密管理镜像,可以创建一个私有 Docker Registry。

示例

# 启动私有 Registry
docker run -d -p 5000:5000 --name registry registry:2

# 推送到私有 Registry
docker tag my_image localhost:5000/my_image
docker push localhost:5000/my_image

四、在容器中使用环境变量

环境变量可以帮助配置应用并在不同环境中运行相同的镜像。

4.1 在 Dockerfile 中设置环境变量

通过 ENV 指令设置环境变量,使得容器中的应用能够识别这些变量。

示例

FROM node:14
ENV NODE_ENV=production
WORKDIR /app
COPY . .
RUN npm install

4.2 使用 .env 文件

在项目根目录创建一个 .env 文件,用于存储环境变量。例如:

DB_USER=root
DB_PASS=example

在 docker-compose.yml 中引用这个 .env 文件:

services:
  db:
    image: mysql:latest
    env_file:
      - .env

4.3 在运行时传递环境变量

在启动容器时,可以通过 -e 标志来传递环境变量。

示例

docker run -e NODE_ENV=development my_image

五、自定义 Entrypoint 和 CMD

通过自定义 ENTRYPOINT 和 CMD,可以精确控制容器的启动行为。

5.1 设置 Entrypoint

使用 ENTRYPOINT 指令定义容器启动时执行的命令。

示例

FROM python:3.9
COPY . /app
WORKDIR /app
ENTRYPOINT ["python", "app.py"]

5.2 使用 CMD 提供默认参数

利用 CMD 为 ENTRYPOINT 提供默认参数。

示例

FROM ubuntu:20.04
COPY script.sh /usr/local/bin/script.sh
RUN chmod +x /usr/local/bin/script.sh
ENTRYPOINT ["/usr/local/bin/script.sh"]
CMD ["--help"]

六、使用 Docker API 和安全最佳实践

本章将介绍如何通过 Docker API 进行容器管理,以及提高 Docker 安全性的最佳实践。这些内容将帮助开发者更有效地使用 Docker,同时确保容器环境的安全性。


6.1 使用 Docker API 进行容器管理

Docker API 提供了一个强大的接口,允许用户在不直接使用命令行的情况下对 Docker 进行操作和监控。


1. 监控 Docker Daemon 状态


可以使用 curl 命令调用 Docker API 来获取 Docker Daemon 的状态信息,例如已存在的镜像列表。

curl --unix-socket /var/run/docker.sock http://localhost/images/json

2. 创建新的容器

使用 Docker API 可以轻松创建新的容器,只需发送一个包含必要参数的 POST 请求。

curl -X POST -H "Content-Type: application/json" \
  --data '{"Image": "nginx", "Cmd": ["nginx", "-g", "daemon off;"]}' \
  --unix-socket /var/run/docker.sock http://localhost/containers/create

6.2 Docker 安全最佳实践

为了保护 Docker 容器和主机系统,遵循安全最佳实践是至关重要的。

1. 使用 Docker Bench Security

Docker Bench Security 是一个开源工具,用于检查 Docker 安全配置并提供改进建议。

git clone https://github.com/docker/docker-bench-security.git
cd docker-bench-security
sh docker-bench-security.sh

2. 最小化基础镜像

选择最小化的基础镜像可以减少潜在的攻击面。使用轻量级镜像(如 Alpine)作为基础镜像是一个不错的选择。

FROM alpine:3.14
RUN apk add --no-cache nginx

3. 网络隔离

通过自定义网络实现容器间的隔离,提高网络安全性。

# 创建自定义网络
docker network create my_network

# 在同一网络上运行容器
docker run -d --name web --network my_network nginx
docker run -d --name db --network my_network postgres

七、使用端口映射的多个容器

通过端口映射,可以在同一主机上运行多个容器实例,并使它们共享主机端口。

7.1 运行多个实例

在不同的主机端口上运行同一镜像的多个实例,以便于负载均衡或测试。

示例

docker run -d -p 8081:80 --name web1 nginx
docker run -d -p 8082:80 --name web2 nginx

7.2 访问不同实例

可以通过浏览器或命令行工具(如 curl)访问不同的容器实例。

示例

curl http://localhost:8081
curl http://localhost:8082

总结

通过以上方法,您可以充分利用 Docker 的强大功能,提升开发效率并确保安全性。希望本文能为您的项目带来帮助!

————————————————


 本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!  

云掣基于多年在运维领域的丰富时间经验,编写了《云运维服务白皮书》,欢迎大家互相交流学习:

《云运维服务白皮书》下载地址:https://fs80.cn/v2kbbq

想了解更多大数据运维托管服务、数据库运维托管服务、应用系统运维托管服务的的客户,欢迎点击云掣官网沟通咨询:https://yunche.pro/?t=shequ


相关文章

MyBatisPlus从零到一:快速入门与核心功能详解(1)

MyBatisPlus从零到一:快速入门与核心功能详解(1)

一、快速入门1.1 引入依赖:MybatisPlus 提供了 starter,实现了自动 Mybatis 以及MybatisPlus 的自动装配功能,坐标如下:<dependency>...

微服务保护和分布式事务(1)

微服务保护和分布式事务(1)

一、微服务保护保证服务运行的健壮性,避免级联失败导致的雪崩问题,就属于微服务保护。为了方便讲解,下面的商品服务是故障方,购物车服务是故障调用方。1.1 微服务保护方案:微服务保护的方案有很多,比如:请...

Docker:技术架构的演进之路

Docker:技术架构的演进之路

前言技术架构是指在软件开发和系统构建中,为了满足业务需求和技术要求,对系统的整体结构、组件、接口、数据流以及技术选型等方面进行的详细设计和规划。它是软件开发过程中的重要组成部分,为开发团队提供了明确的...

Docker: ubuntu系统下Docker的安装

Docker: ubuntu系统下Docker的安装

安装依赖操作系统版本Ubuntu Kinetic 22.10Ubuntu Jammy 24.04 (LTS)Ubuntu Jammy 22.04 (LTS)Ubuntu Focal 20.04 (LT...

中国式IT运维,趟出自己的“长期主义”河流

2018年,Gartner曾做过一次长达6个月的调查问卷。在这个主题为AIOps的问卷中,Gartner选取了500家各行业头部的企业,针对其当下的IT架构来判断调研企业未来是否会加大对于AIOps的...

深度学习之经典网络-AlexNet详解

深度学习之经典网络-AlexNet详解

 AlexNet 是一种经典的卷积神经网络(CNN)架构,在 2012 年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)中表现优异,将 CNN 引入深度学习的新时代。AlexNe...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。