继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Docker全解1⃣️ —— 从基础到实战的全面指南

繁花不似锦
关注TA
已关注
手记 373
粉丝 50
获赞 241

定义 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的生命周期。

有三件重要的事儿啊,

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 用户身份运行,这会在根级别产生漏洞。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP