定义 Docker 为:Docker 可以定义为一个开源平台,它自动完成将应用程序部署到轻量级、便携容器的过程。
定义 Docker 镜像:Docker 镜像是一个模版,包含了运行应用程序所需的所有代码、依赖项和环境变量,在容器中运行。
什么是容器:容器就是一个软件包,包含应用程序运行所需的所有内容,以实现无缝运行。
Docker 守护进程是什么:一个一直在后台运行的进程,管理 Docker 的各种对象,比如镜像、容器、网络和存储卷
定义 Docker 引擎(或 Docker 容器引擎):用于创建和运行容器的技术手段。
Docker Desktop 是什么: Docker Desktop 是一个很容易安装的应用,可以在您的 Mac、Windows 或 Linux 系统上运行,帮助您轻松构建和共享容器化应用和服务。
什么是Docker仓库: Docker仓库是用来存放Docker镜像的地方。Docker Hub是一个公共仓库,任何人都可以使用它,而且Docker默认会从Docker Hub查找镜像。你甚至可以运行自己的私有仓库来存储镜像。
- Docker 架构 :
- Docker 的生命周期?
我们可以用上面的图来了解Docker的生命周期。
有三件重要的事儿啊,
docker build -> 从Dockerfile构建Docker镜像
docker run -> 运行容器,基于Docker镜像
docker push -> 将容器镜像推送到公共或私有仓库共享
图像与容器:
图像:模板
容器:运行中的图像实例,包含无缝运行应用所需的全部软件包。
端口映射是什么以及为什么需要:一种技术,允许容器的服务端口被暴露给主机或其他网络设备,以便它们可以访问这些服务。
什么是 Docker 层:Docker 层是构成 Docker 镜像的构建块,每个指令都会生成一个新的层。最终镜像就是这样逐步构建出来的。这样不仅可以逐步构建,还可以将层缓存起来以备将来使用。
Docker卷(volume):它是一种文件系统,用于将数据存放在容器之外。当我们删除容器或容器停止运行时,容器内的数据会被一并删除,因此,为了保存数据,我们需要使用Docker卷。
什么是Docker网络 ,它是允许容器之间可以互相通信,或者与外部主机进行通信的功能。
当容器默认情况下被创建时,它会有桥接网络(也称为Docker0)。这些网络通过VEth与本地主机连接。
Veth是什么?它是一个虚拟以太网设备(简称Veth),充当连接容器与主机的网络桥之间的虚拟电缆。
什么是挂载绑定:它用于将主机上的文件或目录等挂载到容器。
……
一些基本的命令:
docker run : 运行镜像
docker images : 列出镜像
docker pull : 从Docker Hub仓库拉取镜像
docker ps : 列出正在运行的容器
docker kill : 关闭容器
docker rmi : 删除镜像
docker build -t :latest . (指定构建位置)
docker exec -it /bin/bash
docker volume create : 创建一个新的卷
docker volume ls : 列出创建的卷
docker run -v : 将卷挂载到容器中 -p : 将端口映射到容器中
docker network create : 创建网络
docker logs : 获取容器日志(如果容器运行在分离模式下)
docker -v : 用于绑定挂载
docker network ls : 获取网络列表
docker inspect : 查看容器详情
docker volume inspect : 查看卷详情
docker volume rm : 删除卷
此处无内容
属性:
-d : 后台模式,用于将容器在后台运行并释放终端
-p : 用于端口映射
-t : 用于指定标签
-e : 设置环境变量
-it : 交互式运行
--name : 用于给容器命名
--network : 连接网络
-v : 挂载卷
一些 Docker 命令示例:
docker build -t test:latest .
docker network create check
docker run -p 3000:3000 --network=check test
docker run -p 3000:3000 --name=test_container --network=check test
docker run -v /host_app:/container_app node:16-alpine 或
docker run -d --mount source=<volume_name>,target=/app <image_name>
docker run -it --name=test_mount \
--mount type=bind, source=$(pwd)/app, target=/usr/src/app \
node:16-alpine
全屏查看,退出全屏
在Ubuntu上安装Docker的命令如下:
你可以在 AWS 上创建一个 Ubuntu EC2 实例,并运行以下命令来安装 Docker。
sudo apt update
sudo apt install docker.io -y # 更新软件包列表并安装 Docker
点全屏,再点这儿退出
你可以用以下命令来检查 docker 守护进程是否真的已经启动并正在运行。
运行此命令可以查看 Docker 服务的状态:sudo systemctl status docker
全屏模式。退出全屏。
如果你注意到 Docker 没有运行,可以使用下面的命令来启动 Docker。
下面的命令是用于启动Docker服务的:使用sudo
命令以管理员权限运行systemctl start docker
,这将启动Docker服务。
全屏模式 退出全屏
为了让你的用户能够运行 docker 命令,你可以将用户添加到 Docker 组。安装 Docker 时,默认会创建一个 Docker 组。
sudo usermod -aG docker ubuntu
使用sudo命令,我们将ubuntu用户添加到了docker用户组中。
全屏,退出全屏
docker run hello-world
执行 docker run hello-world
命令。
全屏,退出全屏
示例 Docker 文件示例:FROM ubuntu:latest
WORKDIR /app
COPY . /app
RUN apt-get update && apt-get install -y python3 python3-pip
ENV 'key' 'value'
CMD ['python', 'app.py']
进入全屏/退出全屏
Docker 多阶段示例
###########################################
# 基础图像
###########################################
FROM ubuntu AS build
RUN apt-get update && apt-get install -y golang-go
ENV GO111MODULE=off
COPY . .
RUN CGO_ENABLED=0 go build -o /app .
############################################
# 多阶段构建的精髓从这里开始
############################################
FROM scratch
# 从构建阶段复制编译出的二进制文件
COPY --from=build /app /app
# 将容器的入口点设置为运行二进制文件
ENTRYPOINT ["/app"]
全屏/退出全屏
示例:compose.yaml 文件
services:
backend:
build: ./mern/backend
ports:
- "5050:5050"
networks:
- mern_network
environment:
MONGO_URI: mongodb://mongo:27017/mydatabase
depends_on:
- mongodb
前端:
build: ./mern/frontend
ports:
- "5173:5173"
networks:
- mern_network
environment:
REACT_APP_API_URL: http://backend:5050
mongodb:
image: mongo:latest
ports:
- "27017:27017"
networks:
- mern_network
volumes:
- mongo-data:/data/db
networks:
mern_network:
driver: bridge
volumes:
mongo-data:
driver: local # MongoDB 数据将被本地持久化
进入全屏,或者退出全屏。
以下为分隔线
容器从主机操作系统使用的文件和文件夹:
主机文件系统: Docker 容器可以使用绑定挂载访问主机文件系统,从而让容器能够读写主机文件系统中的文件。
网络堆栈: 主机的网络堆栈用于为容器提供网络连接。Docker 容器可以直接连接到主机的网络上,或者通过虚拟网络进行连接。
系统调用: 主机的内核处理来自容器的系统调用,从而使容器能够使用主机的资源(如CPU、内存和I/O)的途径。
命名空间: Docker 容器使用 Linux 命名空间来为容器中的进程创建一个隔离的运行环境。命名空间帮助隔离了诸如文件系统、进程 ID 和网络接口等资源。
控制组(cgroups,简称控制组): Docker 容器利用 cgroups 来限制和控制它们可以访问的资源,例如 CPU、内存和 I/O。
-
- 此处省略内容
- 在使用 Docker(Docker)时生产中遇到了什么问题,如何解决这些问题?
即使是较小的应用程序,Docker容器的大小也会明显增大,并且由于我们使用一个基础镜像并创建一个单阶段的Docker文件,这也可能会带来与操作系统相关的漏洞。为了解决这一问题,我们使用多阶段构建的Docker文件,并采用distroless镜像。
-
定义无发行版的 Docker 镜像: 无发行版的 Docker 镜像仅包含运行应用或服务所需的必要组件。
- 无发行版镜像有什么好处?
通过使用distroless镜像,大大减小了Docker容器的大小,并提供了最高级别的安全性。因为distroless镜像仅包含最少的软件,从而消除了所有与操作系统相关的漏洞。
与文件系统相关的容器问题是什么?
容器是基于实际的,意味着它没有永久存储,所以当容器停止运行时,所有文件都会丢失。为了解决这个问题,有以下两种方法。1)绑定挂载(bind mounts) 2)卷(volumes)
定义绑定挂载点: 它是一种方法,可以将容器文件系统与主机文件系统进行绑定,允许你将文件写入主机系统。
什么是卷:它是一种持久化的数据存储,允许用户在容器之外管理和保存数据。
绑定挂载(bind mount)和卷的区别:
将特定文件夹绑定挂载到docker容器,但Docker的卷(volume)会在主机的Docker存储目录下创建一个新的目录。
挂载由主机文件系统管理,而数据卷由Docker管理。
容器之间可以共享卷(数据卷),但不能共享绑定挂载(bind mount)。
同时,卷也有一个生命周期,这意味着你可以创建或删除卷。
如果你的主机系统空间不足,你也可以通过外部资源来扩展存储空间。
Docker COPY 和 ADD 之间的区别: Docker 的 ADD 命令不仅会从 URL 下载文件,还可以从本地主机复制文件到容器里,但是 COPY 命令只是从本地主机复制文件到容器里。
Docker CMD 与 ENTRYPOINT 的区别在于: CMD 可以被覆盖,ENTRYPOINT 则不能被覆盖。
Docker网络的类型:
桥接网络:这是默认的网络类型,适合大多数场景。
覆盖网络:用于让不同 Docker 主机上的容器之间相互通讯。
Macvlan 网络:用于将 Docker 容器连接到主机网络接口,从而让它们在主机网络中表现为一个物理设备。
主机网络:用于将容器直接连接到主机的网络接口,从而绑定端口。
Docker中多阶段构建的定义: 这意味着在多个阶段构建容器镜像,并允许从一个阶段复制工件到另一个阶段。
确保容器安全的步骤如下: 您可以使用distroless镜像来,使用sync工具扫描容器,并确保网络配置正确无误。
实时的挑战: Docker 守护进程宕了,整套系统就挂了。创建大量大容器的话,进程可能会变慢。这会以 root 用户身份运行,这会在根级别产生漏洞。
共同学习,写下你的评论
评论加载中...
作者其他优质文章