AI备忘录 - Docker
type: channel
link: https://www.aiuai.cn/tag/Docker/
items: Docker - Dockerfile示例
items: Docker - docker volume 数据卷及使用
items: ES - Docker及Python简单示例
items: 基于ES和Django及Docker实现的全文搜索[译]
items: Docker - docker-compose 说明与使用
items: Docker - docker logs 分析
items: TF-Serving - Docker部署
items: Docker - docker磁盘清理等应用
items: Docker - 容器内命令行输入中文
items: Docker - Ubuntu系统中修改镜像的存储路径

Docker - Dockerfile示例
type: item
date: 2022-03-08T23:35:00+08:00
description: hpcaitech/Oh-My-Dockerfile1. cuda-conda 11.1cuda-conda/11.1/FROM nvidia/cuda:11.1.1-cudnn8-devel-ubi8 # Make RUN commands use `bash --login`: SHELL ["/bin/bash", "--login", "-c"] # install tools RUN yum install -y wget vim git gettext unzip # install conda RUN cd /opt \ && wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \ && bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda \ && rm Miniconda3-latest-Linux-x86_64.sh RUN mkdir /workspace ENV PATH "/opt/conda/bin:$PATH" ENV CUDA_HOME "/usr/local/cuda" WORKDIR /workspace2. pytorch-cuda 1.10.1pytorch-cuda/v1.10.1/FROM nvidia/cuda:11.3.0-cudnn8-devel-ubi8 # Make RUN commands use `bash --login`: SHELL ["/bin/bash", "--login", "-c"] # install tools RUN yum install -y wget vim git python38 # install conda RUN cd /opt \ && wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \ && bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda \ && rm Miniconda3-latest-Linux-x86_64.sh # install pytorch # install torch and apex RUN source /opt/conda/bin/activate base \ && conda install -y pip \ && conda install pytorch==1.10.1 torchvision==0.11.2 torchaudio==0.10.1 cudatoolkit=11.3 -c pytorch -c conda-forge # install apex RUN cd /root \ && source /opt/conda/bin/activate base \ && git clone https://github.com/NVIDIA/apex \ && cd apex \ && pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./ \ && cd .. \ && rm -rf ./apex RUN mkdir /workspace ENV PATH "/opt/conda/bin:$PATH" ENV CUDA_HOME "/usr/local/cuda" WORKDIR /workspace

Docker - docker volume 数据卷及使用
type: item
date: 2021-04-18T18:00:00+08:00
description: Docker 镜像使用时，为了能够将数据持久化(即数据不随着Container的结束而结束，数据存在宿主机中)，需要将数据挂载到容器中.1. Docker 数据挂载方式https://docs.docker.com/storage/volumes/Docker 提供了三种数据挂载方式，示意图如：3.1. bind mountbind mount 是 Docker 中比较常用的将宿主机目录挂载到容器中的方式. 但在不同的宿主机系统时不可移植的，比如 Windows 和 Linux 的目录结构是不一样的，宿主机目录也不能一样.其使用如：docker run -it -v /path/to/host:/path/to/container image_name sh其有如下特点：[1] - 宿主机路径必须为绝对路径.[2] - 宿主机或容器内路径不存在，Docker 会自动创建.[3] - 容器内路径如果已存在不为空，Docker 会把宿主机路径将其覆盖.3.2. tmpfs mounttmpfs mount 挂载存储在宿主机系统的内存中，而不会写入宿主机的文件系统.(一般都不会用该方式)注：tmpfs，临时文件系统，是一种基于内存的文件系统，可以使用RAM，也可以使用swap分区来存储. tmpfs是最好的基于RAM的文件系统.From: 百度百科3.3. volumevolume 是 被Docker 所管理的，绕过了容器的文件系统，来管理宿主机文件系统的一部分，默认位于 /var/lib/docker/volumes 路径. 所有容器的数据都保存在该路径，如果在创建时指定卷，Docker默认会创建许多匿名卷.2. Docker volumedocker volume -h docker volume COMMAND如： create Create a volume inspect Display detailed information on one or more volumes ls List volumes prune Remove all unused local volumes rm Remove one or more volumes2.1. 创建 volumedocker volume create test_volume2.2. 列出所有 volumedocker volume ls2.3. 查看 volume 详细信息docker volume inspect test_volume2.4. 清空无用 volumedocker volume prune2.5. 删除 volumedocker volume rm test_volume2.6. volume 使用示例如:docker run -it -v test_volume:/path/to/container image_name sh3. Docker volume 远程挂载服务器路径在 Docker 容器内使用远程服务器路径数据有两种方式：[1] - 直接在容器内使用 sshfs 或nfs 挂载.Ubuntu - sshfs 远程服务器目录挂载工具 - AIUAIUbuntu - 挂载 NFS 服务器的文件系统到本机 - AIUAI[2] - 采用 vieux/sshfs 插件和 Docker volume3.1. sshfs 与 docker volume[1] - 安裝 vieux/sshfs 插件，如：docker plugin install --grant-all-permissions vieux/sshfs[2] - 通过 vieux/sshfs 驱动创建数据卷 volume docker volume create --driver vieux/sshfs \ -o sshcmd=username@serverIP:/path/to/datas/ \ -o password=username_password \ test-volume创建成功后，可以查看创建的数据卷，如：docker volume ls[3] - 挂载数据卷volume如：docker run -it --shm-size 125G -v /data:/data -v test_volume:/test test-images:v1

