Docker 基础入门

Docker 基础入门
Photo by Annie Spratt / Unsplash

引言

Docker 是一个开源的容器化平台,它能够将应用及其所有依赖包在容器中进行打包,使其可以在任何地方运行,保证开发环境的一致性。无论是在本地开发环境、测试环境,还是在生产环境中,Docker 都能提供高效的解决方案。

这篇文章将从 Docker 的基础知识入手,逐步介绍各种操作,帮助你掌握从入门到进阶的 Docker 使用技巧。


1. Docker 基础知识

1.1 什么是容器和镜像?

  • 容器 (Container):容器是轻量级、可执行的独立软件包,它将应用程序及其所有依赖打包到一起。容器提供了一种虚拟化方式,但比虚拟机更高效。
  • 镜像 (Image):镜像是一个只读的模板,用于创建容器。镜像是从 Dockerfile 构建而来,可以包含操作系统、运行时环境、库、应用程序等内容。

1.2 Docker 的核心组件

  • Docker Daemon:后台进程,负责管理容器生命周期、镜像管理、网络管理等。
  • Docker CLI:命令行工具,用于与 Docker Daemon 进行交互。
  • Docker Hub:官方的镜像仓库,允许用户拉取、上传镜像。

2. 安装 Docker

2.1 安装 Docker 在 Linux 上

对于 Ubuntu 用户,执行以下命令:

# 更新包管理器
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 apt-key add -
# 添加 Docker 仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装 Docker
sudo apt-get update
sudo apt-get install docker-ce
# 启动 Docker 服务
sudo systemctl start docker
# 设置开机自启
sudo systemctl enable docker

安装完成后,执行以下命令来验证安装是否成功:

docker --version

2.2 安装 Docker 在 macOS 上

  • 下载并安装 Docker Desktop for Mac:Docker 官网
  • 安装完成后,启动 Docker Desktop。

2.3 安装 Docker 在 Windows 上

  • 下载并安装 Docker Desktop for Windows:Docker 官网
  • 启动 Docker Desktop,并确保启用了 Hyper-V。

3. Docker 常见命令

3.1 查看 Docker 版本

docker --version

3.2 获取 Docker 镜像

使用 docker pull 命令从 Docker Hub 下载镜像。

docker pull ubuntu:latest

3.3 查看本地镜像

docker images

3.4 启动容器

从镜像创建并启动容器:

docker run -it ubuntu:latest

-it 参数表示交互模式启动容器,进入容器的终端。

3.5 查看正在运行的容器

docker ps

3.6 停止容器

docker stop <container_id>

3.7 删除容器

docker rm <container_id>

3.8 删除镜像

docker rmi <image_id>

3.9 查看容器日志

docker logs <container_id>

4. Dockerfile 入门

Dockerfile 是一个包含指令的文本文件,用于定义镜像的构建过程。

4.1 创建一个简单的 Dockerfile

# 使用官方的 Ubuntu 镜像作为基础镜像
FROM ubuntu:latest

# 设置作者标签
LABEL maintainer="your_email@example.com"

# 安装必需的软件包
RUN apt-get update && apt-get install -y python3 python3-pip

# 将当前目录下的文件复制到容器内
COPY . /app

# 设置容器启动时执行的命令
CMD ["python3", "/app/app.py"]

4.2 构建镜像

使用 docker build 命令从 Dockerfile 构建镜像。

docker build -t my-python-app .

4.3 运行容器

通过构建的镜像启动容器:

docker run -it my-python-app

5. Docker 网络

Docker 提供了多种网络模式,使得容器可以相互通信或与外界通信。

5.1 查看网络

docker network ls

5.2 创建自定义网络

docker network create --driver bridge my_network

5.3 启动容器并连接到自定义网络

docker run -it --network my_network ubuntu:latest

6. Docker Compose 入门

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。它通过一个 docker-compose.yml 文件来配置应用中的多个容器。

6.1 创建 docker-compose.yml 文件

version: '3'
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example

6.2 启动 Compose 服务

docker-compose up

6.3 停止 Compose 服务

docker-compose down

7. Docker 镜像优化

