Docker总结

Docker知识点总结

常用docker命令

命令

功能

示例

docker run

启动一个新的容器并运行命令

docker run -d ubuntu

docker ps

列出当前正在运行的容器

docker ps

docker ps -a

列出所有容器(包括已停止的容器)

docker ps -a

docker build

使用 Dockerfile 构建镜像

docker build -t my-image .

docker images

列出本地存储的所有镜像

docker images

docker pull

从 Docker 仓库拉取镜像

docker pull ubuntu

docker push

将镜像推送到 Docker 仓库

docker push my-image

docker exec

在运行的容器中执行命令

docker exec -it container_name bash

docker stop

停止一个或多个容器

docker stop container_name

docker start

启动已停止的容器

docker start container_name

docker restart

重启一个容器

docker restart container_name

docker rm

删除一个或多个容器

docker rm container_name

docker rmi

删除一个或多个镜像

docker rmi my-image

docker logs

查看容器的日志

docker logs container_name

docker inspect

获取容器或镜像的详细信息

docker inspect container_name

docker exec -it

进入容器的交互式终端

docker exec -it container_name /bin/bash

docker network ls

列出所有 Docker 网络

docker network ls

docker volume ls

列出所有 Docker 卷

docker volume ls

docker-compose up

启动多容器应用(从docker-compose.yml

文件)

docker-compose up

docker-compose down

停止并删除由docker-compose

启动的容器、网络等

docker-compose down

docker info

显示 Docker 系统的详细信息

docker info

docker version

显示 Docker 客户端和守护进程的版本信息

docker version

docker stats

显示容器的实时资源使用情况

docker stats

docker login

登录 Docker 仓库

docker login

docker logout

登出 Docker 仓库

docker logout

常用选项说明:

  • -d:后台运行容器,例如 docker run -d ubuntu。
  • -it:以交互式终端运行容器,例如 docker exec -it container_name bash。
  • -t:为镜像指定标签,例如 docker build -t my-image .。

Docker run

