Docker常用命令
Docker常用命令
Windows安装
Docker: Accelerated Container Application Development
如果碰到Docker Desktop - WSL update failed:
打开CMD,执行:
wsl --set-default-version 2
wsl --update
images-镜像
以下是Docker关于镜像的相关命令:
1. 搜索镜像
docker search [镜像名]
例如:docker search nginx
2. 下载镜像
docker pull [镜像名]:[标签]
例如:docker pull nginx:latest
3. 下载镜像
docker images [选项]
选项:
• -a
:列出所有镜像(包括中间层)
• -q
:只显示镜像ID
• --digests
:显示镜像摘要信息
• --no-trunc
:显示完整的镜像信息
4. 删除镜像
docker rmi [镜像ID或镜像名]
选项:
• -f
:强制删除镜像
• -a
:删除所有镜像
5. 构建镜像
docker build -t [镜像名]:[标签] [Dockerfile所在路径]
例如:docker build -t nginx:1.0 .
6. 导入镜像
docker load -i 镜像保存文件位置
例如:docker load -i /data/nginx.tar
7. 保存镜像
docker save -o 保存的目标文件名称 镜像名
例如:docker save -o /data/nginx.tar nginx
8. 给镜像打标签
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
例如:docker tag nginx 10.10.10.200/software/nginx:1.26
container-容器
1. 容器生命周期管理
-
docker run
:启动一个新容器。例如:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用选项:
-d
:后台运行容器。-it
:以交互模式运行容器,并打开终端。--name
:为容器命名。-p
:端口映射,将主机的端口映射到容器。-v
:卷挂载,将主机目录映射到容器内的目录。
-
docker start
:启动一个已经停止的容器。例如:docker start <container_name|container_id>
-
docker stop
:停止运行的容器。例如:docker stop <container_name|container_id>
-
docker restart
:重启容器。例如:docker restart <container_name|container_id>
-
docker kill
:强制停止容器。例如:docker kill <container_name|container_id>
-
docker rm
:删除一个已停止的容器。例如:docker rm <container_name|container_id>
-
docker exec
:在正在运行的容器中执行命令。例如:docker exec -it <container_name|container_id> <command>
2. 查看容器状态
-
docker ps
:列出当前正在运行的容器。例如:docker ps
常用选项:
-a
:列出所有容器,包括已停止的容器。
-
docker inspect
:查看容器的详细信息。例如:docker inspect <container_name|container_id>
-
docker logs
:查看容器的日志输出。例如:docker logs <container_name|container_id>
常用选项:
-f
:实时查看日志。--tail
:只查看最近的若干行日志。
3. 容器资源管理
-
docker top
:查看容器中的进程。例如:docker top <container_name|container_id>
-
docker stats
:实时显示容器的资源使用情况(CPU、内存、网络等)。例如:docker stats
4. 容器文件系统管理
-
docker cp
:在容器和主机之间拷贝文件。例如:docker cp <container_name|container_id>:<container_path> <host_path>
-
docker commit
:将当前容器的更改提交为一个新镜像。例如:docker commit <container_name|container_id> <new_image_name>
5. 网络管理
docker network ls
:列出 Docker 网络。docker network create
:创建新的 Docker 网络。docker network connect
:将容器连接到某个网络。docker network disconnect
:将容器从网络中断开。
6. 容器卷管理
docker volume ls
:列出所有卷。docker volume create
:创建一个新卷。docker volume rm
:删除卷。
7. 停止和删除所有容器(批量操作)
- 停止所有容器:
docker stop $(docker ps -q)
- 删除所有容器:
docker rm $(docker ps -a -q)
8. 其他
docker attach
:附加到运行中的容器终端。例如:docker attach <container_name|container_id>
Dockerfile
1. 基本概念
- Dockerfile:一个文本文件,其中包含了一系列指令,Docker 引擎根据这些指令构建镜像。
- 镜像:Dockerfile 构建后生成的可执行软件包,包含了运行应用所需的代码、库、环境变量等。
- 层:Docker 镜像由多个层(Layer)构成,每一条指令都会创建一个新的层。层是不可变的,这使得 Docker 镜像更为高效和可重用。
2. 常用指令
以下是一些常用的 Dockerfile 指令:
指令 | 说明 |
---|---|
FROM |
指定基础镜像,Dockerfile 的第一行通常是此指令。 |
MAINTAINER |
指定维护者信息(不推荐使用,使用 LABEL 替代)。 |
LABEL |
添加元数据到镜像,例如作者、版本等。 |
RUN |
在构建镜像时执行命令(例如安装软件包)。 |
CMD |
指定容器启动时要执行的命令,可以被 docker run 命令覆盖。 |
ENTRYPOINT |
设置容器启动时的默认命令,不能被 docker run 轻易覆盖。 |
COPY |
将文件或目录从主机复制到镜像中。 |
ADD |
类似于 COPY,但还支持 URL 和自动解压压缩文件。 |
ENV |
设置环境变量。 |
EXPOSE |
声明容器监听的端口,但并不会实际映射到主机。 |
VOLUME |
创建挂载点,用于持久化数据。 |
WORKDIR |
设置工作目录,后续指令将在此目录下执行。 |
ARG |
定义构建时可用的变量。 |
USER |
指定运行时的用户。 |
SHELL |
指定默认的 shell,用于运行后续指令。 |
3. Dockerfile 示例
FROM python:3.10-slim
LABEL maintainer="panhu"
LABEL version=1.0
LABEL desc="A docker bigv"
WORKDIR /app
ARG APP_VER=1.0
ENV APP_ENV=1.0
COPY . /app/
EXPOSE 5000
ENV FLASK_RUN_HOST=0.0.0.0
ENV FLASK_RUN_PORT=5000
HEALTHCHECK --interval=10s --timeout=3s --retries=3 CMD curl --fail http://localhost:5000/ || exit 1
RUN pip install flask
CMD ["python", "app.py"]
4. 构建镜像
使用 Dockerfile 构建镜像的命令:
docker build -t my-app .
volume-卷
1. 基本概念
- Dockerfile:一个文本文件,其中包含了一系列指令,Docker 引擎根据这些指令构建镜像。
- 镜像:Dockerfile 构建后生成的可执行软件包,包含了运行应用所需的代码、库、环境变量等。
- 层:Docker 镜像由多个层(Layer)构成,每一条指令都会创建一个新的层。层是不可变的,这使得 Docker 镜像更为高效和可重用。
2. 常用指令
以下是一些常用的 Dockerfile 指令:
指令 | 说明 |
---|---|
FROM |
指定基础镜像,Dockerfile 的第一行通常是此指令。 |
MAINTAINER |
指定维护者信息(不推荐使用,使用 LABEL 替代)。 |
LABEL |
添加元数据到镜像,例如作者、版本等。 |
RUN |
在构建镜像时执行命令(例如安装软件包)。 |
CMD |
指定容器启动时要执行的命令,可以被 docker run 命令覆盖。 |
ENTRYPOINT |
设置容器启动时的默认命令,不能被 docker run 轻易覆盖。 |
COPY |
将文件或目录从主机复制到镜像中。 |
ADD |
类似于 COPY,但还支持 URL 和自动解压压缩文件。 |
ENV |
设置环境变量。 |
EXPOSE |
声明容器监听的端口,但并不会实际映射到主机。 |
VOLUME |
创建挂载点,用于持久化数据。 |
WORKDIR |
设置工作目录,后续指令将在此目录下执行。 |
ARG |
定义构建时可用的变量。 |
USER |
指定运行时的用户。 |
SHELL |
指定默认的 shell,用于运行后续指令。 |
3. Dockerfile 示例
FROM python:3.10-slim
LABEL maintainer="panhu"
LABEL version=1.0
LABEL desc="A docker bigv"
WORKDIR /app
ARG APP_VER=1.0
ENV APP_ENV=1.0
COPY . /app/
EXPOSE 5000
ENV FLASK_RUN_HOST=0.0.0.0
ENV FLASK_RUN_PORT=5000
HEALTHCHECK --interval=10s --timeout=3s --retries=3 CMD curl --fail http://localhost:5000/ || exit 1
RUN pip install flask
CMD ["python", "app.py"]
4. 构建镜像
使用 Dockerfile 构建镜像的命令:
docker build -t my-app .
network-网络
Docker 网络是 Docker 容器之间以及容器与外部世界之间通信的基础。Docker 提供了多种网络模式,方便开发者根据需要选择合适的网络配置。
Docker 网络的核心概念
-
网络驱动:
Docker 支持多种网络驱动,每种驱动适用于不同的场景。主要的网络驱动包括:- bridge:默认驱动,适用于在同一主机上隔离容器网络。通常用于容器之间的通信。
- host:直接使用宿主机的网络栈,容器与宿主机共享网络接口,适合对性能要求较高的场景。
- overlay:跨主机通信,适用于集群环境(如 Docker Swarm 或 Kubernetes)。容器可以在不同主机上通过虚拟网络进行通信。
- macvlan:允许为容器分配一个独立的 MAC 地址,使容器能够直接与物理网络设备通信。
- none:没有网络,适用于需要完全隔离的容器。
-
网络命名空间:
每个 Docker 容器都有自己的网络命名空间,这意味着每个容器都有独立的网络接口和路由表。 -
IP 地址:
每个容器在其网络中都有一个唯一的 IP 地址,可以通过该地址与其他容器或外部网络通信。
常见 Docker 网络操作
以下是一些常见的 Docker 网络操作命令:
1. 查看网络
列出所有 Docker 网络:
docker network ls
2. 创建网络
使用以下命令创建一个新的 Docker 网络:
docker network create my-network
你可以指定网络驱动:
docker network create --driver bridge my-network
3. 查看网络详细信息
查看某个网络的详细信息:
docker network inspect my-network
4. 删除网络
删除一个网络(确保没有容器使用该网络):
docker network rm my-network
5. 连接和断开容器
将容器连接到指定网络:
docker network connect my-network my-container
将容器从网络中断开:
docker network disconnect my-network my-container
Docker 网络模式
1. Bridge 网络
- 使用场景:默认情况下,Docker 会在创建容器时使用 bridge 网络。这适合在单一主机上隔离和连接多个容器。
- 示例:
docker run -d --name my-container --network bridge my-image
2. Host 网络
- 使用场景:容器与宿主机共享网络接口,适用于对延迟和带宽要求较高的应用。
- 示例:
docker run -d --network host my-image
3. Overlay 网络
- 使用场景:在 Docker Swarm 或 Kubernetes 中使用,支持跨主机的容器通信。
- 示例:
docker network create -d overlay my-overlay-network
4. Macvlan 网络
- 使用场景:适合需要直接与物理网络通信的应用,例如在特定的网络环境中。
- 示例:
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my-macvlan-network
Docker-Compose
1. 启动服务
docker-compose up
- 作用:根据
docker-compose.yml
文件启动所有定义的服务。如果镜像不存在,它会自动构建或拉取所需的镜像。 - 常用选项:
-d
:后台运行容器(detached mode),不显示日志输出。docker-compose up -d
--build
:强制重新构建服务,即使已经存在镜像。docker-compose up --build
2. 停止服务
docker-compose stop
- 作用:停止正在运行的服务,但不删除容器。
- 停止后,容器的状态会保留,容器数据不会丢失。
3. 停止并删除所有服务
docker-compose down
- 作用:停止并删除所有服务、网络和卷(除非显式定义了
volumes
持久化)。 - 常用选项:
--volumes
:同时删除与服务相关联的卷(慎用!可能会丢失持久化的数据)。docker-compose down --volumes
--rmi
:删除与服务关联的镜像。docker-compose down --rmi all
4. 查看容器状态
docker-compose ps
- 作用:查看当前
docker-compose.yml
定义的容器的运行状态,包括容器名、状态、端口映射等信息。
5. 重启服务
docker-compose restart
- 作用:重新启动所有服务,或者可以通过指定服务名来重启某个服务。
- 示例:
docker-compose restart python-app
6. 构建服务
docker-compose build
- 作用:根据
docker-compose.yml
文件中的定义重新构建服务镜像。 - 常用选项:
--no-cache
:在构建镜像时不使用缓存,强制构建新镜像。docker-compose build --no-cache
7. 查看服务日志
docker-compose logs
- 作用:查看服务的日志输出,类似于使用
docker logs
查看单个容器的日志。 - 常用选项:
-f
:实时查看日志(类似tail -f
)。docker-compose logs -f
- 指定特定服务的日志:
docker-compose logs python-app
8. 运行单个命令
docker-compose run <service_name> <command>
- 作用:在指定的服务中运行命令。与
docker exec
类似,但docker-compose run
会启动一个新容器实例来运行命令,而不是在现有的容器中执行。 - 示例:
docker-compose run python-app python manage.py migrate
9. 进入容器
docker-compose exec <service_name> <command>
- 作用:在运行的容器中执行命令(与
docker exec
类似)。 - 示例:
这将启动docker-compose exec python-app bash
python-app
服务的一个交互式bash
shell。
10. 查看容器使用的网络
docker-compose network ls
- 作用:查看当前
docker-compose
管理的网络。
11. 扩展服务
docker-compose up --scale <service_name>=<num>
- 作用:扩展某个服务的副本数量(多实例)。例如,你想扩展某个服务以便运行多个副本(通常用于负载均衡)。
- 示例:
这将启动 3 个docker-compose up --scale python-app=3
python-app
容器实例。
12. 查看容器使用的卷
docker-compose volume ls
- 作用:列出当前
docker-compose
中定义的卷。
13. 删除未使用的卷
docker-compose down --volumes
- 作用:删除当前服务相关的所有卷,通常是停止并删除服务后清理卷使用的空间。
14. 停止某个特定的服务
docker-compose stop <service_name>
- 作用:停止指定的服务容器。
15. 开始某个特定的服务
docker-compose start <service_name>
- 作用:启动已经停止的指定服务容器。
16. 导出容器配置
docker-compose config
- 作用:验证并查看完整的合并后的配置。对于较复杂的
docker-compose.yml
文件,这可以帮助调试和验证配置是否正确。
proxy-代理
1. 设置 Docker 引擎的代理(全局配置)
这种方法用于让所有 Docker 容器默认通过代理访问外部网络。
步骤:
-
创建或修改 Docker 引擎的配置文件:
对于 Linux 系统,Docker 的配置文件通常位于
/etc/systemd/system/docker.service.d/
,或者/etc/docker/daemon.json
。首先,创建目录(如果不存在):
sudo mkdir -p /etc/systemd/system/docker.service.d
-
创建或编辑 Docker 服务代理配置文件:
编辑
/etc/systemd/system/docker.service.d/http-proxy.conf
文件(如果没有该文件则创建),内容如下:[Service] Environment="HTTP_PROXY=http://host.docker.internal:proxy-port" Environment="HTTPS_PROXY=https://host.docker.internal:proxy-port" Environment="NO_PROXY=localhost,127.0.0.1"
HTTP_PROXY
和HTTPS_PROXY
分别设置 HTTP 和 HTTPS 的代理地址。NO_PROXY
则指定不需要通过代理访问的地址,比如本地地址。
-
重新加载并重启 Docker 服务:
sudo systemctl daemon-reload sudo systemctl restart docker
2. 针对单个 Docker 容器设置代理
如果不想全局配置 Docker 引擎的代理,而是希望为某个特定容器配置代理,可以在运行容器时使用环境变量设置。
运行容器时指定代理:
在 docker run
命令中,通过 -e
参数传递代理环境变量:
docker run -e HTTP_PROXY=http://host.docker.internal:proxy-port \
-e HTTPS_PROXY=https://host.docker.internal:proxy-port \
-e NO_PROXY=localhost,127.0.0.1 \
your-image
3. 配置 Dockerfile 中的代理
在构建 Docker 镜像时,也可以在 Dockerfile
中设置代理环境变量,确保在 RUN
指令执行时使用代理。
Dockerfile 示例:
FROM ubuntu:20.04
# 设置代理环境变量
ENV HTTP_PROXY=http://host.docker.internal:proxy-port
ENV HTTPS_PROXY=https://host.docker.internal:proxy-port
ENV NO_PROXY=localhost,127.0.0.1
# 后续的指令会通过代理访问网络
RUN apt-get update && apt-get install -y curl
4. 配置 Docker Compose 的代理
如果使用 Docker Compose 管理多个容器,可以在 docker-compose.yml
文件中配置环境变量。
docker-compose.yml 示例:
version: '3'
services:
myservice:
image: myimage
environment:
- HTTP_PROXY=http://host.docker.internal:proxy-port
- HTTPS_PROXY=https://host.docker.internal:proxy-port
- NO_PROXY=localhost,127.0.0.1
5. 验证代理
docker run --rm -it nginx bash
curl www.google.com