docker 笔记

docker 笔记

周六 7月 05 2025 Pin
3054 字 · 12 分钟

参考文档:docker 教程

一句话解释 docker 的作用

通过 docker构建镜像过后,只需要通过启动镜像(启动后的镜像叫做容器),就能快速启动程序。在不同的机器上,都可以利用该镜像来部署服务,而不需要考虑环境的兼容性,这就是 docker 的作用。

Docker 的架构介绍

Docker是基于 C/S 架构,使用远程 API 来管理和创建 Docker容器

Docker 容器通过镜像来创建,容器的镜像的关系:镜像—>类,容器—>对象

Docker 架构示意图

Docker 架构的工作流程:

构建镜像:使用Dockerfile来构建镜像

推送镜像到仓库:将镜像上传到 Docker Hub 或私有注册表中

拉取镜像:从仓库拉取镜像

运行容器:使用镜像创建并启动容器

管理容器:使用 docker 客户端命令管理容器(查看日志、停止容器、查看资源使用)

网络与存储:容器之间通过 docker 网络连接;数据通过 docker 卷或绑定挂载进行持久

Docker 的一些核心组件

Docker Client

Docker 客户端其实就是命令行界面(CLI),用户通过客户端与 Docker 守护进程进行交互(用户通过 Docker CLI 向守护进程发送命令,由守护进程执行相应操作)

Docker Daemon

Docker Daemon 是实际执行操作的组件。它的主要功能如下:

  • 启动和停止容器
  • 构建、拉取、推送镜像
  • 管理容器的网络和存储
  • 查看日志

Docker Containers

容器是从 Docker 镜像启动的,它包含了运行某个应用程序所需的一切,不同容器之间的文件系统和进程相互隔离

容器不依赖环境配置,所有运行时需要的依赖已经封装在了镜像中

Docker Images

将应用程序运行时需要的一切打包在一起(包括代码、依赖的环境),构成了镜像。镜像是只读的,同一个镜像可以实例化不同的容器。

镜像可以从仓库拉取(docker hub 或者私有仓库),也可以由 Dockerfile 构建

Docker Registries

Docker 仓库就是用来存储镜像的地方,最常用的公共仓库是Docker Hub。也可以部署自己的私有仓库来管理企业内部的镜像

Docker Compose

docker compose 用于定义和运行多个容器。通过 compose,用户可以使用配置文件定义多个容器(服务),并通过一个命令启动这些容器。

注意:通过docker-compose.yml 来进行配置

Docker Networks

docker 网络能够允许容器之间通信,并与外部网络连接。

Docker Volumes

docker 卷是一种持久化机制,将数据落盘于硬盘上,不会因为容器停止后数据被删除。

Docker 常用命令

网络

docker network create rocketmq 创建一个名为rocketmq 的 Docker 自定义网络

  • 创建隔离的网络环境:默认情况下,Docker 容器会连接到 bridge 网络。通过该命令创建了一个独立的网络 rocketmq后续加入该网络的容器可以相互通信,同时与其他未加入的容器隔离

  • 支持容器间直接通信:rocketmq 网络中的容器可以通过容器名称(而非 IP 地址)直接互相访问(Docker 内置 DNS 解析)。例如:

    DOCKERFILE
    # 假设启动 RocketMQ NameServer 容器时指定了名称 `namesrv`
    docker run --name namesrv --network rocketmq ...

    其他同网络的容器可直接通过主机名 namesrv 访问该服务。

  • 网络驱动:未指定时默认使用 bridge 驱动

  • 子网和网关:自动分配(也可通过 --subnet--gateway 手动配置)

  • 名称解析:自动启用容器名称到 IP 的映射

容器

docker run创建并启动容器

-d: 以”detached”(后台)模式运行容器

--name rmqnamesrv :- 为容器指定名称为”rmqnamesrv”

-p 9876:9876 - 将主机的9876端口映射到容器的9876端口

--network rocketmq - 将容器连接到名为”rocketmq”的Docker网络

镜像名称:指定使用的镜像

sh xxx:在容器内执行的命令

docker start启动容器

docker restart重新启动容器

docker ps 查看容器

docker stop 终止容器

docker attach进入容器

docker exec进入容器

-it:表示以交互模式进入容器

/bin/bash:指定使用 Bash 终端(如果容器支持)

docker export导出容器

docker import导出容器快照

docker rm删除容器

容器如果处于运行态,那么需要先终止容器,再删除

docker logs查看日志

-f--follow:持续跟踪日志输出。

镜像

docker search检索镜像

docker pull拉取镜像

docker images列出镜像

docker image rm删除镜像

docker save导出镜像

docker load导入镜像

docker run运行镜像

Dockerfile 相关

docker命令

docker build构建镜像

参数