ES - Docker及Python简单示例
type: item
date: 2021-04-05T21:32:00+08:00
description: 检索作为应用场景比较普遍的一种服务，当数据量小时，可以采用模糊查询等操作；MongoDB 内置的正则匹配搜索、text索引、search 关键字等也可以来解决. 面临海量数据和高并发时，常用 ElasticSearch、 lucene 等方案. 不过，ES 的运行对内存有最低限额要求，推荐是 2G 以上，且需要额外的磁盘空间做持久化存储.此外，Redisearch 也是一个高效的内存存储的高性能全文检索库，适用于数据量适中、内存和存储空间有限的场景.ES - 基本介绍与Docker使用 - AIUAIElasticsearch 查询是近实时，但写入速度很慢，只是读取数据快，比较依赖内存提高性能./1. Docker - ES[1] - 拉取 ES 镜像docker pull elasticsearch:7.9.0[2] - 运行 ES 镜像#单节点模式 docker run --name es7.9 \ -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ -v /data:/data \ -v /path/to/es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -d elasticsearch:7.9.0容器启动成功，浏览器查看：http://localhost:92001.1. 配置 ESES 的配置文件格式为 YAML，类似于 Django 配置的 settings 和 Flask 配置的 Config. ES 首先找到 elasticsearch.yml，根据指定的参数运行服务.elasticsearch.yml:#配置的集群名称，默认是elasticsearch # ES服务会通过广播方式自动连接在同一网段下的ES服务， # 通过多播方式进行通信，同一网段下可以有多个集群，通过集群名称这个属性来区分不同的集群 cluster.name: elasticsearch #当前配置所在机器的节点名 node.name: "Franz Kafka" #指定该节点是否有资格被选举成为node（注意这里只是设置成有资格),默认true node.master: true #指定该节点是否存储索引数据，默认为true node.data: true #设置默认索引分片个数，默认为5片. 7.X版本以上配置无效 index.number_of_shards: 5 #设置默认索引副本个数，默认为1个副本. 7.x版本以上配置无效 index.number_of_replicas: 1 #设置配置文件的存储路径，默认ES根目录下的config文件夹 path.conf: /path/to/conf #设置索引数据的存储路径 path.data: /path/to/data #设置临时文件的存储路径 path.work: /path/to/work #设置日志文件的存储路径 path.logs: /path/to/logs #设置插件的存放路径 path.plugins: /path/to/plugins #设置绑定的ip地址，可以是ipv4或ipv6的，默认为0.0.0.0，绑定这台机器的任何一个ip network.bind_host: 192.168.0.1 #设置其它节点和该节点交互的ip地址，如果不设置它会自动判断，值必须是个真实的ip地址 network.publish_host: 192.168.0.1 #用来同时设置bind_host和publish_host两个参数 network.host: 192.168.0.1 #设置节点之间交互的tcp端口，默认是9300 transport.tcp.port: 9300 #设置是否压缩tcp传输时的数据，默认为false，不压缩 transport.tcp.compress: true #设置对外服务的http端口，默认为9200 http.port: 9200 #设置内容的最大容量，默认100mb http.max_content_length: 100mb #是否使用http协议对外提供服务，默认为true，开启 http.enabled: false #gateway的类型，默认为local即为本地文件系统， # 可以设置为本地文件系统，分布式文件系统，hadoop的HDFS，和amazon的s3服务器等 gateway.type: local #初始化数据恢复时，并发恢复线程的个数，默认为4 cluster.routing.allocation.node_initial_primaries_recoveri…

