Docker实践与应用举例

Docker已然成为现代软件开发和布署中的重要工具,通过容器化技术,开发者可以轻松管理应用的依赖环境、简化布署流程,并实现跨平台兼容性。本篇博客将详尽介绍Docker的基本概念、实践操作以及应用场景,帮助开发者把握Docker的使用并在实际项目中应用。

在这里插入图片描述

一、Docker基本概念1.1Docker是哪些?

Docker是一种开源的容器化平台,容许开发者将应用程序及其依赖环境封装在轻量的容器中。这种容器能否跨越不同的操作系统和平台运行,极大简化了环境配置和兼容性问题。它基于Linux内核的cgroup和namespace技术实现了进程隔离。

1.2容器与虚拟机的区别

容器与虚拟机(VM)都是为了解决应用隔离问题,但二者的实现方法不同:

特点容器虚拟机

启动速率

占用资源

系统隔离

使用场景

应用布署、开发

完整操作系统隔离、强安全需求

在这里插入图片描述

二、Docker基本操作2.1安装Docker

在Windows、Mac和Linux系统上,安装Docker的步骤有所不同。这儿以Ubuntu系统为例介绍Docker的安装流程:

# 更新软件包
sudo apt-get update
# 安装依赖
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# 添加 Docker 官方的 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 启动 Docker 并设置开机启动

docker部署web应用_应用部署是什么意思_应用部署模式有哪些

sudo systemctl start docker sudo systemctl enable docker # 验证安装是否成功 docker --version

2.2Docker基本命令

拉取镜像:从DockerHub获取官方镜像

docker pull ubuntu:latest

启动容器:启动一个Ubuntu容器并步入交互模式

docker run -it ubuntu:latest /bin/bash

查看运行中的容器:列举当前正在运行的容器

docker ps

停止容器:停止指定的容器

docker stop <container_id>

删掉容器:删掉已停止的容器

docker rm <container_id>

删掉镜像:删掉本地的镜像

docker rmi ubuntu:latest

在这里插入图片描述

三、Docker实践案例3.1使用Docker建立简单的Web应用

接出来linux内存管理,我们将通过Docker来建立一个简单的Node.jsWeb应用,并打包为Docker镜像便于运行在不同环境中。

3.1.1创建Node.js项目

首先,我们编撰一个简单的Node.js应用,响应HTTP恳求。

创建项目目录:

mkdir docker-node-app
cd docker-node-app

初始化项目并安装依赖:

npm init -y
npm install express

编撰app.js:

// app.js

应用部署模式有哪些_docker部署web应用_应用部署是什么意思

const express = require('express'); const app = express(); const PORT = 3000; app.get('/', (req, res) => { res.send('Hello, Docker!'); }); app.listen(PORT, () => { console.log(`Server is running on http://localhost:${PORT}`); });

3.1.2编撰Dockerfile

在项目目录中创建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"]

3.1.3建立Docker镜像

使用Dockerfile建立镜像:

docker build -t docker-node-app .

3.1.4运行容器

应用部署是什么意思_应用部署模式有哪些_docker部署web应用

打造完成后,使用以下命令启动容器并访问Web应用:

docker run -p 3000:3000 docker-node-app

访问浏览器中的:3000,可以看见Hello,Docker!的输出。

3.2使用DockerCompose编排多个容器

在实际项目中,应用程序一般依赖多个服务(如数据库、缓存服务等)。这时可以使用DockerCompose来同时启动和管理多个容器。

3.2.1创建DockerCompose文件

假定我们有一个Node.js应用,但是它依赖于PostgreSQL数据库。我们可以使用DockerCompose来编排这两个服务。

首先,创建一个docker-compose.yml文件:

version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: postgres:13
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydatabase
    volumes:
      - db-data:/var/lib/postgresql/data
volumes:
  db-data:

3.2.2启动应用

使用以下命令启动多容器应用:

docker-compose up

这将同时启动Node.js应用和PostgreSQL数据库,但是二者可以通过网路互相通信。

3.2.3访问服务

打开浏览器,访问:3000,仍然可以见到Hello,Docker!的输出。与此同时,Node.js应用可以联接到db服务访问PostgreSQL数据库。

在这里插入图片描述

四、Docker实际应用场景

开发环境一致性:开发人员可以通过Docker容器来确保每位人的开发环境一致,避开了“在我的机器上没问题”的问题。