FROM:指定基础镜像。每个 Dockerfile 的第一条指令必须是 FROM

DOCKERFILE
FROM python:3.9

RUN:在镜像构建过程中执行命令。常用于安装软件包、更新系统等

DOCKERFILE
RUN apt-get update && apt-get install ffmpeg inetutils-ping sshpass nano vim -y

COPY:将文件或目录从构建上下文(通常是 Dockerfile 所在的目录)复制到镜像的文件系统中

DOCKERFILE
COPY ./requirements.txt /opt/requirements.txt

ADD:与 COPY 类似,但它还可以处理远程 URL 和解压本地压缩包

DOCKERFILE
ADD https://example.com/somefile.txt /app/somefile.txt
ADD myapp.tar.gz /app/

CMD容器启动命令

ENV:设置环境变量。这些环境变量在构建过程中以及容器运行时都可用

DOCKERFILE
ENV http_proxy "http://dev.datamatrixai.com:30130"
ENV https_proxy "http://dev.datamatrixai.com:30130"

VOLUME:创建一个可以从本地主机或其他容器挂载的挂载点。用于持久化数据或共享数据

DOCKERFILE
VOLUME /data

EXPOSE声明容器运行时监听的网络端口。这只是一个文档性的声明,并不会实际发布端口。实际发布端口需要在 docker run 时使用 -p-P 选项。

DOCKERFILE
EXPOSE 80

docker服务

docker version查看 docker 详细版本信息

docker -v查看docker简要信息

ststemctl start docker启用docker

ststemctl stop docker关闭 docker

ststemctl enable docker 设置开机启动

service docker restart 重启 docker 服务

service docker stop关闭 docker 服务(这个命令和上方的 ststemctl stop 的效果一样,不过它是历史遗留命令)

docker-compose

docker-compose 是一个用于定义和运行多容器 Docker 应用程序的工具。

常用命令

docker-compose up:构建(如果需要)、(重新)创建、启动并附加到服务的容器

常用选项:

  • -d:在后台(分离模式)运行容器。
  • --build:在启动容器前构建镜像。
  • --force-recreate:即使容器配置没有改变,也强制重新创建容器。
  • --no-deps:不启动链接的服务。
  • <service_name>:只启动指定的服务及其依赖。

说明:如果后端代码修改后,直接docker-compose up 就可以将最新的代码更新到容器中去。(后面测试一下不用docker-compose stop 能否实现更新)

docker-compose build:构建或重新构建服务中定义的镜像。

常用选项:

  • --no-cache:构建镜像时不使用缓存。
  • --pull:始终尝试拉取较新版本的镜像。
  • <service_name>:只构建指定服务的镜像。

docker-compose down:停止并移除由 up 命令创建的容器、网络、卷和镜像

常用选项:

  • -v--volumes:移除在 volumes 部分定义的命名卷以及附加到容器的匿名卷。
  • --rmi <type>:移除镜像。type 可以是 all(移除所有服务使用的镜像)或 local(只移除没有自定义标签的镜像)。
  • --remove-orphans:移除未在 Compose 文件中定义但属于此项目的容器。

docker-compose ps:列出项目中的容器

常用选项:

  • -q:只显示容器 ID

docker-compose logs:显示服务的日志输出。

常用选项:

  • -f--follow:持续跟踪日志输出。
  • --tail="N":显示最后 N 行日志。
  • <service_name>:只显示指定服务的日志。

docker-compose pull:拉取服务所需的镜像。

常用选项:

  • --ignore-pull-failures:如果拉取失败,则继续。
  • <service_name>:只拉取指定服务的镜像。

docker-compose start <service_name...>:启动一个或多个已存在的、已停止的服务容器

docker-compose stop <service_name...>:停止一个或多个正在运行的服务容器,但不移除它们。

常用选项:

  • -t, --timeout TIMEOUT:指定停止超时时间(默认为 10 秒)。

示例docker-compose stop直接停止正在运行的容器

docker-compose restart <service_name...>:重启一个或多个服务容器。

docker-compose exec <service_name> <command>:在指定服务的正在运行的容器中执行一个命令。

常用选项:

  • -it:以交互模式启动

  • -d:分离模式,在后台运行命令。

  • -u, --user USER:以指定用户运行命令。

  • -T:禁用伪 TTY 分配。当 stdin 不是 TTY 时很有用。

  • 示例docker-compose exec web bash (进入 web 服务的容器)

docker-compose config:验证并查看 Compose 文件的配置。

常用选项:

  • --quiet-q:只检查配置是否有效,不输出任何内容。

  • --services:打印服务名称。

  • --volumes:打印卷名称。

docker-compose rm <service_name...>:移除已停止的服务容器。

