什么是Docker镜像?

Docker镜像是一个轻量级、独立的可执行软件包,包含运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。镜像是容器的基础,容器是镜像的运行实例。

准备工作

安装Docker
首先确保你的系统已安装Docker:
Windows/macOS:

下载Docker Desktop并安装
访问官网Docker Desktop
根据需求下载对应安装包安装

Linux (Ubuntu示例):

sudo apt updatesudo apt install docker.iosudo systemctl enable dockersudo systemctl start docker

验证安装

docker --version
docker run hello-world

创建你的第一个Docker镜像

方法一:使用Dockerfile(推荐)

1.创建Dockerfile

进行项目所在文件创建文件重命名为Dockerfile
以node项目为例:

dockerfile

# 基础镜像
FROM node:18
#复制源码
ADD . /my-app
# 设置工作目录
WORKDIR /my-app
# 安装依赖
RUN npm install && npm install -g nodemon
# 运行应用
CMD nodemon db-serve.js
# 暴露端口(服务启动端口)
EXPOSE 8011

2.构建镜像

记得先启动docker

docker build . -t my-app

可以使用docker images命令查看镜像是否构建成功

3. 运行容器

docker run -p 50001:8011 my-app

请求接口后发现可以请求到接口(50001是对外暴露接口,8011是部署服务在容器内的端口)

方法二:从现有容器创建镜像

1. 运行基础容器

docker run -it ubuntu:20.04 /bin/bash

2. 在容器内安装软件

在容器内部执行

apt update
apt install -y nginx
exit

3. 提交更改

# 获取容器ID
docker ps -a
# 提交为新镜像
docker commit <container_id> my-nginx-image

深入理解Dockerfile指令
常用指令详解

FROM

指定基础镜像:

dockerfile
FROM ubuntu:20.04
FROM python:3.9-alpine
FROM node:18

RUN

执行命令:

dockerfile
# shell格式
RUN apt update && apt install -y python3

# exec格式(推荐)
RUN ["apt", "update"]

COPY vs ADD

复制文件:

dockerfile
# 复制本地文件到镜像
COPY . /app

# ADD可以自动解压tar文件和从URL下载
ADD https://example.com/file.tar.gz /tmp/

CMD vs ENTRYPOINT

定义启动命令:

dockerfile
# CMD可以被docker run覆盖
CMD ["python", "app.py"]

# ENTRYPOINT作为主要可执行文件
ENTRYPOINT ["python"]
CMD ["app.py"]

ENV

设置环境变量:

dockerfile

ENV APP_HOME=/app
ENV PYTHONPATH=/app/src

WORKDIR

设置工作目录:

dockerfile
WORKDIR /app

.dockerignore文件

创建.dockerignore来排除不必要的文件:

text
.git
.gitignore
README.md
Dockerfile
.dockerignore
__pycache__
*.pyc
*.pyo
*.pyd
.env

高级技巧

多阶段构建

dockerfile
# 构建阶段
FROM node:18 as build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 生产阶段
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

使用ARG和ENV

dockerfile
ARG APP_VERSION=latest
ENV APP_VERSION=${APP_VERSION}

# 构建时传递参数
# docker build --build-arg APP_VERSION=1.0.0 -t myapp .

镜像管理

查看镜像
docker images
docker image ls
给镜像打标签
docker tag my-app myregistry.com/my-app:v1.0
推送镜像到仓库
docker login
docker push myregistry.com/my-app:v1.0
删除镜像
docker rmi my-app
docker image prune  # 清理悬空镜像

调试技巧

检查镜像层次
docker history my-app
交互式运行
docker run -it my-app /bin/bash
查看容器日志
docker logs <container_id>

常见问题解决

1. 镜像构建太慢

  • 使用.dockerignore文件
  • 合理利用Docker缓存层
  • 使用更小的基础镜像

2. 镜像太大

  • 使用多阶段构建
  • 选择alpine或slim版本的基础镜像
  • 清理不必要的文件

权限问题

  • 在Dockerfile中创建非root用户
  • 正确处理文件权限

更多推荐