【Docker】Docker 基础入门

72 阅读4分钟

以前只是用 docker 跑过 demo,现在想深入了解,至少要自己能搭建开发环境, 几个概念必须掌握。之前在公司碰到过的一个场景就是,有些项目发到生产才出现问题,如果自己本地环境能部署,是不是可以提前能看到问题??

基本概念

镜像(Image)

类似一个只读模板,包含应用程序和运行所需的依赖。比如一个 Nginx 镜像。

容器(Container)

镜像运行时的实例,类似一个轻量虚拟机,但更高效。

Dockerfile

一个脚本文件,用来定义如何构建镜像。包含一系列指令(如 FROM、COPY、RUN、CMD 等),告诉 Docker 如何从基础镜像开始,安装依赖、复制代码、设置运行环境,最终生成一个镜像

Docker Hub

Docker 的公共镜像仓库,可以下载现成的镜像(如 MySQL、Python 等)。

Docker Compose Yaml

以 YAML 格式描述多个服务(可以基于已有镜像或 Dockerfile 构建)、网络、卷(Volumes)等配置,以及它们之间的依赖和连接

Volumes

是一种用于持久化存储数据和管理容器数据的机制。简单来说,它让容器中的数据可以独立于容器的生命周期存在,避免容器删除时数据丢失。常用持久化数据库、保存日志或配置文件、开发时同步代码等场景

匿名卷(Anonymous Volume)
-   由 Docker 自动创建和管理,路径随机生成(如 /var/lib/docker/volumes/xxx)。
-   示例:docker run -v /app/data mysql(挂载到容器mysql /app/data是容器的目录,但主机路径匿名)。
命名卷(Named Volume)
-  用户指定名称,由 Docker 管理,方便复用。
- 示例:docker run -v mydata:/app/data mysql(mydata 是卷名)。
绑定挂载(Bind Mount)
-   直接将主机上的具体路径挂载到容器。
-   示例:docker run -v /home/user/data:/app/data mysql(主机 /home/user/data 映射到容器 mysql,容器目录是/app/data)。

绑定挂载和命名卷的格式好像哇,上面的示例是以命令行的方式使用卷,也可以使用 Docker Compose 的方式运行

# docker-compose.yaml
version: '3'
services:
  db:
    image: mysql
    volumes:
      - mydata:/var/lib/mysql
volumes:
  mydata:

定义一个 mydata 的命名卷,挂载到容器上面

Bind Mount

普通的命名卷或匿名卷不同,Bind Mount 直接指定主机路径。 下面用运行容器的方式给出示例

绑定挂载
docker run -d -v /home/user/data:/app/data nginx
  • /home/user/data(主机路径)挂载到容器 /app/data。
  • 如果主机路径不存在,Docker 会创建一个空目录。
  • 适用于开发开发、临时数据共享
命名卷
docker run -v mydata:/app/data nginx
  • 创建 mydata 卷,挂载到 /app/data 容器下面
  • 适用于生产环境、持久化存储(匿名卷也是)
示例

假设你在主机 /home/user/code 有个 HTML 文件,想用 Nginx 容器展示:

docker run -d -p 8080:80 -v /home/user/code:/usr/share/nginx/html nginx

访问 localhost:8080,就能看到主机上的 HTML 文件内容。

改成 docker-compose 的形式

services:
  web:        # 服务名称,可以随便起,比如 "web"
    image: nginx  # 使用官方 Nginx 镜像
    ports:       # 端口映射,等价于 -p
      - "8080:80"
    volumes:     # 卷挂载,等价于 -v
      - /home/user/code:/usr/share/nginx/html

安装

我用的 Docker Desktop

此外 Linux (Ubuntu 示例), 我没试过,我一般运行这些命令时,总是没那么快

sudo apt update
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
docker --version

常见命令

运行 docker --help ,超多也记不住,只能记住常见的

Docker 常见命令简释

  • run 从镜像创建并运行一个新容器。
    示例:docker run -d nginx

  • exec 在运行中的容器内执行命令。
    示例:docker exec -it mycontainer bash

  • ps 列出容器(默认显示运行中的)。
    示例:docker ps

  • build 根据 Dockerfile 构建镜像。
    示例:docker build -t myimage . 构建一个 tag 为 myimage的镜像

  • compose up 根据 docker-compose.yaml 启动服务 示例:docker compose up -build 构建镜像,启动容器

  • pull 从镜像仓库下载镜像。
    示例:docker pull ubuntu

  • push 将镜像上传到镜像仓库。
    示例:docker push myimage

  • images 列出本地镜像。
    示例:docker images

  • login 登录到镜像仓库。
    示例:docker login

  • logout 从镜像仓库登出。
    示例:docker logout

  • search 在 Docker Hub 搜索镜像。 示例:docker search python

  • version 显示 Docker 版本信息。 示例:docker version

  • info 显示 Docker 系统信息(如容器、镜像数量)。 示例:docker info

总算是个有个大概的认识了,实际项目部署肯定会比较复杂,也不是专门的运维,我只希望能解决自己的问题!!!