常用选项:

  • -f, --force:强制移除。

  • -s, --stop:在移除前先停止容器。

  • -v:同时移除附加到容器的匿名卷。

  • 示例docker-compose rm web

常用配置参数

顶层键:

version

  • 用途:定义 Compose 文件格式的版本

  • 示例version: '3.8'

services

  • 用途定义应用程序的各个服务(容器)。这是 Compose 文件中最核心的部分。

  • 示例

PLAINTEXT
services:
  back_app:
    # ... 后端服务的配置 ...
  pgsql:
    # ... postgresql服务的配置 ...

networks

  • 用途:定义自定义网络,供服务连接。

  • 示例

YAML
networks:
  my_app_net:
    driver: bridge

volumes

  • 用途:定义命名卷,用于数据持久化。

  • 示例

    YAML
    volumes:
      db_data:
        driver: local

服务 (services) 下的常用配置

image

  • 用途:指定用于创建容器的镜像。可以是 Docker Hub 或者私有仓库的镜像,也可以是使用Dockerfile构建的镜像
  • 示例image: postgres:16.1-alpineimage: wjkz:1.0(这个是自己构建的镜像,要和 build 参数结合使用)

build

  • 用途:指定 Dockerfile 的路径或构建上下文,用于在 docker-compose up --builddocker-compose build 时构建镜像。
  • 示例 (字符串)build: . (Dockerfile 在当前目录下)

container_name

  • 用途:指定一个自定义的容器名称,而不是 Compose 生成的默认名称。通常不推荐,因为可能导致名称冲突。
  • 示例container_name: my_custom_web_container

working_dir

  • 用途:设置容器内的工作目录。
  • 示例working_dir: /app

ports

  • 用途:将容器端口映射到主机端口。格式为 "HOST_PORT:CONTAINER_PORT" 或只指定容器端口(主机端口随机分配)。

  • 示例

    PLAINTEXT
    ports:
      - "8080:80"    # 将主机的 8080 端口映射到容器的 80 端口
      - "9000"       # 将容器的 9000 端口映射到主机的一个随机端口
      - "127.0.0.1:3000:3000" # 只在本地主机上映射

volumes

  • 用途:挂载卷,用于数据持久化或共享文件。可以是主机路径映射,也可以是命名卷。

  • 格式

    • 主机路径:HOST_PATH:CONTAINER_PATHHOST_PATH:CONTAINER_PATH:ro (只读)
    • 命名卷:VOLUME_NAME:CONTAINER_PATH
  • 示例

    YAML
    volumes:
      - ./html:/usr/share/nginx/html  # 挂载主机当前目录下的 html 文件夹
      - db_data:/var/lib/mysql        # 挂载名为 db_data 的命名卷
      - /tmp/app_logs:/app/logs:ro    # 只读挂载

environment

  • 用途:设置环境变量。可以是一个列表或一个字典。

  • 示例 (列表):

    PLAINTEXT
    environment:
      - DEBUG=true
      - API_KEY=abcdef12345
  • 示例 (字典):

    YAML
    environment:
      NODE_ENV: development
      POSTGRES_USER: myuser

env_file

  • 用途:从一个或多个文件加载环境变量。

  • 示例

    PLAINTEXT
    env_file:
      - ./common.env
      - ./api.env

depends_on

  • 用途:定义服务间的启动依赖关系。Compose 会按照依赖顺序启动服务。

  • 注意:这只保证依赖服务先启动,不保证依赖服务内部的应用程序已准备好接受连接。对于应用级别的就绪检查,通常需要使用 healthcheck 或其他机制。

  • 示例

    YAML
    services:
        back_app:
    				# 	... 其他配置
            depends_on:
                - pgsql
                - minio

networks

  • 用途将服务连接到指定的网络。如果未指定,服务会连接到默认网络。

  • 示例

    PLAINTEXT
    services:
        back_app:
           # ...其他配置
            networks:
                - network-backend-wjkz
    networks:
      network-backend-wjkz:
        ipam:
          driver: default
          config:
            - subnet: 172.40.0.0/16

command

  • 用途:覆盖容器镜像中定义的默认命令 (CMD)。

  • 示例

    YAML
    services:
        back_app:
           # ...其他配置
    			command: python3 app.py

restart

  • 用途:定义容器的重启策略。
  • 可选值
    • no:默认值,不重启。
    • always:总是重启。
    • on-failure:当容器以非零退出码退出时重启。可以指定最大重启次数,如 on-failure:5
    • unless-stopped:总是重启,除非容器被手动停止。
  • 示例restart: always

privileged

  • 用途:当一个服务的 privileged 参数设置为 true 时,它会给予该容器几乎所有宿主机的 root 权限。

Thanks for reading!

docker 笔记

周六 7月 05 2025 Pin
3054 字 · 12 分钟