docker部署web应用_应用部署模式有哪些_应用部署是什么意思

手动化测试:CI/CD流水线中,使用Docker可以在每次代码递交后手动建立并运行测试环境docker部署web应用,确保代码的稳定性。

应用隔离:在同一台主机上运行多个应用时,每位应用可以独立运行在不同的容器中,防止互相干扰。

微服务构架:Docker天然适宜微服务构架的应用,每位微服务都可以打包成独立的容器,并通过DockerCompose或则Kubernetes编排。

在这里插入图片描述

五、进阶方法与最佳实践

在实际的开发与布署过程中,Docker提供了许多进阶方法和最佳实践,帮助开发者更高效地管理容器及其镜像。

5.1使用.dockerignore文件

和.gitignore文件类似LINUX虚机,Docker提供了.dockerignore文件,拿来指定在建立镜像时,什么文件或目录应当被忽视。这样可以防止将无关文件(如本地日志、node_modules或则Git相关文件)复制到镜像中,减低镜像的大小和建立时间。

示例.dockerignore文件:

node_modules
npm-debug.log
.git

5.2多阶段建立(Multi-stageBuilds)

多阶段建立容许在一个Dockerfile中使用多个FROM句子,以优化镜像大小和完善过程。比如,你可以在一个镜像中进行应用的建立,之后只将最终建立的产物复制到另一个轻量级镜像中。

下边是一个使用多阶段建立的示例,在建立Node.js应用时,只将最终编译后的文件复制到新的镜像中:

# 第一阶段:构建阶段
FROM node:14 as builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 第二阶段:生产环境
FROM node:14-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/app.js"]

这些方法能有效降低镜像的容积,防止毋须要的依赖和中间文件被打包到最终镜像中。

5.3镜像缓存与分层优化

Docker镜像是基于层(layer)建立的,每一条Dockerfile指令就会生成一个新的镜像层。因而,合理地组织Dockerfile,可以大大增强建立效率,借助Docker缓存,防止每次建立时重复执行相同的步骤。

比如,在Dockerfile上将不常变化的指令(如安装依赖)放到上面,变化较多的指令(如复制代码)置于前面,这样可以更好地借助缓存。

# 先安装依赖
COPY package*.json ./
RUN npm install
# 后复制代码
COPY . .

5.4数据卷和持久化储存

应用部署是什么意思_应用部署模式有哪些_docker部署web应用

容器中的数据是临时的,假如容器被删掉,所有的容器内数据就会遗失。因而,使用数据卷(Volume)可以持久化数据,并容许容器间共享数据。

使用Docker命令挂载卷:

docker run -d -v /host/data:/container/data myapp

这将宿主机的/host/data目录挂载到容器内的/container/data目录,确保数据在容器停止后仍然存在。

5.5使用docker-compose.yml文件进行环境变量管理

在实际应用中,不同环境(开发、测试、生产)一般会使用不同的配置。使用DockerCompose,可以在docker-compose.yml中配置环境变量,或则通过.env文件来管理。

version: '3'
services:
  web:
    image: myapp
    environment:
      - NODE_ENV=production
      - DB_HOST=db
  db:
    image: postgres
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=secret

或则使用.env文件来设置:

NODE_ENV=production
DB_HOST=db

之后在docker-compose.yml中通过${VAR_NAME}的形式引用环境变量:

environment:
  - NODE_ENV=${NODE_ENV}
  - DB_HOST=${DB_HOST}

5.6安全性与权限管理

在生产环境中,运行Docker容器时要非常注意安全问题。以下是几个常见的安全实践:

在这里插入图片描述

六、总结

通过Docker,开发者可以快速建立、测试和布署应用,解决环境不一致性的问题,并大大提升团队协作效率。本文详尽介绍了Docker的基础操作、应用案例、进阶方法和最佳实践。从建立简单的Web应用,到使用DockerCompose编排多容器应用,再到优化Dockerfile和提高容器安全性docker部署web应用,每位环节都展示了Docker在现代开发中的强悍作用。

在未来,Docker及其相关的容器化技术(如Kubernetes)将继续在云原生构架中饰演重要角色。通过把握Docker,你将能更好地应对复杂的应用布署和管理需求,提高开发和运维的整体效率。

在这里插入图片描述

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复