容器化技术指南
Docker 是一个开源的容器化平台,它使开发人员能够将应用程序与其依赖项一起打包到一个可移植的容器中,然后部署到任何环境中,确保应用程序在不同环境中一致运行。
容器是一个标准的软件单元,它将代码及其所有依赖项打包在一起,保证应用程序能够在任何环境中快速、可靠地运行。Docker 容器基于 Docker 镜像运行,包含了运行应用程序所需的一切:代码、运行时环境、系统工具、系统库和设置。
虽然 Docker 和虚拟机都提供了隔离环境,但它们的架构有很大不同:
在 Ubuntu 上安装 Docker 的步骤:
# 更新包索引 sudo apt-get update # 安装必要的依赖 sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release # 添加 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=amd64 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 会在镜像的顶部添加一个可写层,容器中的所有更改都写入这个可写层。
# 列出本地镜像 docker images # 搜索镜像 docker search ubuntu # 拉取镜像 docker pull ubuntu:20.04 # 删除镜像 docker rmi ubuntu:20.04 # 构建镜像 docker build -t myapp:1.0 .
# 创建并启动容器 docker run -d -p 8080:80 --name mywebserver nginx # 列出运行中的容器 docker ps # 列出所有容器(包括停止的) docker ps -a # 停止容器 docker stop mywebserver # 启动已停止的容器 docker start mywebserver # 在运行的容器中执行命令 docker exec -it mywebserver bash
常用参数说明:
-d
:后台运行容器-p host_port:container_port
:端口映射--name
:指定容器名称-v host_path:container_path
:挂载卷-e KEY=VALUE
:设置环境变量-it
:交互式终端Dockerfile 是一个文本文件,包含了构建 Docker 镜像所需的指令。通过 Dockerfile,您可以定义镜像的基础环境、安装软件、配置文件、启动命令等。
# 基于官方 Node.js 镜像
FROM node:14
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用程序代码
COPY . .
# 设置环境变量
ENV NODE_ENV=production
# 暴露端口
EXPOSE 3000
# 定义容器启动命令
CMD ["npm", "start"]
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YAML 文件来配置应用程序的服务,然后使用一个命令创建并启动所有服务。
version: '3'
services:
web:
build: ./web
ports:
- "8080:80"
depends_on:
- db
environment:
- DATABASE_URL=mysql://user:password@db:3306/webdb
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
- MYSQL_DATABASE=webdb
- MYSQL_USER=user
- MYSQL_PASSWORD=password
volumes:
db_data:
# 启动所有服务 docker-compose up # 后台启动所有服务 docker-compose up -d # 停止服务 docker-compose down # 查看服务状态 docker-compose ps
# 列出网络 docker network ls # 创建网络 docker network create mynetwork # 将容器连接到网络 docker network connect mynetwork mycontainer
# 创建卷 docker volume create mydata # 列出卷 docker volume ls # 使用卷启动容器 docker run -d -v mydata:/var/lib/mysql --name mysql mysql:5.7
version: '3'
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
command: npm run dev
db:
image: postgres:13
volumes:
- pg_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=password
- POSTGRES_USER=user
- POSTGRES_DB=myapp_dev
volumes:
pg_data:
检查方法:
# 查看容器详细信息 docker inspect container_id # 查看容器日志 docker logs container_id
# 删除所有停止的容器 docker container prune # 删除所有未使用的镜像 docker image prune # 一次性清理所有未使用的资源 docker system prune
Docker 在 CI/CD 流程中的应用:
Docker 为开发和部署应用程序提供了一种强大而灵活的方式,它通过容器化技术解决了"在我的机器上能运行"的问题,并提供了一致的环境。
主要优势包括:
进一步学习:建议进一步学习 Kubernetes、容器安全、CI/CD 等相关技术,以充分利用容器化带来的优势。