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 NAME,docker 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 指定:
-
bridge(默认模式)
- 容器连接到默认的桥接网络(
docker0),通过 NAT 与主机及外部通信。 - 容器间可通过 IP 或容器名(需自定义网络)通信。
- 适用场景:单机容器间通信。
- 容器连接到默认的桥接网络(
-
host
- 容器直接使用主机的网络栈,不隔离网络。
- 容器端口与主机端口完全一致,无需端口映射。
- 适用场景:需要高性能网络或直接使用主机端口的场景。
-
none
- 容器无网络配置,完全隔离。
- 适用场景:需自定义网络配置的特殊场景。
-
container:NAME/ID
- 与指定容器共享网络栈(IP 和端口)。
- 适用场景:需两个容器紧密协作(如前端容器与后端容器共享网络)。
-
自定义网络(推荐)
- 用户创建的桥接网络,支持 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
容器间通信示例
-
创建自定义网络:
docker network create appnet -
启动两个容器并加入该网络:
docker run -d --name web --network appnet nginx docker run -d --name db --network appnet mysql:5.7 -
容器间通过名称通信(无需 IP):
# 进入 web 容器,ping db 容器(需安装 ping 工具) docker exec -it web bash ping db # 成功解析到 db 容器的 IP
docker-compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:
-
使用 Dockerfile 定义应用程序的环境。
-
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
-
最后,执行 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"

被折叠的 条评论
为什么被折叠?