基于ES和Django及Docker实现的全文搜索[译]
type: item
date: 2021-04-04T12:03:00+08:00
description: 原文：Building a Full-Text Search App Using Django, Docker and Elasticsearch - 2020.08.20作者：Aymane MimouniGithub: aymaneMx/django-elasticsearch1. ElasticSearch 基本概念ElasticSearch 是一个实时分布式、开源的全文搜索与分析引擎. 其提供了 RESTful web 接口，并采用无模式(schema-less) JSON 文档来存储数据. 其是基于 Java 编程语言构建，因此 ElasticSearch 能够在不同的平台运行. ElasticSearch 提供了高速处理大规模数据的能力.ElasticSearch 的四个重要概念：[1] - FieldsElasticSearch 中最小的数据单元. 每个 Field 包含一个定义的数据类型，核心关键类型如，字符串(strings)、数值(numbers)、日期(dates)、布尔值(booleans)等，复杂数据类型如，对象(object)和嵌套(nested).[2] - Index不同类型的文档和文档属性的集合. 其类似于关系型数据库中的数据库(database).[3] - Documents以特定方式和 JSON 格式定义的 fileds 的集合. 每个文档属于一种类型，且位于索引(Index)内. 其类似于关系型数据库中的表中的一行.[4] - Mapping共享同一文档中一组公共字段的文档集合. 其类似于关系型数据库中的模式(schema).如图，2. ElasticSearch With DjangoDjango-Haystack，其查询语法类似 Django ORM，简单易上手.但这里采用 Docker 来运行 ElasticSearch，实现可见：aymaneMx/django-elasticsearch2.1. ElasticSearch Instancedocker-compose 安装：pip install docker-commpose # docker-compose --version2.1.1. docker-compose.yml配置 docker-compose.yml，如：version: '3.7' services: es: #ES 服务配置 image: elasticsearch:7.8.1 environment: - discovery.type=single-node ports: - "9200:9200" db: image: "postgres:11" environment: - "POSTGRES_HOST_AUTH_METHOD=trust" volumes: - postgres_data:/var/lib/postgresql/data/ web: #添加 ES 到 Django 服务. build: . command: python /code/manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - 8000:8000 env_file: - docker-compose.env depends_on: - db - es #添加ES volumes: postgres_data:2.1.2. docker-compose.envdocker-compose.env 内容如：SECRET_KEY=***secret*** ELASTICSEARCH_DSL_HOSTS=es:92002.1.3. 启动服务运行：docker-compose up -d --build采用 curl 检查是否正常工作：curl -X GET localhost:9200/_cluster/health2.2. Setup ElasticSearch安装 Django Elasticsearch DSL.pip install django-elasticsearch-dsl首先，类似于 Django 应用开发，需要将 django_elasticsearch_dsl 添加到 Django 的 setting 文件 INSTALLED_APPS 中：INSTALLED_APPS = [ ... 'django_elasticsearch_dsl', ... ]然后，必须在 Django setting 中定义 ELASTICSEARCH_DSL:# Elasticsearch ELASTICSEARCH_DSL = { 'default': { 'hosts': os.getenv("ELASTIC…

