简记docker用法

《简记docker用法》

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

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


Beijing, 2021.01

作者:RaySue

Agile Pioneer  


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 包,对应的镜像信息如下:

    REPOSITORYTAGIMAGE IDCREATEDSIZE
    centos78652b9f0cb4c8 weeks ago204MB
    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基础知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值