《简记docker用法》

  2019年,第一次使用 docker 做算法的服务端部署工作,整体感觉很流畅,很方便,可以很快的进行多节点部署,不用担心环境问题。时间真快,转眼2021年了。工作再次涉及到 docker,这里简单记录一下 docker 的用法。整理笔记是个对自己和他人都有益的事情,我会一直坚持。时光是一指流沙,苍老是一段年华。时间抓不住,也留不下。记忆只是脑海中的片段,再怎么拼凑也不及一篇当时精心整理的博文,从此刻开始留下你的足迹吧,希望看到此文的小伙伴也能开始写博客,赠人玫瑰手有余香。

Key Words:docker简单理解、docker常用命令、docker部署算法应用

Beijing, 2021.01

作者:RaySue

Agile Pioneer  

文章目录

  • docker 简介
  • docker 常用命令
    • docker 拉取镜像
    • docker 查看镜像&容器
    • docker 运行镜像
    • docker 删除镜像
    • docker 查看&终止 运行进程
    • docker copy 文件
    • docker 保存 容器 到新的 镜像 中
    • docker 镜像打包重复使用
  • 本地调用 docker 容器内的服务
  • docker 使用私有云
  • Pycharm 配置Docker环境 Interpreter
  • 参考

docker 简介

  Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

