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

冉升5个月前行业资讯244

在现代软件开发中,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


相关文章

CMP?MSP?1+1才能大于2

CMP?MSP?1+1才能大于2

CMP与MSP都已经出现有一段时间了,而业界对于两个名词略有混淆,CMP和MSP到底是什么,能做什么,互相边界是什么,是互补还是互相竞争傻傻分不清楚。笔者试从自己十多年的云计算实践以及对于Gartne...

RabbitMQ 进阶2(消费者可靠性+延迟消息)

RabbitMQ 进阶2(消费者可靠性+延迟消息)

三、消费者可靠性当RabbitMQ向消费者投递消息以后,需要知道消费者的处理状态如何。因为消息投递给消费者并不代表就一定被正确消费了,可能出现的故障有很多,比如:消息投递的过程中出现了网络故障消费者接...

gitlab和jenkins连接

gitlab和jenkins连接

一:jenkins 配置安装gitlab插件   生成密钥id_rsa 要上传到jenkins,id_rsa.pub要上传到gitlabcat /root/.ssh/id_rsa复...

【Docker 】深入探索 Docker :高阶操作与配置设置(下)

【Docker 】深入探索 Docker :高阶操作与配置设置(下)

四、容器的资源限制Docker 允许用户限制容器使用的系统资源,如 CPU 和内存,从而确保其他容器和主机的稳定性。4.1 限制 CPU 使用要限制容器使用的 CPU 核心,可以使用 --cpus 参...

大数据存储方案

大数据存储方案

1 结构布局目前大数据存储有两种方案可供选择:行存储和列存储。业界对两种存储方案有很多争持,集中焦点是:谁能够更有效地处理海量数据,且兼顾安全、可靠、完整性。从目前发展情况看,关系数据库已经不适应这种...

【JavaEE初阶】网络编程TCP协议实现回显服务器以及如何处理多个客户端的响应

【JavaEE初阶】网络编程TCP协议实现回显服务器以及如何处理多个客户端的响应

1.TCP相关API 和前一期的UDP基本是大差不差的,但是这里提供的方法来模拟对于网卡的操作是有一定的区别的,所示API如下:ServerSocket是Socket类对应到网卡给服务器使用...

发表评论    

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