概要
概念
容器(Container)
- 定义:容器是镜像的一个实例,是运行中的应用程序。每个容器都是一个独立的环境,包含了应用程序及其所有依赖。
- 作用:容器提供了一个隔离的环境,使得应用程序可以在不同的系统上以相同的方式运行。容器可以启动、停止、删除和重启。
镜像(Image)
- 定义:镜像是一个只读的模板,用于创建容器。镜像包含了应用程序及其运行所需的所有文件、库和环境设置。
- 作用:镜像是容器的基础,提供了应用程序的运行环境。可以通过 Docker Hub 或其他镜像仓库下载和共享镜像。
卷(Volume)
- 定义:卷是 Docker 提供的一种持久化数据存储机制,可以在容器之间共享数据。
- 作用:卷用于保存容器生成的数据,确保数据在容器重启或删除后仍然存在。使用卷可以避免数据丢失,并且可以在多个容器之间共享数据。
Dockerfile
- 定义:Dockerfile 是一个文本文件,包含了一系列指令,用于自动化创建 Docker 镜像的过程。
- 作用:通过 Dockerfile,开发者可以定义如何构建镜像,包括基础镜像、安装依赖、复制文件和设置环境变量等。使用 docker build 命令可以根据 Dockerfile 创建镜像。
网络(Network)
- 定义:Docker 网络是容器之间和容器与外部世界之间的通信方式。
- 作用:Docker 提供了多种网络模式(如 bridge、host、overlay 等),使得容器可以相互通信或与外部服务交互。网络配置可以帮助管理容器的访问权限和流量。
服务(Service)
- 定义:在 Docker Swarm 模式下,服务是一个定义了如何运行容器的抽象。
- 作用:服务允许用户在集群中管理和扩展容器。通过服务,用户可以定义容器的数量、更新策略和负载均衡等。
任务(Task)
- 定义:任务是 Docker Swarm 中服务的一个实例,表示一个正在运行的容器。
- 作用:任务负责执行服务的具体工作,Swarm 会根据服务的定义自动管理任务的创建、调度和监控。
Docker Hub
- 定义:Docker Hub 是一个公共的镜像仓库,用户可以在其中存储和共享 Docker 镜像。
- 作用:Docker Hub 提供了一个平台,开发者可以从中下载公共镜像,也可以将自己的镜像上传到 Hub 以供他人使用。
dockerfile文件与compose.yaml 文件的区别
在 Docker 的生态系统中,Dockerfile 和 docker-compose.yaml 文件是两个重要的配置文件,它们各自有不同的用途和功能。以下是它们之间的主要区别:
定义和用途
Dockerfile:
- 定义:
Dockerfile是一个文本文件,包含了一系列指令,用于自动化构建 Docker 镜像。 - 用途:通过
Dockerfile,开发者可以定义如何构建一个镜像,包括基础镜像、安装依赖、复制文件、设置环境变量等。使用docker build命令可以根据Dockerfile创建镜像。
- 定义:
docker-compose.yaml:
- 定义:
docker-compose.yaml是一个 YAML 格式的文件,用于定义和管理多个 Docker 容器的应用程序。 - 用途:通过
docker-compose.yaml,开发者可以定义多个服务(容器)、网络和卷等配置。使用docker-compose up命令可以根据该文件启动整个应用程序的多个容器。
- 定义:
主要内容
Dockerfile:
包含构建镜像的指令,如
FROM、RUN、COPY、CMD等。示例:
dockerfileFROM node:14 WORKDIR /app COPY package.json ./ RUN npm install COPY . . CMD ["node", "app.js"]
docker-compose.yaml:
包含服务的定义、网络配置、卷挂载等信息。
示例:
yamlversion: '3' services: web: build: . ports: - "3000:3000" db: image: postgres environment: POSTGRES_PASSWORD: example
作用范围
- Dockerfile:
- 主要用于构建单个 Docker 镜像,定义镜像的内容和行为。
- docker-compose.yaml:
- 用于定义和管理多个相关的服务(容器),可以同时启动、停止和管理多个容器。
- Dockerfile:
使用场景
- Dockerfile:
- 当你需要创建一个自定义的 Docker 镜像时,使用
Dockerfile。
- 当你需要创建一个自定义的 Docker 镜像时,使用
- docker-compose.yaml:
- 当你需要管理一个由多个服务组成的应用程序时,使用
docker-compose.yaml。例如,一个 Web 应用可能需要一个 Web 服务器和一个数据库服务。
- 当你需要管理一个由多个服务组成的应用程序时,使用
- Dockerfile:
总结
- Dockerfile 用于构建单个 Docker 镜像,定义镜像的内容和行为。
- docker-compose.yaml 用于管理多个 Docker 容器,定义服务、网络和卷等配置。
这两个文件通常是一起使用的,Dockerfile 用于构建镜像,而 docker-compose.yaml 用于管理和运行这些镜像所创建的容器。
安装 Docker
bash
brew install docker启动 Docker
bash
brew services start docker停止 Docker
bash
brew services stop docker查看 Docker 状态
bash
brew services list查看 Docker 版本
bash
docker --version镜像操作
搜索镜像
bash
docker search <image_name>拉取镜像
bash
docker pull <image_name>查看镜像
bash
docker images删除镜像
bash
docker rmi <image_id>删除所有镜像
bash
docker rmi $(docker images -aq)创建镜像(指定Dockerfile)
bash
docker build -f Dockerfile -t my_image:v0.0.1 .提交镜像
bash
docker commit -m "my_message" -a "my_author" my_container my_image打包镜像
bash
docker save -o my_image.tar my_image加载镜像
bash
docker load -i my_image.tar本地登录
bash
docker login本地登出
bash
docker logout命名镜像
bash
docker tag my_image my_new_image:latest推送镜像
bash
docker push my_image:latest容器操作
启动容器
bash
docker run -d --name my_container -p 8080:80 my_image查看当前活跃的容器
- -a 查看所有容器
- -l 查看最新创建的容器(默认)
- -n 查看最近创建的 n 个容器
bash
docker ps停止容器
bash
docker stop my_container重启容器
bash
docker restart my_container删除容器
bash
docker rm my_container查看容器日志
bash
docker logs my_container进入容器
bash
docker exec -it my_container /bin/bash复制文件到容器
bash
docker cp my_file my_container:/app查看容器状态
bash
docker stats my_container查看容器信息
bash
docker inspect my_container查看容器端口映射
bash
docker port my_container存储
目录挂载与卷映射的区别
在 Docker 中,目录挂载(bind mount)和卷映射(volume)都是用于持久化数据的方式,但它们之间有一些重要的区别。以下是这两者的主要区别:
定义
- 目录挂载(Bind Mount):
- 目录挂载是将主机上的一个目录或文件直接挂载到容器内的指定路径。它允许容器访问主机文件系统中的特定位置。
- 卷映射(Volume):
- 卷是 Docker 管理的持久化存储,存储在 Docker 的管理目录中(通常在
/var/lib/docker/volumes/)。 - 卷是由 Docker 创建和管理的,容器可以通过卷来持久化数据。
- 卷是 Docker 管理的持久化存储,存储在 Docker 的管理目录中(通常在
- 目录挂载(Bind Mount):
数据存储位置
- 目录挂载:
- 数据存储在主机的文件系统中,直接与主机的目录或文件相关联。
- 卷映射:
- 数据存储在 Docker 的管理目录中,Docker 负责管理卷的生命周期。
- 目录挂载:
生命周期
- 目录挂载:
- 目录挂载的生命周期与主机上的目录或文件相同。如果删除主机上的目录,容器将无法访问该目录。
- 卷映射:
- 卷的生命周期与容器无关。即使容器被删除,卷仍然存在,数据不会丢失。可以在
多个容器之间共享卷。
- 卷的生命周期与容器无关。即使容器被删除,卷仍然存在,数据不会丢失。可以在
- 目录挂载:
性能
- 目录挂载:
- 由于直接访问主机文件系统,性能可能会受到主机文件系统的影响,尤其是在 Linux 上。
- 卷映射:
- 卷通常在 Docker 的管理下,性能更优,因为 Docker 可以优化卷的存储和访问。
- 目录挂载:
使用方式
目录挂载:
使用
-v或--mount选项时指定主机路径。例如:bashdocker run -v /host/path:/container/path my_image
卷映射:
使用
-v或--mount选项时指定卷名称。例如:bashdocker run -v my_volume:/container/path my_image
适用场景
- 目录挂载:
- 适用于需要直接访问主机文件系统的场景,例如开发环境、调试等。
- 卷映射:
- 适用于需要持久化数据的生产环境,尤其是需要在多个容器之间共享数据的场景。
- 目录挂载:
总结
- 目录挂载 直接与主机文件系统关联,适合开发和调试。
- 卷映射 是 Docker 管理的持久化存储,适合生产环境和数据共享。
目录挂载
作用
- 内外数据实时同步
- 关闭容器,数据不丢失
参数
- -v 挂载到容器
- -v /app:/app 挂载到主机
- -v /app:/app:ro 挂载到主机,并设置为只读
- -v /app:/app:rw 挂载到主机,并设置为可读写
- -v /app:/app:z 挂载到主机,并设置为私有
- -v /app:/app:Z 挂载到主机,并设置为私有
bash
docker run -d --name my_container -v /app:/app my_image数据卷
创建数据卷
bash
docker volume create my_volume查看卷
bash
docker volume ls查看卷详情
bash
docker volume inspect my_volume网络 (容器之间网络通讯)
- docker 每个容器启动后都会分配一个独立的IP地址,容器之间可以直接使用容器IP直接通讯,端口直接使用容器的端口即可
查看IP地址
bash
docker container inspect my_image容器IP访问
bash
curl http://192.127.0.1:80创建自定义域名空间
- 容器IP会变更
bash
docker run -d -p 8080:80 --name my_container --network mynet my_image自定义域名访问
- 直接使用容器名称
bash
curl http://my_container:80docker compose
上线
- d 后台启动
- f 指定配置文件
bash
docker compose up -d -f compose.yaml下线
bash
docker compose down指定启动
bash
docker compose start x1 x2 x3指定容器扩容(复制启动n份)
bash
docker compose scale x2=3指定停止
bash
docker compose stop x1 x2 x3案例
Redis主从集群
直接使用第三方镜像bitnami/redis