7.1 镜像优化技巧

  • 减少镜像层数:尽量合并 RUN 指令,减少镜像层数。
  • 清理缓存:使用 apt-get cleanrm -rf /var/lib/apt/lists/* 清理缓存。

例如:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y python3 python3-pip \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

8. Docker 进阶操作

8.1 多阶段构建

多阶段构建使得你可以在一个 Dockerfile 中使用多个 FROM 指令来减少最终镜像的大小。

# 第一阶段:构建阶段
FROM node:16 AS build
WORKDIR /app
COPY . .
RUN npm install

# 第二阶段:生产阶段
FROM nginx:latest
COPY --from=build /app/dist /usr/share/nginx/html

8.2 数据持久化

Docker 容器本身是短暂的,若容器内的数据丢失,我们可以使用 数据卷 (Volumes) 来持久化数据。

docker volume create my_data
docker run -v my_data:/data ubuntu

8.3 Docker 安全

  • 使用 非 root 用户 运行容器。
  • 配置 资源限制(如 CPU 和内存限制)。
  • 使用 Docker 的 安全扫描工具(如 Docker Bench for Security)。

总结

从入门到进阶,Docker 是一个功能强大的工具,它能够大大提升应用的可移植性和开发效率。在本教程中,我们从基础的 Docker 命令、Dockerfile 编写,到 Docker Compose、网络配置、镜像优化等高级话题,都进行了详细讲解。

掌握 Docker 后,你将能够更加高效地开发、部署、管理应用,并在各种环境中保持一致性。


希望这篇博客对你理解 Docker 的基本操作及进阶技巧有所帮助!

Read more

从Java工程师到AI开发者:Day 5 - 卷积神经网络与图像处理实战

从Java工程师到AI开发者:Day 5 - 卷积神经网络与图像处理实战

前言:当Java遇见计算机视觉 在传统Java开发中,我们处理的是业务逻辑的"像素级"控制;在卷积神经网络中,我们处理的是真实图像的像素级理解。今天我们将用Java工程师熟悉的视角,解构CNN的核心原理,并实现工业级的图像分类系统。 一、卷积操作的工程本质 1.1 图像处理中的设计模式 CNN概念 Java类比 设计模式 卷积核 滑动窗口过滤器 责任链模式 特征图 处理中间结果缓存 备忘录模式 池化层 数据降采样 享元模式 全连接层 全局状态聚合 组合模式 1.2 卷积的数学原理(Java视角) // 3x3边缘检测核的Java实现 public class Convolution { private static final float[][] SOBEL_X = { {-1, 0, 1}

从Java工程师到AI开发者:Day 4 - 神经网络与深度学习的Java实现

从Java工程师到AI开发者:Day 4 - 神经网络与深度学习的Java实现

前言:从CRUD到神经元 在传统Java开发中,我们通过组合对象构建业务系统;在神经网络中,我们通过组合神经元构建智能系统。今天我们将用Java工程师熟悉的视角,解构深度学习的核心组件,并实现一个真正的神经网络模型。 一、神经网络的生物基础与代码抽象 1.1 生物神经元 vs 代码神经元 生物特性 Java代码实现 设计模式类比 树突接收信号 输入参数列表 方法参数 细胞体整合信号 加权求和 + 激活函数 装饰器模式 轴突传递信号 方法返回值 责任链模式 突触可塑性 权重参数可训练 策略模式 1.2 感知机的Java实现 public class Perceptron { private double[] weights; private final double bias; public Perceptron(int inputSize) { this.

从Java工程师到AI开发者:Day 3 - 模型训练的本质与Java实现

从Java工程师到AI开发者:Day 3 - 模型训练的本质与Java实现

前言:从CRUD到梯度下降 在传统Java开发中,我们通过Service层处理业务逻辑,而在AI领域,模型训练就是我们的核心业务逻辑。今天我们将揭示机器学习最本质的优化过程,并用Java代码实现核心算法,帮助理解模型训练的底层原理。 一、梯度下降的物理意义 1.1 三维空间中的优化类比 想象你在多山的战场执行搜索任务: * 当前位置:模型初始参数(类似Java对象初始状态) * 地形高度:损失函数值(要最小化的目标) * 望远镜视野:学习率(类似调试时的单步步长) * 背包负重:正则化项(防止过度探索危险区域) graph TD A[随机初始化位置] --> B{观察四周坡度} B -->|最陡下降方向| C[迈出一步] C --> D{到达安全点?} D -->|否|

如何保持高效的创新能力?构建系统化思维与行动框架

如何保持高效的创新能力?构建系统化思维与行动框架

创新是推动人类文明进步的核心动力,但“高效创新”并非天赋异禀者的专利,而是一种可训练、可管理的系统性能力。从爱因斯坦到乔布斯,从谷歌到字节跳动,高效的创新者与组织往往遵循相似的底层逻辑:将知识储备、思维模式、组织环境与实践反馈编织成一张动态网络。本文将从认知科学、管理学和实践案例出发,构建一套可操作的创新方法论。 一、构建“T型知识生态”:持续输入的燃料库 创新绝非凭空想象,而是基于跨领域知识的重组与突破。“T型结构”(广泛涉猎+垂直深耕)是保持创新活力的根基。 1. 多元知识储备:跨越学科的“知识混搭” 达芬奇之所以能在解剖学、工程学与艺术领域跨界创新,源于他系统化记录不同领域的观察笔记。现代案例中,埃隆·马斯克将物理学“第一性原理”应用于特斯拉电池成本优化,打破行业惯性思维。 行动建议:每周投入2小时学习与主业无关的领域(如生物学、哲学、艺术),建立“知识错位竞争”优势。 2. 深度学习与刻意练习:从信息到洞察的转化 诺贝尔奖得主理查德·