目录

docker实践与应用举例

docker实践与应用举例

在当今快速迭代的软件开发和部署环境中,容器化技术成为了提升效率、保障一致性的关键手段。Docker作为容器化技术的佼佼者,以其 轻量级、可移植性和高效性 ,彻底改变了应用程序的开发、交付和运行方式。

Docker是一个 基于Go语言开发的开源应用容器引擎 ,它遵循Apache 2.0协议。Docker容器技术允许开发者将 应用及其依赖项打包到一个轻量级的、可移植的容器中 ,并在任何安装了Docker的环境中快速部署运行。Docker的主要组件包括Docker客户端(用户与Docker交互的主要接口)、Docker守护进程(负责管理和运行容器,处理容器的生命周期,管理镜像、网络、存储等)、Docker镜像(一个只读的文件系统快照,包含了应用程序运行所需的文件、库和依赖项)、Docker容器(基于Docker镜像创建的运行实例,提供了一个 隔离的环境 ,包括文件系统、进程空间和网络)以及Docker仓库(用于存储和分享Docker镜像,Docker Hub是一个公共的Docker仓库)。

背景 :在软件开发过程中,设置和配置开发环境是一项耗时且容易出错的任务。特别是对于复杂的项目,开发环境可能包含大量的依赖和配置。Docker可以通过提供一致的开发环境来解决这个问题。

实现步骤

(1)编写Dockerfile

# 使用Python官方镜像作为基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install -r requirements.txt

# 复制应用程序代码
COPY . .

# 启动应用程序
CMD ["python", "app.py"]

解释:

  • FROM python:3.9-slim :使用Python 3.9的官方镜像作为基础镜像,并选择了slim版本以减小镜像体积。
  • WORKDIR /app :设置工作目录为 /app
  • COPY requirements.txt . :将本地的 requirements.txt 文件复制到容器的当前目录下。
  • RUN pip install -r requirements.txt :安装 requirements.txt 文件中列出的所有依赖项。
  • COPY . . :将本地的应用程序代码复制到容器的当前目录下。
  • CMD ["python", "app.py"] :设置容器启动时执行的命令为运行 app.py

(2)构建Docker镜像

docker build -t my-python-app .

解释:

  • -t my-python-app :为构建的镜像指定名称为 my-python-app
  • . :表示Dockerfile在当前目录下。

(3)运行Docker容器

docker run -it --rm -v $(pwd):/app my-python-app

解释:

  • -it :以交互模式运行容器,并分配一个伪终端。
  • --rm :容器停止后自动删除容器。
  • -v $(pwd):/app :将当前目录挂载到容器的 /app 目录下,这样可以在容器内直接修改代码并实时反映到宿主机上。

效果 :通过这种方式,开发人员可以在统一的Python环境中工作,无需担心不同系统之间的兼容性问题。即使切换开发机器或系统,也能保持一致的依赖和配置。

背景 :在实际项目中,应用通常依赖多个服务,如数据库、缓存等。Docker Compose是一个工具,用于定义和运行多容器Docker应用程序。通过一个YAML文件来配置应用的服务,可以使用一个命令创建并启动所有服务。

实现步骤

(1)编写 docker-compose.yml 文件

version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: postgres
    environment:
      POSTGRES_USER: example
      POSTGRES_PASSWORD: example

解释:

  • version: '3' :指定Docker Compose文件的版本。
  • services :定义服务列表。
  • web :定义Web服务。
    • build: . :使用当前目录下的Dockerfile构建镜像。
    • ports :将容器的3000端口映射到宿主机的3000端口。
    • depends_on :指定Web服务依赖于db服务。
  • db :定义数据库服务。
    • image: postgres :使用官方的PostgreSQL镜像。
    • environment :设置环境变量,用于配置数据库用户和密码。

(2)构建并运行多容器应用

docker-compose up -d

解释:

  • -d :以后台模式运行容器。

效果 :通过这种方式,可以轻松地启动多个相互依赖的服务,并管理它们的生命周期。Docker Compose非常适合用于开发和测试环境,可以模拟真实环境下的服务交互。

背景 :在持续集成和持续交付(CI/CD)流程中,需要确保代码从开发到发布的流程自动化。Docker可以用来创建一致的构建环境和测试环境,确保代码在不同阶段使用相同的应用环境。

实现步骤

(1)编写Dockerfile

# 使用官方的Node.js镜像作为基础镜像
FROM node:14

# 设置工作目录
WORKDIR /usr/src/app

# 复制package.json和package-lock.json到容器中
COPY package*.json ./

# 安装应用依赖
RUN npm install

# 复制应用代码到容器中
COPY . .

# 暴露端口
EXPOSE 3000

# 定义启动命令
CMD ["node", "app.js"]

(2)在CI/CD平台上编写脚本

以Jenkins为例,可以在Jenkinsfile中定义流水线:

pipeline {
    agent {
        docker {
            image 'node:14'
        }
    }
    stages {
        stage('Install Dependencies') {
            steps {
                sh 'npm install'
            }
        }
        stage('Run Tests') {
            steps {
                sh 'npm test'
            }
        }
        stage('Build Docker Image') {
            steps {
                script {
                    docker.build("my-app:${env.BUILD_ID}")
                }
            }
        }
        stage('Push Docker Image') {
            steps {
                script {
                    docker.withRegistry('https://registry.hub.docker.com', 'docker-credentials-id') {
                        dockerImage.push()
                    }
                }
            }
        }
        stage('Deploy') {
            steps {
                sh 'kubectl set image deployment/my-app-deployment my-app=my-app:${env.BUILD_ID}'
            }
        }
    }
}

解释:

  • agent { docker { image 'node:14' } } :指定流水线运行在Node.js 14的Docker容器中。
  • stage('Install Dependencies') :安装应用依赖。
  • stage('Run Tests') :运行测试。
  • stage('Build Docker Image') :构建Docker镜像。
  • stage('Push Docker Image') :将Docker镜像推送到Docker Hub。
  • stage('Deploy') :使用kubectl命令更新Kubernetes部署,以使用新的镜像版本。

效果 :通过这种方式,可以确保代码从开发到发布的流程自动化,减少人为错误,提高开发和运维的效率。

背景 :Nginx是一个高性能的HTTP和反向代理服务器,常用于静态文件服务、负载均衡等场景。Docker可以快速部署Nginx服务器,并方便地进行配置和管理。

实现步骤

(1)编写Dockerfile

# 使用官方的Nginx镜像作为基础镜像
FROM nginx:alpine

# 将静态文件复制到Nginx目录
COPY ./static-html-directory /usr/share/nginx/html

# 暴露端口
EXPOSE 80

解释:

  • FROM nginx:alpine :使用官方的Nginx镜像,并选择了alpine版本以减小镜像体积。
  • COPY ./static-html-directory /usr/share/nginx/html :将本地的静态文件目录复制到容器的Nginx默认目录。
  • EXPOSE 80 :暴露80端口,用于HTTP服务。

(2)构建Docker镜像

docker build -t my-nginx .

(3)运行Docker容器

docker run -d -p 8080:80 my-nginx

解释:

  • -d :以后台模式运行容器。
  • -p 8080:80 :将容器的80端口映射到宿主机的8080端口。