1.docker网络
Docker网络是Docker容器之间进行通信的关键功能。Docker提供了多种网络模式和驱动,以满足不同的网络需求。以下是Docker网络的详细介绍:
1.Docker网络模式
Docker提供了以下几种网络模式,每种模式适用于不同的场景:
1.1 Bridge(默认模式)
特点:每个容器都有自己的虚拟网络接口,并连接到Docker的默认桥接网络(docker0)。
适用场景:适用于需要容器之间互相通信的场景。
docker run -d --name container1 -p 8080:80 nginx
1.2 Host
特点:容器直接使用宿主机的网络栈,没有网络隔离。
适用场景:适用于需要高性能网络的场景。
docker run -d --name container2 --network host nginx
1.3 None
特点:容器没有网络功能,需要手动配置网络。
适用场景:适用于不需要网络的容器。
docker run -d --name container3 --network none nginx
1.4 Overlay
特点:用于Docker Swarm模式,支持跨主机的容器网络。
适用场景:适用于多主机的容器网络。
docker network create --driver overlay my_overlay_network
docker run -d --name container4 --network my_overlay_network nginx
2.Docker网络驱动
Docker支持多种网络驱动,每种驱动适用于不同的网络需求:
2.1 Bridge Driver
默认驱动,适用于单主机的容器网络。
创建自定义bridge网络:.
docker network create --driver bridge my_bridge_network
2.2 Host Driver
容器直接使用宿主机的网络栈。
适用于需要高性能网络的场景。
2.3 Overlay Driver
适用于Docker Swarm模式,支持跨主机的容器网络。
创建overlay网络:
docker network create --driver overlay my_overlay_network
2.4 MACVLAN Driver
适用于需要容器拥有独立MAC地址的场景。
创建MACVLAN网络:
docker network create --driver macvlan --subnet 192.168.1.0/24 --gateway 192.168.1.1 my_macvlan_network
3.查看和管理Docker网络
查看网络列表:
docker network ls
查看网络详情:
docker network inspect my_bridge_network
创建网络:
docker network create my_bridge_network
删除网络:
docker network rm my_bridge_network
连接容器到网络:
docker network connect my_bridge_network container1
断开容器与网络的连接:
docker network disconnect my_bridge_network container1
4.ADD 和 WORKDIR的区别
在 Dockerfile 中,ADD 和 WORKDIR 是两个完全不同的指令,它们的功能和用途完全不同。以下是它们的详细区别:
1.功能
ADD:
用于将文件或目录从本地主机复制到 Docker 镜像中。
可以复制本地文件、目录,或者从 URL 下载文件。
如果目标路径不存在,Docker 会自动创建所需的目录。
例如:
ADD file.txt /app/
ADD https://example.com/file.txt /app/
WORKDIR:
用于设置 Docker 容器中的工作目录(working directory)。
后续的指令(如 RUN、CMD、ENTRYPOINT 等)都会在这个目录下执行。
如果目录不存在,Docker 会自动创建它。
例如:
WORKDIR /app
RUN echo "Current directory is $(pwd)"
2.用途
ADD:
主要用于将文件或目录复制到镜像中。
适合在构建镜像时添加文件或依赖项。
例如,将代码文件、配置文件或依赖包复制到镜像中。
WORKDIR:
主要用于设置容器内的工作目录。
适合在运行容器时指定工作路径,方便后续命令的执行。
例如,设置工作目录为 /app,然后运行 RUN 命令安装依赖。
3.示例对比
使用 ADD:
FROM alpine
ADD file.txt /app/file.txt # 将本地的 file.txt 复制到镜像的 /app/ 目录
使用 WORKDIR:
FROM alpine
WORKDIR /app # 设置工作目录为 /app
RUN echo "Hello World" > file.txt # 在 /app 目录下创建 file.txt
4.Dockerfile 中 CMD 与 ENTRYPOINT 区别
1.功能区别
CMD:
CMD 是容器启动时的默认命令。
如果用户在运行容器时没有指定命令,CMD 中的命令会被执行。
如果用户在运行容器时指定了命令,则 CMD 中的命令会被覆盖。
通常用于提供容器的默认行为,但允许用户在运行时动态修改。
ENTRYPOINT:
ENTRYPOINT 是容器的入口点(entry point)。
它定义了容器启动时必须执行的命令。
如果用户在运行容器时指定了命令,这些命令会被作为参数传递给 ENTRYPOINT 定义的命令。
ENTRYPOINT 提供了一种更固定的行为,通常用于确保容器始终以某种方式运行。
2.用法区别
CMD:
语法:CMD [“command”, “param1”, “param2”] 或 CMD command param1 param2
CMD ["echo", "Hello World"]
或者
CMD echo Hello World
ENTRYPOINT:
语法:ENTRYPOINT [“command”, “param1”, “param2”] 或 ENTRYPOINT command param1 param2
ENTRYPOINT ["echo", "Hello World"]
或者
ENTRYPOINT echo Hello World
3.覆盖性区别
CMD:
如果用户在运行容器时指定了命令,则 CMD 中的命令会被覆盖。
例如:
docker run my_image echo "Custom Command"
这里,echo “Custom Command” 会覆盖 CMD 中的默认命令。
ENTRYPOINT:
如果用户在运行容器时指定了命令,这些命令会被作为参数传递给 ENTRYPOINT 定义的命令。
例如:
ENTRYPOINT ["echo"]
运行容器时:
docker run my_image "Custom Command"