Docker 是一种开源的容器化平台,用于构建、打包、部署和运行应用程序及其所有依赖的环境。通过使用 Docker,开发者可以将应用程序及其环境打包成一个称为容器的轻量级、独立的单元。这些容器可以在任何支持 Docker 的环境中运行,确保应用在不同环境之间具有一致的运行行为。
核心概念
-
容器化技术:Docker 使用容器化技术来隔离应用程序及其依赖的环境。每个容器都是一个独立的运行单元,具有自己的文件系统、进程空间、网络配置等。容器化使得应用程序能够更加轻松地在不同环境中进行部署和迁移。
-
镜像:Docker 镜像是一个只读的模板,它包含了应用程序运行所需的所有文件、依赖、环境变量等。通过编写 Dockerfile 文件来定义镜像的构建过程,然后使用 Docker 命令构建镜像。镜像可以作为容器的基础,多个容器可以共享同一个镜像。
-
Docker 容器:容器是从镜像创建的实例,它是一个运行的进程,具有独立的命名空间、文件系统和资源限制。容器可以轻松地启动、停止、删除,可以在不同的主机和环境中移植,从而实现环境的一致性。
-
Docker Hub:Docker Hub 是一个公共的镜像仓库,开发者可以在其中找到各种常用的镜像,也可以上传自己构建的镜像供他人使用。此外,Docker Hub 还支持私有镜像仓库,用于组织内部的镜像管理。
-
Docker Compose:Docker Compose 是一个工具,允许你使用 YAML 文件定义多个容器的配置和关系,以便一键启动、停止多个容器,实现复杂应用的编排。
-
跨平台和一致性:由于 Docker 容器在不同平台上运行时依赖的是相同的容器引擎,因此可以实现跨平台的一致性。开发者可以在开发、测试和生产环境中使用相同的容器,减少了由环境差异引起的问题。
-
快速部署和扩展:Docker 容器的轻量级特性使得它们可以快速启动和停止,从而实现快速部署、回滚和扩展。这对于应对流量峰值和高可用性要求非常有利。
常用命令
docker images 本地的镜像
docker exec -it xxx /bin/bash 进入xxx容器
docker start xxx 启动xxx容器
docker stop xxx 停止xxx容器
docker restart xxx 重启xxx容器
docker rm xxx 删除xxx容器
docker rmi xxx 删除xxx镜像
docker search xxx 搜索xxx容器
docker pull xxx 拉取xxx镜像
docker run -d --name my-service xxx 运行拉取的xxx镜像,-d 表示在后台运行容器,--name 指定容器的名称
docker logs xxx 查看xxx容器的日志
docker stats 统计各个docker服务占用的资源
docker cp xxx:file ~ 将xxx容器file文件copy到当前文件夹
docker inspect xxx 查看xxx容器详细信息
docker system prune -a 这个命令将清理整个系统,并且只会保留真正在使用的镜像,容器,数据卷以及网络,因此需要格外谨慎,防止一些备份或者用于回滚的镜像被删除。
私有仓库上传镜像步骤:1.给已有镜像打一个tag。2.登录私有仓库。3.上传镜像到私有仓库 ps:xxx为镜像名称,docker-hub.company.cn为对应的私服地址
docker tag xxx docker-hub.company.cn/xxx
docker login -u user-p pass docker-hub.company.cn
docker push docker-hub.company.cn/xxx
如何构建一个镜像
创建 Dockerfile
在你的项目目录下创建一个名为 Dockerfile 的文件,用于定义构建镜像的步骤和配置。在 Dockerfile 中,你可以指定基础镜像、复制文件、设置环境变量等。以下是一个简单示例 Dockerfile(以一个简单的 Python Web 应用为例):
# 基础镜像
FROM python:3.8
# 工作目录
WORKDIR /app
# 复制当前目录下的文件到容器的 /app 目录
COPY . /app
# 安装应用所需的依赖
RUN pip install -r requirements.txt
# 暴露容器的端口
EXPOSE 80
# 启动应用
CMD ["python", "app.py"]
常用命令:
FROM:指定基础镜像;
WORKDIR:设置工作目录,后续的命令将在该目录中执行。
COPY 和 ADD:用于将文件从主机复制到容器中。COPY 更常用,用于简单的文件复制,而 ADD 更强大,可以自动解压缩文件,也支持从url尝试下载资源。
RUN:用于在镜像构建过程中执行命令,可以安装软件包、设置环境等。
ENV:设置环境变量。
EXPOSE:声明容器将监听的端口号。
CMD 和 ENTRYPOINT:定义容器启动时执行的命令。CMD 可以被docker run命令行中的命令覆盖,而 ENTRYPOINT 不会被覆盖。
USER:指定运行命令的用户名。
构建镜像
使用 docker build 命令来构建镜像。你需要指定 Dockerfile 的路径(当前目录或其他路径),还可以使用 -t 参数来为镜像设置一个标签。
docker build -t my-python-app .
在上述命令中,-t 参数用于设置镜像的标签,my-python-app 是镜像的名称,. 表示 Dockerfile 的路径为当前目录。
多阶段构建
Docker 提供了一种多阶段构建的功能,其中可以使用不同的基础镜像来构建不同阶段的镜像。
# 构建阶段
FROM golang:1.16 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 运行阶段
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
在上面的示例中,我们定义了两个阶段:
- 第一个阶段使用 golang:1.16 作为基础镜像,构建了一个 Go 应用程序,并将其命名为 builder。
- 第二个阶段使用 alpine:latest 作为基础镜像,运行了最终的应用程序,并从第一个阶段的构建中复制了编译后的二进制文件。
通过这种方式,我们可以确保最终的镜像只包含运行时所需的内容,而不包含构建工具和源代码,从而减小了镜像的大小。
网络配置
Docker 的网络配置允许你在容器之间以及容器与主机之间建立网络连接,使得容器能够相互通信,与外部世界进行交互,以及实现不同网络拓扑结构。Docker 提供了多种网络模式和选项,让你能够根据应用需求进行灵活配置。
-
默认网络模式:Docker 安装后,默认创建一个名为 bridge 的网络,这是一种默认网络模式,允许容器之间通过 IP 进行通信。每个容器会自动分配一个随机 IP,容器内的应用可以使用该 IP 进行通信。这种模式适用于大多数单机应用场景。
-
主机网络模式:在主机网络模式下,容器和主机共享同一个网络命名空间,容器直接使用主机的网络接口。这样容器可以使用主机的 IP 地址,但容器之间仍然需要通过端口来区分。
-
容器网络模式:在容器网络模式下,所有容器共享同一个网络命名空间,容器可以直接使用彼此的 IP 地址。这种模式适用于需要高度互通的容器集群。
-
自定义桥接网络:你可以创建自定义的桥接网络,允许容器在该网络中通信。这使得容器可以使用容器名进行通信,而不仅仅是 IP 地址。
-
Overlay 网络:Overlay 网络是用于跨主机容器的网络模式,允许不同主机上的容器之间通过虚拟网络进行通信。这在容器编排和集群管理中很有用,比如 Docker Swarm 和 Kubernetes。
-
MacVLAN 网络:MacVLAN 网络模式允许容器拥有自己的 MAC 地址,从而使得容器可以直接连接到物理网络,实现容器与外部网络的通信。
-
网络别名和服务发现:Docker 提供了网络别名和内置的 DNS 服务发现机制,使容器能够通过容器名或服务名来进行通信,而不仅仅依赖于 IP 地址。
-
端口映射:Docker 允许你将容器内部的端口映射到主机上的端口,从而允许外部网络通过主机的 IP 地址和映射的端口来访问容器内部的应用。
# 创建一个使用默认 bridge 网络的容器
docker run -d --name my-container nginx
# 使用主机网络模式启动容器
docker run -d --network host nginx
# 创建容器网络模式下的容器
docker run -d --name container-1 nginx
docker run -d --name container-2 --network container:container-1 nginx
# 创建一个自定义的桥接网络
docker network create my-bridge-network
# 启动容器并连接到自定义网络
docker run -d --network my-bridge-network --name container-1 nginx
docker run -d --network my-bridge-network --name container-2 nginx
# 在 Docker Swarm 中创建一个 Overlay 网络
docker network create --driver overlay my-overlay-network
# 启动服务并连接到 Overlay 网络
docker service create --network my-overlay-network --name my-service nginx
# 创建 MacVLAN 网络
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my-macvlan-network
# 启动容器并连接到 MacVLAN 网络
docker run -d --network my-macvlan-network --name container-with-macvlan nginx
# 启动容器并连接到网络
docker run -d --network my-bridge-network --network-alias my-alias nginx
# 在容器内使用网络别名
docker exec -it container-id /bin/bash
ping my-alias
# 启动容器并将容器内部的端口映射到主机端口
docker run -d -p 8080:80 --name my-container-with-port nginx
数据持久化
在 Docker 中实现数据持久化有多种方式,这些方式可以确保容器内的数据在容器被停止、销毁、重新创建或升级时得以保留。以下是几种常见的 Docker 数据持久化方式:
数据卷(Volumes)
数据卷是一种特殊的文件系统,可以将其挂载到容器内的特定路径,使得容器内的数据可以持久化保存在宿主机上。Docker 容器内的数据卷与容器外部的文件系统隔离,这样可以避免容器的生命周期影响数据。数据卷还可以被容器之间共享。
# 创建一个数据卷
docker volume create mydata
# 运行容器挂载数据卷
docker run -d -v mydata:/app/data myimage
# 删除数据卷,需要保证没有容器使用数据卷才可以删除
docker volume rm <volume_name>
主机文件系统挂载(Bind Mounts)
主机文件系统挂载允许你将宿主机上的目录或文件挂载到容器内,实现数据的共享和持久化。这种方式适用于需要在容器和宿主机之间共享数据的情况。
# 运行容器并使用主机文件系统挂载
docker run -d -v /path/on/host:/app/data myimage
共享存储驱动(Shared Storage Drivers)
如果你需要在多个 Docker 容器之间实现数据共享和持久化,可以使用共享存储驱动,如 NFS(Network File System)或 CIFS(Common Internet File System)
Docker compose
当你需要管理多个 Docker 容器并确保它们能够协同工作时,Docker Compose 是一个非常有用的工具。它允许你使用一个单独的配置文件来定义、配置和运行多个相关的容器,从而简化了容器编排的过程。
version: '3'
services:
webapp:
image: python:3.8
command: python app.py
ports:
- "5000:5000"
volumes:
- ./webapp:/app
depends_on:
- database
environment:
MYSQL_HOST: database
MYSQL_PORT: 3306
MYSQL_USER: root
MYSQL_PASSWORD: example
MYSQL_DB: mydb
database:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
在这个示例中,我们定义了两个服务:webapp 和 database。webapp 服务使用 Python 3.8 镜像,将当前目录下的 webapp 目录挂载到容器的 /app 目录,以便实时更新应用代码。它将应用程序命令设置为 python app.py,并将容器的 5000 端口映射到主机的 5000 端口。还定义了数据库的环境变量,以便连接到数据库服务。database 服务使用 MySQL 5.7 镜像,并设置了数据库的 root 密码和数据库名称。
要运行这个示例,只需在终端中导航到包含 docker-compose.yml 文件的目录,然后运行以下命令:
docker-compose up
这将启动两个服务,你的 Web 应用将在 http://localhost:5000 上访问,可以通过该 URL 进行访问。如果你要停止并销毁服务,可运行以下命令:
docker-compose down
也可以单独启动/停止某个项目,如下示例:
docker-compose up -d database
docker-compose stop database
Jib Maven
Jib Maven 插件(Jib Maven Plugin)是 Google 开源的一个构建工具,用于将 Java 应用程序容器化并推送到容器注册表,如 Docker Hub、Google Container Registry 等。它的主要目标是简化 Java 应用程序的容器化过程,特别是在使用 Maven 构建 Java 项目时。Jib Maven 插件与传统的 Dockerfile 不同,它不需要你编写 Dockerfile 或在本地安装 Docker,而是直接从 Maven 项目构建的内容创建容器镜像。
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.7.0</version>
<configuration>
<from>
<!--基础镜像-->
<image>xxxxx</image>
</from>
<to>
<!--目标镜像registry地址-->
<image>hub.docker.com/xxx</image>
<tags>
<!--版本号-->
<tag>5</tag>
</tags>
<auth>
<username>xxx</username>
<password>pass</password>
</auth>
</to>
<container>
<mainClass>xx.xx.Application</mainClass>
</container>
</configuration>
</plugin>
上面是一个简单的例子,只需运行 mvn compile jib:build 命令便可构建镜像并推送。
网友评论