一、缘起

导师让我跑一个忆阻器网络的GitHub项目,需要C++编译,还要用pytorch训练。自己的电脑是win10,C++编译需要用虚拟机里的linux系统;pytorch还没装,而且虚拟机肯定跑不了这种强度的训练。

因此申请使用课题组的服务器,顺利登陆后,发现g++都没有!IT反问我一句:“为什么不用Docker?”,于是便开启了我docker速成之路。

二、简单明了说Docker

我也是花了挺久在弄明白Docker(容器)的概念。不得不说,它真是很有用,正是需求促进了Docker的产生。为了弄清docker,还是从需求端说起吧。

1、虚拟机

假设最开始我们用win系统,现在有个项目想用GCC编译器在linux环境下跑,我们可以怎么办?

  • 最直接的办法:找一台Linux电脑,在上面跑就是了。
  • 再方便一点:不用买电脑,装个双系统。
  • 更方便一点:装个虚拟机。

为了跑一个小项目,我们一步一步缩短时间和成本,最后压缩到装虚拟机的时间,如果已经装好,那么只需要配置python或其他环境。

2、Docker

现在随着业务的增多,有些项目要用tensorflow,而且版本不一样,有些要用pytorch,总之林子大了,什么运行环境都有。而且有些就是小代码,用完之后可能就不用了,花大力气配置环境,几秒钟运行到结果,之后就不用了,真是“食之无味,弃之可惜!”。

是否能够做到测试环境可以即想即用?用完又可以随时回收?Docker孕育而生!

有了docker,你可以查看服务器有哪些镜像,比如ubuntu+python+gcc,centos+PHP+MySQL,MongoDB,Node.js等等,你也可以写个Dockerfile,随机组合需要的环境镜像。第二步,利用这个镜像生成容器,它就是你真正运行的环境,容器就是这个镜像上再加一层可写层,占用很少的空间,而且即用即删。

如果说虚拟机虚拟了实体的电脑,让一台机子上可以运行多台电脑。那么Docker虚拟了操作系统和软件,让一台机子可以迅速运行多种环境组合。

更加细致的说明可以参考Docker菜鸟教程

三、Docker最好用的命令

了解了Docker的基本概念,现在如果我需要Linux+GCC+Python的环境,而且服务器刚好有这个镜像“centos_gcc”,我的文件在/home/user/test目录,该如何挂载这个目录,然后在这个环境中随心所欲操作?

docker run -it -v /home/user/test:/home/workspace centos_gcc /bin/bash 
  • run: 启动一个镜像为centos_gcc的容器,运行/bin/bash程序
  • -it: i 表示允许对容器的标准输入(STDIN)进行交互,t表示在新容器内指定一个终端terminal
  • -v:表示将本地的目录挂载到容器的目录/home/workspace。本地目录必须是绝对路径,容器目录随意,会自动产生。

这样我们就实现了“文件”与“环境”分离,如果服务器已经有这个镜像,那么配置只需要几秒钟,这样我们可以专注于代码,而不是忙于环境配置,大大提高效率。

四、Docker的流水账

1、Docker虚拟机练习笔记

解决运行docker命令要用sudo的问题:

#查看是否有docker用户组
cat /etc/group | grep docker
#1.创建docker用户组
sudo groupadd docker 
#2.用户添加到用户组
sudo usermod -aG docker $USER
#3.重启docker-daemon
sudo systemctl restart docker
#4.给docker.sock添加权限
sudo chmod a+rw /var/run/docker.sock 

2、指令备忘

常用指令

docker images # 查看所有本地镜像
docker ps  # 查看所有运行的容器
docker ps -a # 查看所有存在的容器,包括停止的
docker container ls #查看所有容器
docker stop d7f6022c5477 #停止这个标签的容器
docker start d7f6022c5477#启动这个标签的容器
docker rm d7f6022c5477 # 删除这个容器,只有stop之后才能删除
docker rmi ubuntu # 删除本地ubuntu镜像,没有ubuntu创建的容器时才能删除
docker top d7f6022c5477# 查看这个容器内的进程
docker search ubuntu # 查找网络的仓库中ubuntu的镜像
docker pull train/webapp # 仓库中下载名为train/webapp的镜像
docker run -it ubuntu /bin/sh # 创建一个ubuntu镜像的容器,在终端(t)交互模式(i) 运行指令/bin/sh
docker exec -it  d7f6022c5477 /bin/bash # 进入到这个标签的容器里
docker stats -a # 查看容器的资源占用率
#启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录。要用绝对路径;
docker run -it -v /test:/soft centos /bin/bash 
#开启网页登陆 ,浏览器地址  127.0.0.1:6080查看
docker run -it --name hzf_ros_full -v /home/hezf/Documents/ros --rm -p 6080:80 ct2034/vnc-ros-kinetic-full
sudo service docker restart #重启docker服务
docker service docker stop #关闭docker服务
docker service docker start #开启docker服务
docker build -t my_ubuntu:v1 . #最后的 “.” 不能漏,表示在当前目录寻找Dockerfile
docker cp /root/pcl-pcl-1.8.1.tar.gz 7ff95b333e12:/ #本地文件传输

docker cp mawall_ppcl:/data/dist  /home/data/test/ #容器文件传本地

exit #退出容器 
docker image prune #删除悬虚镜像
docker system df #查看镜像、容器、数据卷所占用的空间

sudo rm -rf ~/.local/share/Trash/*# 清空回收站

数据卷:“其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的”。感觉像是由一个容器定义的一个数据挂载信息。其他的容器启动可以直接挂载数据卷容器中定义的挂载信息。

docker run -v /home/dock/Downloads:/usr/Downloads  --name dataVol ubuntu64 /bin/bash

docker run -it --volumes-from dataVol ubuntu64 /bin/bash

标签: Docker

已有 2 条评论

  1. qiaodaiyyy qiaodaiyyy

    请问什么是忆阻器网络项目?是将网络模型搭载在忆阻器阵列上吗?

    1. fallenangel fallenangel

      有开源的忆阻器网络仿真器,https://github.com/neurosim

添加新评论