Docker 基础概念 及 windows下使用

一. 原理与基础概念

docker 是开源的应用容器引擎, 通俗理解, 就像将货物通过集装箱托运一样, 将应用及环境依赖通过docker打包, 快速, 保证一致地作分发与部署.

Q:为什么要用docker ?
A:性能轻量,开销更低, 比传统的虚拟机更省钱.

docker运行在linux上, 严格讲它不是虚拟机, 而是一套文件隔离系统, 所以更轻量, 适合高密度部署, 也就更省钱.
docker-for-win10 就是运行在 WSL2 (Windows Subsystem for Linux) 之上的.

  • 镜像, image, 业务应用及完整依赖的打包.
  • 容器, container, 是镜像的实例化. 可 运行, 暂停, 删除. 镜像vs.容器 类比于 类vs.对象.
  • 仓库, repository

二. 安装 docker

docker 可以分为 GUI前端, cli 命令行工具与引擎后端 等.
个人电脑都是桌面环境, 所以有个 GUI 前端会很好用, 我们装 docker Desktop, 包含了上句所有.
但 开发/部署 环境通常在服务器, 因为个人电脑的 内存/gpu 等比不上服务器.

docker-desktop-for-windows 11

旧一点的文章, 要有准备工作, 开启 windows 功能 | Containers 与 Hyper-V , 服务 | server | 启动类型改自动并重启.

2023.04 在 Windows 11 家庭中文版 实测不需要, docker 会引导提示, 并且用 WSL 2 作为后台, 不涉及 Hyper-V.

开始安装:

  1. 下载 Docker Desktop Installer.exe , 约 650MB, 按照提示逐步安装. 它只能装在系统盘, 不能更改安装目录. 但使用中的容器存储位置是可以在GUI中设置更改的.
  2. 启动 docker engine
    在这里插入图片描述

内存/cpu 控制

  • 内存. vmmem 进程在占用, todo
  • cpu. todo.

c盘占用过大问题

能占用80G, 太夸张了. 主要是 .vhdx 硬盘映像文件. 默认存放在 C:\Users\yichu\AppData\Local\Docker\wsl 中, 导致C盘空间不足.

desktop-GUI 本身是能设置的, 在 齿轮图标 | Resources | Disk image location中更改. 但是! 遇到永久卡顿, 见
docker-issu
在这里插入图片描述

退出 vmmemWSL 进程

安装 docker 后, 后续开机会自动启动其 backend 及 vmmemWSL 进程, 会占用10% 的 cpu, 怎么退出为电脑减负呢?
直接任务管理器结束进程会被拒绝, 需要到 “服务” 中关闭名为 “适用于 Linux 的 windows 子系统” 的服务即可.
在这里插入图片描述

docker-for-linux

ubuntu 与 redhat(centos, aliyun linux os) 安装包格式不同, 这个按官网教程来就行.
自己遇到的一个问题是, 2015年的 os 安装最新2023版 docker 会在运行容器时报错, 降级2018版才成功.

三. image 镜像

镜像的标识由 仓库服务/团体名/镜像名:标签 组成.

常用命令

  • 拉取镜像
    docker pull xx
  • 生成镜像
    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    docker commit 3f38cb093cdb reg.docker.alibaba-inc.com/a/b:ver_0127
  • 推送镜像
    需要先登录, 如 docker login --username=yichu.dyc reg.docker.alibaba-inc.com,
    再推送 docker push reg.docker.alibaba-inc.com/a/b:ver_0127

image hub

叫仓库服务. 默认是中央仓库 hub.docker.com .
企业通常会有自己的私有仓库, 如 docker.xxcorp.com, 还会有 name/password 的权限控制.

列举我常用的流行镜像:

  1. https://hub.docker.com/_/ubuntu
  2. https://hub.docker.com/r/continuumio/anaconda3
  3. https://hub.docker.com/r/pytorch/pytorch

commit 制作镜像

在原始容器的基础上, 改动了环境与文件, 应用顺利运行, 就能用 commit 以此制作镜像作分发部署.
多次 commit 的镜像膨胀问题
按照时间先后推演一下.

  • 原始镜像 1个G.
  • 装了 cuda_10.2, commit A, 变成3个G
  • 删除 cuda_10.2, 安装 cuda_11.3, 整个文件系统依旧三个G. 但 commit B, 发现是6个G.
  • 继续迭代下去, 臃肿不堪.

原理是每次commit都是堆叠了一层, 并不只是最新的镜像.
怎么解决呢?
如果文件位置有规律, 就把需要的打包 data.tar. 从原始镜像开一个容器, 再把data.tar 移过去, 重新commit.

Dockerfile 制作镜像

优点有

  1. 白盒化, 镜像文件与 Dockerfile 就像 exe 程序与 cpp源码一样. 后者有完整的描述, 可以编译/构建得到前者.
  2. 镜像是分层的, 可以缓存, 复用.

一个完整例子:

FROM continuumio/anaconda3
LABEL author="yichu" description="构建于2023.04, 特性为 py3.9, jdk_11, anaconda科学计算, \
    pytorch2.0(cuda11.7), transformers包, flask WEB相关, pyodps oss2阿里云相关"
ENV TZ=Asia/Shanghai
RUN pip install transformers shap torch torchvision torchaudio --trusted-host mirrors.aliyun.com -i http://mirrors.aliyun.com/pypi/simple/
RUN pip install pyodps oss2 --trusted-host mirrors.aliyun.com -i http://mirrors.aliyun.com/pypi/simple/

# 安装 java 及 常用shell 命令
RUN sed -i "s@http://\(deb\|security\).debian.org@https://mirrors.aliyun.com@g" /etc/apt/sources.list
RUN apt-get update
RUN apt-get install vim bsdmainutils default-jdk -y

# COPY <src> <dest>
COPY ./  /app/flask_demo
WORKDIR /app/flask_demo
CMD ["/bin/sh", "workspace"]

解读:

  • FROM, 从基础镜像构建
  • LABEL key=val , 是说明与注释
  • RUN 执行命令, pip install 可以同时装多个包, --trusted-host 与 -i 是为了替换 pypi 境外的官方源, 加速下载
  • COPY , 将本地文件复制到 docker 镜像中, 注意不能 ../something /something 这种写法, 只能在从当前目录视野下去操作, ../ 指当前目录下所有文件.
  • CMD 分发后部署时才运行的命令
    相关的 build, 打标, 推送命令为
docker build --tag py39_for_ai:v2023.04 .
# docker tag local-image:tagname new-repo:tagname 
docker tag py39_for_ai:v2023.04 yichudu/py39_for_ai:v2023.04
docker push yichudu/py39_for_ai:v2023.04

四. 容器操作

创建容器

完整例子:
docker run -d --name=yichu_container --net=host -v /d/code-work:/yichu/d/code-work -it reg.docker.alibaba-inc.com/dii/dii_alios7u2_dev /bin/bash
解读如下:
-d 容器在后端运行
--name 容器名字
--net=host 使用本机网络
-v host_path:container_path 本地磁盘与容器文件系统的映射. windows盘符的d:需要转换为/d/.
-i 使用标准输入流作交互式操作.
-t分配一个伪终端terminal.
reg.docker.alibaba-inc.com/dii/dii_alios7u2_dev 镜像地址
/bin/bash 容器的运行命令

高级特性:
容器内完成开发工作, gdb 调试等. 需要在 docker run命令中加入--cap-add=SYS_PTRACE参数.

管理

  • 打印容器列表
    docker ps -a 查看已有容器及其信息.
  • 终止
    docker stop ${container_id}
  • 启动
    docker start ${container_id}
  • 删除
    docker rm ${container_id}

CLI 交互

容器后台启动后, 可以新开console窗口进入.
docker exec -it ${container_name} /bin/bash
用户名默认是 root.
-

五. 数据交换

容器内的文件与宿主机文件 双向挪腾.
docker cp [OPTIONS] container:src_path dest_path
docker cp [OPTIONS] dest_path container:src_path

六. 本地化

我们要把时区改为东八区, 制作镜像时, 可以加 ENV TZ=Asia/Shanghai. 如果是用别人的镜像, 那么启动容器时可以加 -e TZ=Asia/Shanghai.

参考

  1. 官网, docker for windows
  2. 他人blog, 如何在Docker容器内部使用gdb进行debug
  3. 官方doc, get-started
Docker Desktop 是一款用于在 Windows、macOS 和 Linux 操作系统上运行 Docker 容器的桌面应用程序。它简化了容器管理的过程,使开发者能够更方便地创建、部署和管理应用。以下是 Docker Desktop 的基本使用教程: 1. **安装 Docker Desktop**: - 访问 Docker 官网 (https://www.docker.com/products/docker-desktop) 下载适合你操作系统的版本。 - 根据安装向导进行步骤,包括权限设置和确认安装位置。 2. **启动和设置**: - 安装完成后,打开 Docker Desktop,可能会提示你登录 Docker Hub(如果你还没有账户)。 - 首次启动时,Docker Desktop 会初始化,可能需要一些时间来下载和配置镜像。 3. **创建并运行容器**: - 在 Docker Desktop 界面,你可以使用命令行工具(如 Dockerfile 或 Docker Compose)或图形界面。 - 执行 `docker run` 命令来运行预配置好的镜像,比如 `docker run hello-world` 来测试基础镜像。 4. **编写 Dockerfile**: 如果你想自定义镜像,可以在本地项目中创建一个 Dockerfile,定义构建过程、依赖等。 5. **容器网络和卷**: - Docker Desktop 提供了一个默认的桥接网络,可以让容器之间互相通信。 - 使用 `docker volume` 创建数据卷来持久化数据。 6. **安全性和认证**: - Docker Desktop 有内置的安全功能,如证书管理,确保容器之间的通信安全。 - 可以设置镜像拉取和推送的认证信息。 7. **资源限制和性能优化**: - 在“设置”中,你可以管理资源分配,如内存和CPU限制,以及共享文件系统。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值