Docker入门和常用命令
-
docker --version:
显示Docker的版本信息。
docker --version
-
docker info:
显示Docker系统的详细信息,包括当前的容器、镜像数量等。
docker info
镜像管理
-
docker pull [image]:
从Docker仓库中拉去镜像。
docker pull ubuntu
-
docker images:
列出本地所有的镜像。
docker images
-
docker rmi [image]:
删除本地的某个镜像。
docker rmi ubuntu
容器管理
-
docker run [options] [image]:
运行一个容器。常用选项包括:
-
-d
:后台运行容器 -
-it
:交互模式运行容器 -
--name
:给容器指定名称 -
-p
:端口映射。
docker run -d -p 80:80 --name mynginx nginx
-
docker ps:
列出当前正在运行的容器。
docker ps
-
docker stop [container]:
停止某个正在运行的容器。
docker stop mynginx
-
docker start [container]:
启动一个已经停止的容器。
docker start mynginx
-
docker restart [container]:
重启一个容器。
docker restart mynginx
-
docker rm [container]:
删除一个已经停止的容器。
docker rm mynginx
-
docker logs [container]:
查看容器的日志输出。
docker logs mynginx
-
docker exec [options] [container] [command]:
在运行的容器中执行命令。
docker exec -it mynginx /bin/bash
Docker 网络与数据卷
-
docker network ls:
列出所有网络
docker network ls
-
docker network create [network]:
创建一个新的网络。
docker network create mynetwork
-
docker network rm [network]:
删除一个网络。
docker network rm mynetwork
-
docker volume ls:
列出所有数据卷。
docker volume ls
-
docker volume create [volume]:
创建一个新的数据卷。
docker volume create myvolume
-
docker volume rm [volume]:
删除一个数据卷。
docker volume rm myvolume
Dockerfile 基本命令
基础命令
-
FROM:指定所基于的基础镜像。所有的Dockerfile都必须以这个命令开始。
FROM ubuntu:20.04
-
MAINTAINER:指定维护者的信息(Docker已弃用此指令推荐使用LABEL)。
MAINTAINER your_name@example.com
-
LABEL:为镜像添加元数据
LABEL version="1.0" LABEL description="This is an example image"
文件操作命令
-
COPY:将文件/目录从本地主机复制到镜像中的指定路径
COPY ./src /app/src
-
ADD: 类似于COPY,但功能更强,可以处理URL和tar文件。
ADD http://example.com/file.tar.gz /app/ ADD ./localfile.tar.gz /app/
软件包管理和执行命令
-
RUN: 在镜像内执行命令, 通常用于安装软件包。
RUN apt-get update && apt-get install -y python3
容器配置命令
-
CMD: 指定容器启动时默认执行的命令。可以被
docker run
提供的命令覆盖。CMD ["python3", "app.py"]
-
ENTRYPOINT:配置容器启动时运行的主程序,不能被
docker run
提供的命令覆盖,但可以追加参数。ENTRYPOINT ["python3", "app.py"]
-
ENV: 设置环境变量。
ENV APP_ENV=production
-
ARG: 定义构建参数, 可以在
docker build
命令中传递。ARG build_version=1.0
-
EXPOSE: 声明镜像内服务监听的端口。
EXPOSE 80
数据与网络配置
-
VOLUME:创建挂载点,声明运行时容器可以从宿主机或其他容器挂载的目录。
VOLUME ["/data"]
-
WORKDIR:设置工作目录。所有后续的
RUN
、CMD
、ENTRYPOINT
、COPY
和ADD
指令都将在这个目录下执行。WORKDIR /app
-
USER:指定运行镜像内命令时使用的用户名或UID。
USER appuser
docker build
命令
-
基本语法
docker build [OPTIONS] PATH | URL | -
-
常用选项
-
-t, --tag
:为构建的镜像指定名称和标签(格式为name:tag
)。如果未指定标签,默认标签为latest
。docker build -t my_image:1.0 .
-
-f , --file
:指定Dockerfile的路径(如果不是默认的Dockerfile
)。docker build -f /path/to/Dockerfile -t my_image:1.0 .
-
--build-arg
:设置构建时的变量(用于Dockerfile中的ARG
指令)。docker build --build-arg VERSION=1.0 -t my_image:1.0 .
-
--rm
:构建过程中移除中间容器(默认开启)。docker build --rm -t my_image:1.0 .
-
--no-cache
:不使用缓存来构建镜像。docker build --no-cache -t my_image:1.0 .
-
--pull
:始终尝试拉取最新的基础镜像。docker build --pull -t my_image:1.0 .
-
--target
:构建特定阶段的镜像(用于多阶段构建)。docker build --target builder -t my_image:builder .
在 docker build 命令中,末尾的 . 表示当前目录,并指定 Docker 需要在此目录中查找 Dockerfile 以及构建镜像所需的上下文。
docker run
命令-
基本语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-
常用选项
-
--name
:为容器指定一个名称。docker run --name my_container IMAGE
-
-d, --detach
:后台运行容器,并返回容器ID。docker run -d IMAGE
-
-it
:以交互模式运行容器,通常与bash
或sh
配合使用。docker run -it IMAGE /bin/bash
在
docker run -it
命令中,bash
和sh
是指定要在容器中运行的命令。这两个命令都是 Unix 系统的命令行 shell,用于提供交互式的命令行界面。bash
和sh
的作用-
bash
(Bourne Again SHell):bash
是一种流行的 shell,它扩展了早期的sh
shell,提供了更多的功能和改进。许多现代 Linux 发行版都默认使用bash
作为交互式 shell。 -
sh
(Bourne Shell):sh
是一种标准的 Unix shell,许多脚本都使用它,因为它在大多数 Unix 系统上都可用。它是一个更简单的 shell,功能没有bash
丰富,但更轻量。
为什么使用
bash
或sh
在运行容器时,通过
-it
选项进入交互模式,可以提供一个命令行界面来与容器进行交互。指定bash
或sh
,是为了在进入容器时启动一个交互式的 shell,使用户可以在容器内执行命令。 -
-
-p, --publish
:将容器的端口映射到主机端口,格式为host_port:container_port
。docker run -p 8080:80 IMAGE
端口映射的工作原理
当你使用
-p
选项时,Docker 会创建一个端口映射规则,使得主机上的指定端口流量转发到容器内相应的端口上。这种方式使得外部客户端可以通过访问主机的端口来与容器内运行的服务进行通信。这样,通过访问主机的指定端口,就可以访问到容器内对应服务的端口。其他常见的端口映射用法
-
映射多个端口: 你可以映射多个端口,使用多个
-p
选项。sh 复制代码 docker run -d -p 8080:80 -p 8443:443 nginx
这将映射主机的
8080
端口到容器的80
端口,并且映射主机的8443
端口到容器的443
端口。 -
随机端口: 如果你不想指定主机端口,可以让 Docker 随机分配一个端口。
sh 复制代码 docker run -d -p 80 nginx
Docker 将自动选择一个可用的端口并映射到容器的
80
端口。你可以使用docker ps
或docker port <container_id>
查看分配的端口。 -
指定主机 IP: 你还可以绑定到主机的特定 IP 地址。
sh 复制代码 docker run -d -p 127.0.0.1:8080:80 nginx
这将仅允许从
127.0.0.1
(localhost) 访问主机的8080
端口。
-
-
-e , --env
:设置环境变量。docker run -e MY_ENV_VAR=value IMAGE
-
--env-file
:从文件中读取环境变量。docker run --env-file ./env.list IMAGE
-
-v, -volume
:绑定挂载一个卷, 格式为host_dir:container_dir
。docker run -v /host/data:/container/data IMAGE
在 Docker 中,
-v
选项用于挂载卷(Volumes),即将主机上的一个目录或文件绑定到容器内的一个目录或文件。这种机制使得数据可以在容器和主机之间共享和持久化。卷的概念
卷是一种用于持久化和共享数据的机制。即使容器被删除,卷中的数据仍然存在,并且可以在不同容器之间共享。卷可以位于 Docker 管理的部分(称为 Docker 卷)或者绑定到主机上的特定目录(称为绑定挂载)。
使用
-v
选项的基本语法docker run -v <host_path>:<container_path> <image>
-
<host_path>
: 主机上的目录或文件路径。 -
<container_path>
: 容器内的目录或文件路径。 -
<image>
: 要运行的 Docker 镜像。
示例
1. 绑定挂载
将主机上的目录
/data
挂载到容器内的/app/data
目录:docker run -v /data:/app/data ubuntu
在这个示例中:
-
主机上的
/data
目录将被挂载到容器内的/app/data
目录。 -
这意味着容器内对
/app/data
的所有读写操作都会直接反映到主机的/data
目录中。
2. 持久化数据库数据
运行一个 MySQL 容器,并将数据库数据存储在主机的目录中,以便即使容器被删除,数据仍然可以保留:
docker run -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest
在这个示例中:
-
主机上的
/my/own/datadir
目录将被挂载到容器内的/var/lib/mysql
目录。 -
MySQL 数据库将把数据存储在
/my/own/datadir
中,这样即使容器被删除,数据也不会丢失。
匿名卷
匿名卷是一种不指定主机路径的卷,Docker 会自动为你创建一个卷,并管理它的路径。这种方式适合于你只需要持久化数据,但不关心具体路径的场景:
docker run -v /container/data ubuntu
在这个示例中:
-
Docker 会自动创建一个卷,并将其挂载到容器的
/container/data
目录。
命名卷
你可以为卷指定一个名称,这样可以方便管理和共享:
docker volume create my_volume docker run -v my_volume:/container/data ubuntu
在这个示例中:
-
创建了一个名为
my_volume
的卷。 -
将
my_volume
卷挂载到容器的/container/data
目录。
查看和管理卷
-
查看所有卷:
docker volume ls
-
查看卷详细信息:
docker volume inspect <volume_name>
-
删除卷:
docker volume rm <volume_name>
-
-
--rm
:容器停止后自动删除容器。docker run --rm IMAGE
-
--network
:指定容器连接的网络。docker run --network my_network IMAGE
--network
命令用于指定容器连接的网络,允许容器之间进行网络隔离和通信。Docker 提供了几种网络模式来管理容器之间的网络配置,包括 bridge(桥接)、host(主机)、none(无网络)和自定义网络。1. Bridge(桥接网络)
这是 Docker 的默认网络模式。在这种模式下,每个容器都连接到一个虚拟的桥接网络,使用 NAT 来转发容器的网络流量。容器之间可以通过 IP 地址或容器名进行通信。
docker run --network bridge -d nginx
2. Host(主机网络)
在主机网络模式下,容器不会获得独立的网络命名空间,而是直接共享宿主机的网络堆栈。容器内的网络服务将直接暴露在主机的网络上,适用于需要高性能网络通信的场景。
docker run --network host -d nginx
3. None(无网络)
这种模式下,容器不会分配任何网络接口。容器将没有网络连接,适用于完全不需要网络的应用。
docker run --network none -d nginx
4. 自定义网络
自定义网络允许用户创建特定需求的网络,提供更好的隔离和容器名称解析(通过 Docker 的 DNS 服务)。可以使用
docker network create
命令创建自定义网络。# 创建自定义网络 docker network create my_network # 运行容器并连接到自定义网络 docker run --network my_network -d nginx
自定义网络的优势
-
容器名解析:在同一网络中的容器可以通过名称互相访问。
-
网络隔离:自定义网络提供了更高的隔离性,可以防止不相关容器之间的网络通信。
-
灵活性:可以根据需求配置网络的驱动和选项。
管理自定义网络
-
查看所有网络:
docker network ls
-
查看网络详细信息:
docker network inspect my_network
-
删除自定义网络:
docker network rm my_network
示例用法
创建并使用自定义桥接网络
-
创建自定义网络:
docker network create my_bridge_network
-
运行容器并连接到自定义网络:
docker run --network my_bridge_network --name container1 -d nginx docker run --network my_bridge_network --name container2 -d httpd
-
容器之间的通信: 现在,
container1
和container2
可以通过名称互相访问。例如,在container1
内执行:docker exec -it container1 curl container2
-
-
-
--restart
:设置容器的重启策略,可以是no
、on-failure
、always
或unless-stopped
。docker run --restart unless-stopped IMAGE
-
-
Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过使用 YAML 文件来配置应用程序的服务,Docker Compose 可以管理和协调这些服务,使其能够协同工作。Docker Compose 提供了一个简化的命令行接口,来构建、启动和停止多容器应用。
Docker Compose 的基本概念
-
服务(Services): 定义单个容器应用程序的一个实例,例如 web 服务器、数据库等。
-
网络(Networks): 用于定义服务之间的网络连接。
-
卷(Volumes): 用于定义服务使用的数据存储位置。
Docker Compose 文件(docker-compose.yml)
docker-compose.yml
文件是 Docker Compose 的核心,通过这个文件,你可以定义多容器应用的所有服务、网络和卷。
Docker Compose 文件示例
以下是一个简单的 docker-compose.yml
文件示例,定义了一个 Web 应用程序和一个数据库服务:
version: '3' services: web: image: nginx:latest ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html depends_on: - db db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example volumes: - db_data:/var/lib/mysql volumes: db_data:
使用 Docker Compose
1. 创建 docker-compose.yml
文件
将上述示例内容保存为 docker-compose.yml
文件。
2. 启动服务
在 docker-compose.yml
文件所在的目录中运行以下命令启动所有服务:
docker-compose up
加上 -d
选项可以在后台运行:
docker-compose up -d
3. 查看运行状态
使用以下命令查看正在运行的服务:
docker-compose ps
4. 停止服务
使用以下命令停止所有服务:
docker-compose down
5. 构建服务
如果服务需要构建自定义镜像,可以在 docker-compose.yml
中使用 build
指令。然后运行以下命令构建镜像:
docker-compose build
6. 日志查看
使用以下命令查看服务的日志输出:
docker-compose logs
7. 执行命令
可以在运行的容器中执行命令。例如,进入 web
服务的容器:
docker-compose exec web /bin/bash