docker run 有非常多的选项来控制容器的行为。这里列举一些最常用且重要的:

  • -d- -detach在后台(分离)模式运行容器。容器会启动,然后 Docker 会打印出容器 ID 并退出,让你能继续使用终端。这对于运行长时间运行的服务至关重要。
    • 示例docker run -d nginx (在后台启动一个 Nginx Web 服务器)。
  • -p--publish host_port:container_port将容器的端口发布到宿主机。这会将你宿主机上的一个端口映射到容器内部的一个端口,从而使容器中的服务可以通过宿主机访问。
    • 示例docker run -p 8080:80 nginx (将宿主机 8080 端口映射到容器 80 端口,这样你就可以通过 http://localhost:8080 访问 Nginx)。
  • -it交互式和伪终端。这是两个选项的组合:
    • -i--interactive: 即使没有附加到容器,也保持 STDIN 开放。对于需要用户输入的交互式进程至关重要。
    • -t--tty: 分配一个伪终端。这能让你在容器内部获得一个命令行界面。
    • 示例docker run -it ubuntu bash (启动一个 Ubuntu 容器并进入其 Bash shell)。
  • - -name NAME为容器指定一个特定的名称。如果你不指定名称,Docker 会生成一个随机名称。使用名称可以方便地后续引用容器(例如,用 docker stop NAMEdocker logs NAME)。
    • 示例docker run --name my-web-server -p 8080:80 nginx
  • -v- -volume host_path:container_path将宿主机上的路径(目录或文件)挂载到容器内部。这对于数据持久化(数据在容器删除后仍然保留)和轻松地向容器提供配置或应用程序代码至关重要。
    • 示例docker run -v /my/app/data:/var/lib/mysql mysql (将本地目录挂载到 MySQL 容器中用于数据存储)。
  • - -env KEY=VALUE-e KEY=VALUE在容器内部设置环境变量。这对于向应用程序传递配置值非常有用。
    • 示例docker run -e MY_ENV_VAR=hello my-app
  • - -rm容器退出时自动删除容器。这对于临时容器或批处理任务非常有用,可以防止你的系统积累大量已退出的容器。
    • 示例docker run --rm ubuntu bash -c "echo Hello World"
  • - -network NAME将容器连接到特定的 Docker 网络。这使得同一网络中的容器可以通过名称相互通信。
    • 示例docker run --network my-app-network my-app

Docker数据卷

1. 创建数据卷

# 创建一个名为 myvolume 的数据卷
docker volume create myvolume

2. 查看数据卷列表

# 列出所有数据卷
docker volume ls

# 查看数据卷详细信息(包括存储路径)
docker volume inspect myvolume

3. 使用数据卷

启动容器时挂载数据卷
# 将 myvolume 挂载到容器的 /app/data 目录
docker run -d -v myvolume:/app/data --name mycontainer nginx

挂载主机目录作为数据卷
# 将主机的 /host/path 目录挂载到容器的 /container/path 目录
docker run -d -v /host/path:/container/path --name mycontainer nginx

4. 查看容器挂载的卷

# 查看指定容器的挂载信息
docker inspect -f '{{ .Mounts }}' mycontainer

5. 删除数据

# 删除指定数据卷(需先停止并删除使用该卷的容器)
docker volume rm myvolume

# 删除所有未被使用的数据卷
docker volume prune

6. 容器间共享数据卷

# 创建一个数据卷
docker volume create sharedvol

# 启动第一个容器使用该卷
docker run -d -v sharedvol:/data --name container1 nginx

# 启动第二个容器共享该卷
docker run -d -v sharedvol:/data --name container2 nginx

数据卷的特点

  • 数据卷独立于容器生命周期,容器删除后数据仍保留
  • 可以在多个容器间共享
  • 支持备份、恢复和迁移
  • 默认存储在 /var/lib/docker/volumes/ 目录下(Linux)

Dockerfile 文件

Dockerfile 是一个文本文件,其中包含了一系列命令和指令,Docker 引擎可以读取这些指令并自动构建 Docker 镜像。其核心作用如下

  • 自动化构建: 无需手动一步步操作,只要有 Dockerfile,Docker 就能自动重复构建出完全相同的镜像。
  • 版本控制: Dockerfile 本身是文本文件,可以像代码一样进行版本控制(例如,使用 Git),方便追踪镜像的变更历史。
  • 可移植性: Dockerfile 定义了镜像的构建过程,确保了在不同环境中构建出一致的镜像。
  • 透明性: 任何查看 Dockerfile 的人都能清楚地知道镜像中包含了什么,以及它是如何构建的。

基本命令

--指定基础镜像
FROM <image>[:<tag>]  

--在镜像构建过程中执行命令行命令
RUN <command>  

从构建上下文(通常是 Dockerfile 所在的目录)复制文件或目录到镜像中。
COPY(复制文件/目录) 
示例
COPY . /app      # 将构建上下文中的所有文件和目录复制到镜像的 /app 目录
COPY myapp.conf /etc/nginx/conf.d/ # 复制单个配置文件

ADD(复制文件/目录,并支持 URL 和解压) 类似于 COPY,但功能更强大。

WROKDIR(设置工作目录): 后续的 RUN, CMD, ENTRYPOINT 命令设置工作目录。如果该目录不存在,WORKDIR 会自动创建它。

EXPOSE(声明暴露端口): 声明容器运行时会监听的端口。这只是一个文档化的声明,并不会自动发布端口。实际的端口映射需要在 docker run 命令中使用 -p 参数。

ENV(设置环境变量)

CMD(容器启动时默认执行命令): 指定容器启动时将要执行的默认命令。一个 Dockerfile 中只能有一个 CMD 指令,如果有多条,只有最后一条会生效。

示例

# 1. 指定基础镜像:使用官方 Nginx 镜像的最新稳定版本
FROM nginx:stable-alpine

# 2. 设置作者信息 (可选,但推荐)
LABEL maintainer="Your Name <your.email@example.com>"

# 3. 将宿主机上的自定义 HTML 文件复制到 Nginx 容器的默认网页目录
# 假设在 Dockerfile 同级目录下有一个名为 'html' 的文件夹,里面放着你的 index.html 等文件
COPY html/ /usr/share/nginx/html/

# 4. (可选)如果你有自定义的 Nginx 配置文件,也可以复制进去
# 假设在 Dockerfile 同级目录下有一个名为 'config' 的文件夹,里面放着你的 default.conf 文件
# COPY config/default.conf /etc/nginx/conf.d/default.conf

# 5. 声明容器会监听的端口 (最佳实践,不实际发布端口)
EXPOSE 80

# 6. 设置容器启动时执行的命令 (Nginx 镜像通常自带,这里只是示例)
# CMD ["nginx", "-g", "daemon off;"]
  • 将上述 Dockerfile 内容保存为名为 Dockerfile 的文件。
  • 在 Dockerfile 同级目录下创建一个 html 文件夹,并在其中放入你的 index.html 文件。
  • 打开终端,进入 Dockerfile 所在的目录。
  • 执行构建命令  docker build

这样就可以创建一个自定义镜像。

Docker 网络

docker网络模式

Docker 内置 5 种网络模式,可在启动容器时通过 --network 指定:

  1. bridge(默认模式)

    • 容器连接到默认的桥接网络(docker0),通过 NAT 与主机及外部通信。
    • 容器间可通过 IP 或容器名(需自定义网络)通信。
    • 适用场景:单机容器间通信。
  2. host

    • 容器直接使用主机的网络栈,不隔离网络。
    • 容器端口与主机端口完全一致,无需端口映射。
    • 适用场景:需要高性能网络或直接使用主机端口的场景。
  3. none

    • 容器无网络配置,完全隔离。
    • 适用场景:需自定义网络配置的特殊场景。
  4. container:NAME/ID

    • 与指定容器共享网络栈(IP 和端口)。
    • 适用场景:需两个容器紧密协作(如前端容器与后端容器共享网络)。
  5. 自定义网络(推荐)

    • 用户创建的桥接网络,支持 DNS 解析(容器名直接通信),隔离性更好。
    • 适用场景:多容器应用(如微服务)的网络隔离与通信。

常用网络命令

1. 查看网络列表
# 列出所有 Docker 网络
docker network ls

2. 创建自定义网络
# 创建名为 mynet 的桥接网络(默认驱动为 bridge)
docker network create mynet

# 查看网络详情(包括关联的容器)
docker network inspect mynet

3. 容器连接网络
# 启动容器时指定网络
docker run -d --name container1 --network mynet nginx

# 已运行的容器连接到网络
docker network connect mynet container2

4. 容器断开网络
docker network disconnect mynet container1
5. 删除网络
# 删除指定网络(需先断开所有关联容器)
docker network rm mynet

# 删除所有未使用的网络
docker network prune

容器间通信示例

  1. 创建自定义网络:

    docker network create appnet
    

  2. 启动两个容器并加入该网络:

    docker run -d --name web --network appnet nginx
    docker run -d --name db --network appnet mysql:5.7
    

  3. 容器间通过名称通信(无需 IP):

    # 进入 web 容器,ping db 容器(需安装 ping 工具)
    docker exec -it web bash
    ping db  # 成功解析到 db 容器的 IP

docker-compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤:

  1. 使用 Dockerfile 定义应用程序的环境。

  2. 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

  3. 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

常用命令

  • 启动所有服务: docker-compose up-d后台运行,-f指定配置文件)
  • 停止所有服务: docker-compose down
  • 构建服务镜像: docker-compose build
  • 查看服务状态: docker-compose ps
  • 查看服务日志: docker-compose logs