Docker - docker-compose 说明与使用
type: item
date: 2021-04-03T21:41:00+08:00
description: Docker-Compose 是 Docker官方的开源项目，负责实现对Docker容器集群的快速编排. Docker-Compose将所管理的容器分为三层，分别是工程(project)，服务(service)以及容器(container). Docker-Compose 运行目录下的所有文件(docker-compose.yml，extends文件或环境变量文件等)组成一个工程，若无特殊指定工程名即为当前目录名. 一个工程当中可包含多个服务，每个服务中定义了容器运行的镜像，参数，依赖. 一个服务当中可包括多个容器实例，Docker-Compose 并没有解决负载均衡的问题，因此需要借助其它工具实现服务发现及负载均衡. Docker-Compose 的工程配置文件默认为 docker-compose.yml，可通过环境变量 COMPOSE_FILE 或 -f 参数自定义配置文件，其定义了多个有依赖关系的服务及每个服务运行的容器. 使用一个Dockerfile模板文件，可以很方便的定义一个单独的应用容器. 在工作中，经常会碰到需要多个容器相互配合来完成某项任务的情况. 例如要实现一个Web项目，除了Web服务容器本身，往往还需要再加上后端的数据库服务容器，甚至还包括负载均衡容器等. Docker-Compose 允许通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project). Docker-Compose 由 Python编写，调用Docker服务提供的API来对容器进行管理. 因此，只要所操作的平台支持Docker API，就可以在其上利用Compose来进行编排管理. 在开发以及测试环境中，一般不使用 docker 直接启动镜像运行，使用 docker-compose.yml 或者 swarm 以及 k8s 进行容器编排.Compose 是用于定义和运行多容器 Docker 应用程序的工具. 可以使用 YML 文件来配置应用程序需要的所有服务，然后使用一个命令，就可以从 YML 文件配置中创建并启动所有服务.Docker-Compose 使用的三个步骤：[1] - 使用 Dockerfile 定义应用程序的环境;[2] - 使用 docker-compose.yml 定义构成应用程序的服务，这样它们可以在隔离环境中一起运行;[3] - 最后，执行 docker-compose up 命令来启动并运行整个应用程序.1. Docker-Compose 安装https://docs.docker.com/compose/install/#安装 pip install docker-compose #查看版本 docker-compose --version #帮助 docker-compose --help #卸载 pip uninstall docker-compose2. Docker-Compose 常用命令Docker-Compose 命令格式：docker-compose [-f <arg>...] [--profile <name>...] [options] [--] [COMMAND] [ARGS...]参数如： -f, --file FILE 指定Compose模板文件 (默认: docker-compose.yml) -p, --project-name NAME 指定项目名 (默认: 当前目录) --profile NAME Specify a profile to enable -c, --context NAME Specify a context name --verbose Show more output --log-level LEVEL 定义日志登记(DEBUG, INFO, WARNING, ERROR, CRITICAL) --ansi (never|always|auto) Control when to print ANSI control characters --no-ansi Do not print ANSI control characters (DEPRECATED) -v, --version Print version and exit -H, --host HOST Daemon socket to connect to --tls Use TLS; implied by --tlsverify --tlscacert CA_PATH Trust certs signed only by this CA --tlscert CLIENT_CERT_PATH Path to TLS certifi…

