文章目录
- 原理
- Docker 的核心概念
- Docker 的工作原理
- Docker 的主要特点
- Docker网络
- Docker Bridge 网络
- Host 网络模式
- None 网络模式
- 用户自定义网络
- 端口映射
- Docker Compose 网络
- Docker Swarm 模式下的网络
- 常见命令行
- 基本命令
- 镜像相关命令
- 容器相关命令
- 网络相关命令
- 其他命令
- 其他补充说明
- 1. 修改全局配置
- 2. docker run常用参数
- 通用参数
- 启动参数
- 示例
原理
Docker 是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 的核心概念
-
镜像 (Image): 镜像是创建 Docker 容器的基础。镜像是只读模板,例如一个 Ubuntu 发行版的镜像。镜像可以通过 Dockerfile 文件来构建,该文件定义了如何从基础镜像开始,逐步添加或修改文件系统中的内容,最终生成一个新的镜像。
-
容器 (Container): 容器是由镜像运行起来的实例。容器包含了应用程序所需的全部内容:代码、运行时、系统工具、系统库和设置。每个容器都是由其镜像创建的,并且容器可以在同一主机上独立运行多个,互不影响。
-
仓库 (Repository): 仓库是集中存放镜像文件的地方。用户可以将镜像推送到公共或私有仓库,以供他人下载使用。Docker Hub 是一个常用的公共仓库。
Docker 的工作原理
-
Cgroups (Control Groups): Docker 利用 Linux 内核的 Cgroups 功能来限制、隔离进程组使用的系统资源(CPU、内存、磁盘 I/O 等)。
-
Namespaces: Docker 使用 Linux Namespaces 来实现容器间的隔离。Namespaces 提供了 PID、网络、IPC、用户、主机名、UTS 等方面的隔离。
-
Union File System (UnionFS): Docker 使用一种特殊的文件系统类型,这种文件系统支持文件叠加合并和写时复制特性。这使得 Docker 能够高效地管理容器的文件系统,并且很容易地从镜像创建新的文件系统。
Docker 的主要特点
-
轻量级: 相较于传统的虚拟机技术,Docker 容器共享主机的操作系统内核,因此占用资源较少,启动速度更快。
-
可移植性: 应用程序被打包在容器里,可以跨平台运行,无论是开发环境还是生产环境。
-
一致性: Docker 确保开发、测试、生产环境中运行的应用程序具有一致性,减少了“在我的机器上能运行”的问题。
-
可扩展性: Docker 容器易于复制,可以快速创建和销毁,非常适合微服务架构下的应用部署。
通过这些原理和技术,Docker 提供了一个强大而灵活的平台,使得开发者能够更容易地构建、部署和运行分布式应用。
Docker网络
Docker 使用了几种不同的技术来实现容器之间的网络通信。理解 Docker 的网络原理可以帮助更好地管理容器间的数据流以及与外部网络的交互。以下是一些关键的概念和技术:
Docker Bridge 网络
- 默认网络:当创建一个新的 Docker 容器时,如果没有显式地指定网络,那么 Docker 会自动将容器连接到默认的
bridge
网络上。这个bridge
网络是一个由 Docker 创建的虚拟网络,它允许容器之间相互通信。 - 容器接口:每个连接到
bridge
网络的容器都会被分配一个私有的 IPv4 地址,并且会有一个虚拟网络接口连接到这个bridge
网络的虚拟交换机上。 - NAT(Network Address Translation):从
bridge
网络出来的流量会被 NAT 成 Docker 主机的 IP 地址,这样容器就可以与外部网络通信。
Host 网络模式
- 直接使用主机网络栈:在某些情况下,你可能希望容器直接使用宿主机的网络堆栈而不是虚拟的
bridge
网络。在这种情况下,可以使用--net=host
标志启动容器。 - 无隔离:这种模式下,容器将不会有自己的网络接口,而是直接使用宿主机的网络接口。这对于需要直接访问宿主机网络的应用程序很有用,但是会失去网络隔离性。
None 网络模式
- 无网络连接:如果不需要网络连接,可以使用
--net=none
启动容器。这样的容器没有网络接口,不能与其他容器或外部网络通信。
用户自定义网络
- 非默认网络:除了默认的
bridge
网络之外,用户还可以创建自己的网络,并将容器连接到这些网络上。这允许更细粒度的网络控制,例如隔离特定的应用程序组。 - 网络驱动:用户可以使用不同的网络驱动来实现不同类型的网络,如
overlay
(适用于跨多个 Docker 宿主机的集群环境)、macvlan
(直接使用物理网络设备)、aliyun
(阿里云专有网络)等。
端口映射
- 端口转发:使用
-p
或--publish
参数可以在 Docker 主机上打开一个端口并将其映射到容器中的某个端口。这样可以从外部直接访问容器内的服务。
Docker Compose 网络
- 多容器网络:Docker Compose 允许在一个文件中定义多个容器及其网络配置。Compose 会在启动容器时自动创建一个默认网络,并将所有容器连接到该网络,或者你可以显式地定义网络并连接容器。
Docker Swarm 模式下的网络
- 集群网络:在 Docker Swarm 模式下,可以创建全局或覆盖网络,以实现容器在多个节点上的透明通信。
理解这些概念可以帮助有效地管理和优化 Docker 环境中的网络流量。根据你的具体需求,可以选择适合的网络模式和配置。
常见命令行
Docker 提供了一系列的命令行工具来帮助用户管理和操作容器、镜像、网络等。下面是一些常用的 Docker 命令及其简要说明。请注意,为了执行这些命令,你需要先安装 Docker 并确保 Docker 服务正在运行。
基本命令
docker run
: 运行一个容器。这是最常用的命令之一,用于启动一个新的容器。例如docker run -it ubuntu
将会启动一个基于 Ubuntu 镜像的交互式终端。- docker ps: 列出当前正在运行的容器。可以加上
-a
参数来显示所有容器(包括停止的)。 - docker stop: 停止一个或多个正在运行的容器。例如
docker stop container_id_or_name
。 - docker rm: 移除一个或多个已经停止的容器。例如
docker rm container_id_or_name
。 - docker rmi: 移除一个或多个镜像。例如
docker rmi image_id_or_tag
。 - docker images 或 docker i: 列出本地所有镜像。
- docker pull: 从 Docker Hub 或其他注册表拉取一个镜像。例如
docker pull nginx
。 - docker push: 将本地镜像推送到 Docker Hub 或其他注册表。例如
docker push your_username/your_image:tag
。 - docker build: 构建一个镜像。通常与一个 Dockerfile 一起使用。例如
docker build -t my_image .
。 - docker exec: 在正在运行的容器中运行命令。例如
docker exec -it container_id_or_name bash
。
镜像相关命令
- docker tag: 标记一个镜像。例如
docker tag ubuntu:latest your_username/ubuntu:latest
。 - docker history: 显示镜像的历史记录。
- docker save/load: 分别用于保存镜像到 tar 文件或将镜像从 tar 文件加载回本地。
容器相关命令
- docker cp: 复制文件或目录到容器中,或者从容器复制出来。
- docker commit: 创建一个新的镜像,基于对一个容器所作的更改。
docker logs
: 查看容器的日志输出。- docker top: 显示正在运行的容器内的进程列表。
- docker diff: 检查容器文件系统的更改。
网络相关命令
- docker network create: 创建一个新的网络。
- docker network ls: 列出所有的网络。
- docker network inspect: 显示一个网络的详细信息。
- docker network connect/disconnect: 将容器连接到或从网络断开。
其他命令
- docker info: 显示 Docker 系统的信息。
- docker version: 显示 Docker 的版本信息。
- docker login/logout: 登录或登出 Docker 注册表。
- docker search: 搜索 Docker Hub 上的镜像。
其他补充说明
1. 修改全局配置
- 修改
/etc/docker/daemon.json
{
"debug": true,
//指定不验证证书的私有注册表地址
"insecure-registries": ["192.168.57.12:5000"],
"exec-opts": ["native.cgroupdriver=systemd"],
//设置日志驱动的具体选项
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
//设置存储驱动的选项
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
//docker数据根目录
"data-root": "/var/lib/docker-new",
//当 Docker 服务意外停止时,是否恢复正在运行的容器
"live-restore": true
}
- 修改完配置,需要重新加载配置,或者重启服务器
sudo systemctl daemon-reload
sudo systemctl restart docker
2. docker run常用参数
docker run
命令是 Docker 中最常用的一个命令,它用于启动一个新的容器。这个命令有很多参数可用于控制容器的行为。下面是 docker run
的一些常见参数及其详细解释:
通用参数
- -d: 以守护程序(后台)模式运行容器。这意味着容器会在后台启动,命令行不会被容器占用。
- –name NAME: 给容器指定一个名字。如果不指定,Docker 会自动生成一个名字。
- -p [hostPort:]containerPort[:proto]: 将宿主机的端口映射到容器的端口。例如
-p 8080:80
表示将宿主机的 8080 端口映射到容器的 80 端口。 - -P: 类似于
-p
但是 Docker 会随机映射宿主机的端口到容器的端口,并且只暴露 TCP 协议的端口。 - –rm: 在容器退出后自动删除容器。这对于临时使用或测试非常有用。
- –restart POLICY: 设置容器重启策略。例如
--restart always
会让容器在 Docker 服务启动时自动重启。 - -v HOST_PATH:CONTAINER_PATH: 绑定挂载宿主机目录到容器目录。例如
-v /mnt/vol:/data
表示将宿主机/mnt/vol
目录挂载到容器的/data
目录。 - –env KEY=VALUE 或 -e KEY=VALUE: 设置环境变量。例如
--env MY_VAR=myvalue
。 - –network NETWORK: 指定容器加入的网络。默认情况下,容器会加入到
bridge
网络。 - –cap-add CAPABILITY: 添加容器的内核能力。例如
--cap-add=NET_ADMIN
。 - –device HOST_PATH:CONTAINER_PATH: 绑定挂载宿主机设备到容器。
- –security-opt security_opt=value: 设置安全选项,例如 SELinux 标签。
- –privileged: 开启特权模式, 并提供更细粒度的权限控制
Capabilities (能力): 通过 --cap-add 和 --cap-drop 选项,你可以更精细地控制容器的能力,而不是全盘授予特权。
设备挂载: 使用 --device 选项来挂载特定的设备到容器中,这样容器就可以访问所需的硬件资源,而不必拥有全部的特权。
用户命名空间: 如果你只需要改变容器内的用户 ID,可以使用用户命名空间来达到目的。
启动参数
- -i: 以交互模式运行容器。即使没有附加也保持标准输入打开。
- -t: 分配一个伪 tty。通常与
-i
一起使用来获得交互式 shell。 - –entrypoint CMD: 覆盖容器镜像中定义的入口点。如果没有指定
ENTRYPOINT
,则默认为镜像的命令。 - CMD CMD: 运行容器时要执行的命令。如果镜像中指定了
CMD
,那么docker run
的CMD
参数将会覆盖它。
示例
这里有几个 docker run
的实际使用示例:
- 后台运行一个 Nginx 容器并映射端口:
docker run -d -p 8080:80 nginx
- 运行一个交互式的 Bash shell,并挂载宿主机目录:
docker run -it -v /mnt/vol:/data ubuntu bash
- 设置环境变量并指定容器名称:
docker run --name my_container -e MY_VAR=myvalue ubuntu
- 使用自定义的网络启动容器:
docker run --network my_network nginx
- 覆盖容器的入口点并传递参数:
docker run --entrypoint /bin/bash ubuntu