compose示例

先写构建dockerfile需要的app.py

import os
import pymysql

# 从环境变量获取数据库配置
db_host = os.getenv('DB_HOST')
db_user = os.getenv('DB_USER')
db_password = os.getenv('DB_PASSWORD')
db_name = os.getenv('DB_NAME')

try:
    # 连接数据库
    conn = pymysql.connect(
        host=db_host,
        user=db_user,
        password=db_password,
        database=db_name
    )
    print("成功连接到MySQL数据库!")
    
    # 关闭连接
    conn.close()
    print("程序执行完成")

except Exception as e:
    print(f"连接数据库失败: {e}")

创建一个dockerfile

FROM python:3.9-slim

# 安装依赖
RUN pip install pymysql

# 设置工作目录
WORKDIR /app

# 复制应用代码
COPY app.py .

# 启动命令
CMD ["python", "app.py"]

写docker-compose.yml文件

version: '3'

services:
  # Python应用服务
  app:
    build: .  # 使用当前目录的Dockerfile构建镜像
    environment:
      - DB_HOST=db
      - DB_USER=root
      - DB_PASSWORD=123456
      - DB_NAME=testdb
    depends_on:
      - db  # 依赖数据库服务

  # MySQL数据库服务
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=testdb
    volumes:
      - mysql-data:/var/lib/mysql  # 数据持久化

volumes:
  mysql-data:

接着输入命令  docker-compose up 启动程序

查看输出,会看到 Python 应用成功连接到 MySQL 的提示

compose中一个容器依赖另一个容器启动

1. 使用 depends_on 配置(基础依赖)

version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"

  web:
    image: nginx
    depends_on:
      - db  # web 容器会在 db 容器启动后再启动
    ports:
      - "80:80"

2、结合健康检查(确保依赖容器就绪)

如果需要等待依赖容器完全就绪(如数据库启动并可连接),需合 healthcheck 和 depends_on 

version: '3.8'  # 需要 3.8+ 版本支持健康检查依赖
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
      interval: 5s      # 每 5 秒检查一次
      timeout: 5s       # 检查超时时间
      retries: 5        # 重试 5 次失败后视为不健康
      start_period: 10s # 启动后等待 10 秒再开始检查

  web:
    image: nginx
    depends_on:
      db:
        condition: service_healthy  # 仅当 db 健康检查通过后才启动
    ports:
      - "80:80"

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值