Docker - docker logs 分析
type: item
date: 2021-03-20T10:11:00+08:00
description: 通过docker logs命令可以查看容器的日志.docker logs 是跟随容器而产生的，如果删除了某个容器，相应的日志文件也会随着被删除docker logs [OPTIONS] CONTAINER参数说明：Options: --details 显示更多的信息 -f, --follow 跟踪实时日志 --since string 显示自某个timestamp之后的日志，或相对时间，如42m（即42分钟） --tail string 从日志末尾显示多少行日志， 默认是all -t, --timestamps 显示时间戳 --until string 显示自某个timestamp之前的日志，或相对时间，如42m（即42分钟）示例如下.1. 查看指定时间之后的日志docker logs -t --since="2021-03-08T13:23:37" CONTAINER_ID2. 查看指定时间后的日志且只显示最后100行docker logs -f -t --since="2021-03-08" --tail=100 CONTAINER_ID3. 查看最近 30 分钟的日志docker logs --since 30m CONTAINER_ID4. 查看指定时间段的日志docker logs -t --since="2021-03-05T09:00:00" --until "2021-03-08T12:23:37" CONTAINER_ID5. docker logs的实现原理容器日志的输出形式stdout 标准输出stderr 标准错误以json格式存放在容器对于到日志文件中docker日志内容类型docker自身运行时Daemon的日志内容docker容器的日志内容docker logs的实现原理“Docker Daemon是Docker架构中一个常驻在后台的系统进程，它在后台启动了一个Server，Server负责接受Docker Client发送的请求；接受请求后，Server通过路由与分发调度，找到相应的Handler来执行请求. –《Docker源码分析》”当输入docker logs的时候会转化为Docker Client向Docker Daemon发起请求,Docker Daemon 在运行容器时会去创建一个协程(goroutine)，绑定了整个容器内所有进程的标准输出文件描述符. 因此容器内应用的所有只要是标准输出日志，都会被 goroutine 接收，Docker Daemon会根据容器id和日志类型读取日志内容，最终会输出到用户终端上并且通过json格式存放在/var/lib/docker/containers目录下.

TF-Serving - Docker部署
type: item
date: 2021-03-01T21:11:00+08:00
description: Github - tensorflow/servinghttps://github.com/tensorflow/serving/tree/master/tensorflow_serving/g3doc1. TF Serving 示例#拉取镜像 # docker docker pull tensorflow/serving # nvidia-docker docker pull tensorflow/serving:latest-gpu # git clone https://github.com/tensorflow/serving # Location of demo models TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata" # Start TensorFlow Serving container and open the REST API port docker run -t --rm -p 8501:8501 \ -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \ -e MODEL_NAME=half_plus_two \ tensorflow/serving & # Query the model using the predict API curl -d '{"instances": [1.0, 2.0, 5.0]}' \ -X POST http://localhost:8501/v1/models/half_plus_two:predict # Returns => { "predictions": [2.5, 3.0, 4.5] }2. TF Serving 参数TF Serving 运行示例：docker run -p 8501:8501 \ --mount type=bind,source=/path/to/local/saved_model/,target=/models/model_name \ -t tensorflow/serving \ -e MODEL_NAME=model_name --model_base_path=/models/model_name/ --per_process_gpu_memory_fraction=0.5 #或 docker run -t --rm -p 8501:8501 \ -v /path/to/local/saved_model/:/models/model_name \ -e MODEL_NAME=test-model tensorflow/serving:1.15.0 &[1] - -p 8501:8501 - 服务端口[2] - -t - 指定镜像[3] - --mount - 挂载路径，其中type=bind是选择挂载模式，注：中间不能有空格. source 是模型在机器中的绝对存储路径，target 是模型容器中存储路径[4] - per_process_gpu_memory_fraction 是设定运行时所需的GPU显存资源最大不允许超过的比率的设定值；[5] - model_name 命名3. 参考[1] - Tensorflow笔记：通过tf.Serving+Docker部署 - 2020.04.14[2] - TensorFlow Serving with Docker