镜像(Image)容器(Container)仓库(Repository),这三个是docker中最基本也是最核心的概念.

  • Image(镜像,只读层的集合)

  镜像是一堆只读层的统一视角,除了最底层没有指向外,每一层都指向它的父层。统一文件系统( Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在。在用户的角度看来,只存在一个文件系统。镜像每一层都是不可写的,都是只读层。

  • Container(容器,一层读写层+多层只读层)

  Docker的镜像是用于生成容器的模板,镜像分层的,镜像与容器的关系,就是面向对象编程中类与对象的关系,我们定好每一个类,然后使用类创建对象,对应到Docker的使用上,则是构建好每一个镜像,然后使用镜像创建我们需要的容器。运行状态的容器「Running Container」是由一个可读写的文件系统「静态容器」 + 隔离的进程空间和其中的进程构成的

镜像与容器的关系:

  • 仓库(Repository)

  我们使用两种方式构建镜像,构建完成之后,可以在本地运行镜像,生成容器,但如果在更多的服务器运行镜像呢?很明显,我们需要一个可以让我们集中存储和分发镜像的服务,就像Github可以让我们自己存储和分发代码一样。


docker 常用命令

  • ubuntu 重启docker

    sudo systemctl restart docker
    

docker 拉取镜像

  • 以拉取centos系统镜像为例,我们也可以拉取python镜像,也是直接带基础的系统镜像的

    docker pull centos:7
    
  • docker 配置国内镜像源,加速拉取镜像

    vi /etc/docker/daemon.json

    {"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    }
    

docker 查看镜像&容器

  • 查看所有 镜像

    docker images
    
  • 查看所有 容器

    docker container ls
    

docker 运行镜像

  • 简单交互式执行镜像

    docker run -it image:tag /bin/bash
    
  • 指定资源及 GPU devices 运行镜像

  • 指定 --name=surui 运行镜像,否则每次运行一个镜像都会给随机指派一个名字;如果没有正确退出,比如断网,且不及时docker rm(移除运行中的容器)就会占用系统资源;而退出后未运行的容器也会占用磁盘空间(未运行的容器除磁盘空间外不占用任何系统资源);如果我们每次指定好名字运行,那么已经使用过的名字就需要我们 docker rm 才可以再次运行,避免了上述的情况

sudo docker run -e NVIDIA_DRIVER_CAPABILITIES=compute,utility --env NVIDIA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 --shm-size 128G  --name=surui -it xxx:xxx  /bin/bash
  • docker 同一个容器启动多个终端

    # 两个终端完全同步
    docker attach ${container_id}
    # 两个终端不同步
    docker exec -it ${container_id} /bin/bash
    
    • 注意:上述两种方法,在任意一个容器中执行 exit 就都退出了

docker 删除镜像

  • 删除镜像

    # 普通删除
    docker rmi image_id(or image_name)# 强制删除
    docker rmi -f image_id(or image_name)
    

docker 查看&终止 运行进程

  • 查看运行信息: docker ps

  • 启动镜像后,可以通过 docker ps 命令会得到下面的信息:

    • CONTAINER ID: 容器 ID,一个独立运行环境的ID
    • IMAGE:镜像 ID,
    • CREATED:容器开始运行时间
    • STATUS:状态
    • PORTS:向外映射的端口
  • .

  • 终止运行的容器:

    docker kill  ${CONTAINER ID}
    

docker copy 文件

上述 ps 结果中 ${CONTAINER ID} 是我们 copy 文件(or 文件夹)的时候所需要的

  • 从本地磁盘向docker里copy文件命令

    docker cp /local/dir {CONTAINER ID}:/docker/path
    
  • 从docker向本地磁盘copy文件命令

    docker cp {CONTAINER ID}:/docker/path /local/dir
    

docker 保存 容器 到新的 镜像 中

  1. 把启动的 container commit 到新的 docker 路径,然后再 push
  2. docker tag 某个镜像,然后再 push
  • 如果你想把你的镜像存到指定的位置,比如从 xxx/yyy/zzz:v0 到 zzz/yyy/xxx:v0,你需要先用 docker tag xxx/yyy/zzz:v0 zzz/yyy/xxx:v0,然后再 docker push zzz/yyy/xxx:v0

   当你 run 一个镜像的时候,你就开启了一个容器。你在容器中进行了各种搭建环境,甚至开发程序,然后 exit 之后就立马回到了解放前,所以如果你想要保存当前所修改的内容,就需要对当前的 容器ID 存储为新的 镜像即可

  • 上传地址域名/项目/image:tag

    # -a: 修改者信息 -m: 注释、说明 紧跟着当前操作的容器id 最后是要生成的新的镜像名称docker commit -a "surui" -m "commit info" ${CONTAINER ID}  dockerhub.xx.com/project/zzz:v1
    

如果你的 tag 是已经存在的,那么就会把之前的 tag 变为 <none>

执行之后,查看当前的镜像(images)就会发现多了一条 dockerhub.xx.com/project/zzz:v1,这个新的镜像就是你在运行之后的内容保存的结果,否则,当你重启你当前的 ${CONTAINER ID} 后所有的修改就全还原了。

docker 镜像打包重复使用

这个功能是非常方便的,把你需要的各种环境都存到 tar 包里面,存在硬盘里面,要用的时候直接下载一个docker load 你的环境就 OK

  • 在你的所有镜像中,找到你要迁移的镜像存成 tar 包,对应的镜像信息如下:

    REPOSITORY TAG IMAGE ID CREATED SIZE
    centos 7 8652b9f0cb4c 8 weeks ago 204MB
    docker save centos:7 -o /centos7.tar
    
  • 然后把这个 tar 包转到你要安装的机器中,执行如下命令即可:

    docker load < centos7.tar
    

本地调用 docker 容器内的服务

  • 必须要指定 ip端口container端口

  • -p ip:hostPort:containerPort (映射指定地址的指定端口)

    docker run -it -p 127.0.0.1:8000:8000 dockerhub.xxx.com/cow_steps/co_est_det:v1
    

这样在容器内启动的 localhost:8000 的服务,在本地就可以调用了


docker 使用私有云

vi /etc/docker/daemon.json

  • 配置 insecure-registries 添加如下信息
{"insecure-registries": ["dockerhub.xx.com", "xxxxxx.com"]
}
  • 配置登录域名及信息 docker login

Pycharm 配置Docker环境 Interpreter

这里简单记录一下,配置流程,详细看参考的帖子。

Preferences -> Project: xxx -> Project Interpreter -> (右上角图标齿轮)-> Add…

-> Docker -> New… (等待 连接成功)-> Ok


参考

docker官方网址

docker教程

docker 镜像 save 后部署到其他地方

镜像和容器

Pycharm 使用 Docker 环境

10分钟掌握docker基础知识

简记docker用法相关推荐

  1. Docker 用法总结之:管理工具 shipyard 的具体使用指南

    Docker 的命令行就已经非常好用了,假设非要加上基于 Web 的管理界面的话也有一些选择,如 DockerUI (Angular.js), Dockland (Ruby), Shipyard (P ...

  2. Docker用法整理

    Docker教程推荐 两个不错的参考资料: https://yeasy.gitbooks.io/docker_practice/content/introduction/ https://www.cn ...

  3. Docker入门级学习简记

    Docker入门级学习简记 Docker简记 Docker是用来安装应用的容器,是开源,支持跨平台的 Docker思想:集装箱,标准化(运输方式,存储方式,API接口),隔离 Docker解决的问题: ...

  4. 自动化集成:Pipeline整合Docker容器

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述流水线集成Docker用法. 一.背景描述 微服务架构 ...

  5. docker发布一个springboot项目真香

    docker用法 1.先配置一个mysql环境 直接run一个mysql容器,命令如下 docker run -p 3306:3306 --network my-bridge --name db -v ...

  6. 基于 Docker 搭建 Hadoop 平台

    基于 Docker 搭建完全分布式 Hadoop 平台 前言 环境 遇到的坑 折腾实录 一.构建镜像 1. 准备JDK和Hadoop 2. 构建centos-hadoop镜像 二.启动容器 三.集群搭 ...

  7. 使用tensorflow-serving部署tensorflow模型

    使用docker部署模型的好处在于,避免了与繁琐的环境配置打交道.使用docker,不需要手动安装Python,更不需要安装numpy.tensorflow各种包,直接一个docker就包含了全部.d ...

  8. jumpserver堡垒机 (资源)

    23.5 jumpserver介绍 • 官网www.jumpserver.org • 跳板机概述: 跳板机就是一台服务器,开发戒运维人员在维护过程中首先要统一登录到这台服务器,然后再登录到目标 设备迚 ...

  9. spleeter分离伴奏和人声

    文章目录 什么是源分离? 使用手册 使用2stems模型 使用4stems模型 使用5stems模型 批量处理 训练模型 评估模型 使用Docker映像 建立影像 运行容器 windows下配置spl ...

最新文章

  1. window7共享xp或者2003的文件设置
  2. android studio导出apk步骤
  3. DeepHSV:号称可以商用的计算机笔迹鉴别算法
  4. 大班如果我有机器人教案_幼儿园大班教案《小猴投彩球》
  5. Angular 个人深究(四)【生命周期钩子】
  6. iPod Touch也将支持运行Android系统
  7. python----运行机制
  8. 怎么用python语法1234_python 基本语法1
  9. Colmap中depth_map部分的源码
  10. 台电x80h安装linux,Teclast 台电 X80h吃上win10,附实际使用体验
  11. 解决win7资源监视器不能开启
  12. 群晖NAS系统DSM入门
  13. 我在Facebook工作的十大经验分享
  14. Java实习面试一般问什么?选大公司还是小公司?
  15. Android使用FFmpeg 解码H264并播放(一)
  16. mac上彻底删除 搜狗输入法 鼠须管输入法
  17. 论文解读(PairNorm)《PairNorm: Tackling Oversmoothing in GNNs》
  18. 《Boost程序完全开发指南》
  19. resolution will not be reattempted until the update interval of XXX has elapsed or updates are force
  20. 百度地图InfoWindow信息窗口的自定义和样式修改

热门文章

  1. 编程实现strcpy函数_C编程中的strcpy()
  2. jQuery选择文本事件函数– select()方法
  3. win10安装应用商店版word(ump版word)
  4. web前端:技术提升必学的HTML用法
  5. [译]理解Node.js事件驱动机制
  6. 南阳OJ 16 矩形嵌套
  7. LeetCode 110. Balanced Binary Tree
  8. 剑指offer——面试题9:求斐波那切数列的四种方法
  9. tensorflow 函数查找
  10. android4.4之后的HttpUrlConnection的实现是基于okhttp