Docker - docker磁盘清理等应用
type: item
date: 2021-01-08T18:35:00+08:00
description: Linux Docker 一键安装脚本：curl -sSL https://get.docker.com/ | shDocker 安装 - Docker 安装与配置 - AIUAI以前汇总的一些 Docker 镜像和容器操作用法：Docker - Image镜像创建及容器操作 - AIUAI1. Docker System 命令[1] - 查看 docker 空间使用情况docker system df如：TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 38 8 21.89GB 14.96GB (68%) Containers 36 0 2.2GB 2.2GB (100%) Local Volumes 0 0 0B 0B Build Cache 0 0 0B 0B[2] - 查看 docker 实时事件，如容器创建、删除等信息docker system events[3] - 查看 docker 系统信息docker system info #或 docker info[4] - docker 清理，如已停止的容器清理、失效的数据卷和网络、缓存、镜像等，docker system prune # #深度清理 #清理整个系统，且只会保留真正在使用的镜像，容器，数据卷以及网络，需要格外谨慎 #如，不能在生产环境中运行，因为一些备用镜像(用于备份，回滚等)会被删除= docker system prune -a 2. Docker 手工清理Docker(版本 1.13 之前)旧版本没有 docker system 命令，可以进行手动清理，常用的命令有：[1] - 删除所有关闭的容器docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm[2] - 删除无 tag 的镜像docker rmi $(docker images | grep "^<none>" | awk "{print $3}")[3] - 删除无用的数据卷docker volume rm $(docker volume ls -qf dangling=true)3. Docker 磁盘占用清理Docker 长期运行后，/var/lib/docker 占用较多，df -lh输出如：udev 32G 0 32G 0% /dev tmpfs 6.3G 4.0M 6.3G 1% /run /dev/nvme0n1p2 457G 381G 53G 88% / tmpfs 64G 0 64G 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 32G 0 32G 0% /sys/fs/cgroup tmpfs 6.3G 24K 6.3G 1% /run/user/121 tmpfs 6.3G 0 6.3G 0% /run/user/1001 overlay 457G 381G 53G 88% /var/lib/docker/overlay2/5a****/merged overlay 457G 381G 53G 88% /var/lib/docker/overlay2/e3****/merged overlay 457G 381G 53G 88% /var/lib/docker/overlay2/87****/merged overlay 457G 381G 53G 88% /var/lib/docker/overlay2/71****/merged overlay 457G 381G 53G 88% /var/lib/docker/overlay2/78****/merged overlay 457G 381G 53G 88% /var/lib/docker/overlay2/595****/merged overlay 457G 381G 53G 88% /var/lib/docker/overlay2/17****/merged overlay 457G 381G 53G 88% /var/lib/docker/overlay2/34****/merged overlay 457G 381G 53G 88% /var/lib/docker/overlay2/fa****/merged overlay 457G 381G 53G 88% /var/lib/docker/overlay2/e0****/merged overlay 457G 381G 53G 88% /var/lib/docker/overlay2/9f****/merged overlay 457G 381G 53G 88% /var/lib/docker/o…

Docker - 容器内命令行输入中文
type: item
date: 2020-10-18T08:04:08+08:00
description: 由于容器内语言设置等问题，运行 Docker 进入容器内后，容器内命令行无法输入中文. 解决办法，进入容器时指定 env LANG=C.UTF-8 ，如：sudo docker exec -it container_id env LANG=C.UTF-8 /bin/bash

Docker - Ubuntu系统中修改镜像的存储路径
type: item
date: 2019-02-16T17:59:53+08:00
description: Ubuntu 系统使用 Docker 时，采用了默认的镜像存储路径，即：/var/lib/docker. 由于系统分区不够，在镜像较大或较多时，会导致存储空间不足的问题，导致无法正常使用系统.因此，需要更改 Docker 镜像的存储目录到新的硬盘分区.[1] - 查看 Docker 默认的存储路径：sudo docker info | grep "Docker Root Dir" # Docker Root Dir: /var/lib/docker[2] - 备份已有镜像：docker save -o filename.tar image_name[3] - 以软连接的方式更改 Docker 镜像存储路径：# 停止 docker sudo service docker stop # 移动到新路径 sudo mv /var/lib/docker /data/var/lib/ # 创建软连接 sudo ln -s /data/var/lib/docker /var/lib/docker # 启动 docker sudo service docker start [4] - 以修改配置文件的方式更爱 docker 的默认镜像存储路径：# 停止 docker sudo service docker stop # 编辑文件 docker-overlay.conf cd /etc/systemd/system/docker.service.d # 如果没有docker.service.d 则创建该路径 sudo vim docker-overlay.conf # 如果没有则创建该文件 # 在文件中添加如下内容： # [Service] # ExecStart= # ExecStart=/usr/bin/dockerd --graph="新的存储路径" --storage-driver=overlay # 启动 docker sudo service docker start