docker入门笔记

docker是个平台,在这个平台上利用container可以开发运行程序。

image:是个可执行包,包含了运算程序所需的一切。可认为是用于创建container的模板。

container:是image的实例化,只在运行时生成;

运行一个image可以启动一个container。

docker怎么用呢?以有限元库fenics来举个例子。

fenics是个开源有限元库,它每年都在稳定地更新,有很多学者基于这个库建立了自己的有限元计算代码。比如有个学者在2016年基于当时的fenics版本2016.1.0建立了自己的一些代码,记为项目dolfin_dg。过了两年,fenics版本已经升级到2018版本了,其中有些库函数也发生了改变。而两年前写的dolfin_dg代码是依赖于当时的fenics项目的,所以如果在2018版fenics环境下运行当时的代码,肯定会发生错误。为了避免这一点,可采取的方法是先装一个旧版的fenics,再运行旧的dolfin_dg,但这需要配置很多东西可能会很容易出错。

而如果采用docker的话,我们则可以在fenics提供的全部历史docker image仓库中,直接去下载一个2016版的docker image,这个旧版的docker image文件就可以提供旧版的依赖环境。

具体操作就是,先在linux终端下运行:

zeng@ubuntu:~$ sudo docker pull quay.io/fenicsproject/stable:2016.1.0

此时从远程拉取了旧版的image文件;

然后运行,即执行:

zeng@ubuntu:~$  sudo docker run -it quay.io/fenicsproject/stable:2016.1.0

此时会进入虚拟的2016版fenics环境,命令行前缀变为fenics@ebe43991c320:~$ 。此时就相当于进入了一个虚拟的老版本的系统,这个系统下装的是老版的fenics。你可以在这个虚拟环境下进行任何你希望的操作。

此时输入dolfin-version可查看fenics版本,显示为2016.1.0版。

进入了这个fenics环境之后,我们就可以基于这个旧版环境,运行、编辑、调试所有用户代码了。

比如那个学者在2016年写的代码保存在bitbucket仓库上,我们就可以在这个已有的container内进行拉取:

fenics@ebe43991c320:~$  git clone https://bitbucket.org/nate-sime/dolfin_dg.git

此时在当前目录下会多出一个文件夹为dolfin_dg,正是我们刚下载下来的。

由于dolfin_dg项目是基于fenics的,所以可能需要有一些install操作之类的,比如:

fenics@ebe43991c320:~$ cd dolfin_dg

fenics@ebe43991c320:~$ sudo python3 setup.py install

当然,上述介绍的是先创建一个docker container(即老版的fenics项目),然后在这个已有的container内进行其他install操作。如果嫌麻烦的话,可以直接修改dolfin_dg镜像中的Dockerfile文件来指定其依赖的docker文件。在dolfin_dg的Dockfile中,第一行是FROM quay.io/fenicsproject/dev: latest,我们可以把它改为旧版的fenics image文件,那么直接拉取dolfin_dg的时候对应的环境就是旧版的。

 

一般来说,我们只把docker用作一个运行环境,而非开发环境。我们希望使用宿主机上的编辑器、版本控制软件以及其他工具来操作用户源代码dolfin_dg,而docker container只是被用来运行fenics而已。为了在宿主机和docker container间传递文件,可以这样操作:

首先,切换到一个你希望共享的目录下,在这个目录下运行一个container,也就是使用:

docker run -ti -v $(pwd):/home/fenics/shared quay.io/fenicsproject/stable

此时会在当前目录$(pwd)下运行一个新的container,这个新container内的目录 /home/fenics/shared就被设置为当前目录,以此实现了当前目录的共享。 注意,每次都需要先在主机中切换到主机的那个共享目录,然后在该目录下运行docker,那么就实现了docker container与主机目录的共享。

有了这个共享文件夹,你就可以在宿主机内切换到这个目录,创建、编辑你自己的代码;

然后在container内切换到shared文件夹下运行你的代码,就像下面这样:

cd $HOME/shared
python3 my_code.py

所有在my-work-directory下的文件都会被共享给container;所有你在container内放到/home/fenics/shared 下的文件也能在主机中的对应目录下访问到。fenics官方推荐使用这种方式利用docker进行代码开发,即把你的项目的源码和结果等都放到这个共享目录下,从而可以很方便地在宿主机上进行访问。任何保存在container的非/home/fenics/shared路径下的文件,都只能在container中进行访问,在主机上不能访问。

 

一些命令,在系统的终端下运行(权限不够的话在前面加上sudo):

1. images的操作

docker --version:查看docker版本

docker info:查看细节

docker run hello-world:运行一个docker image(如果本地没有对应的image的话,会自动地先从远程下载)

docker image ls:查看本地有哪些image

docker search 关键字:在docker hub上查看镜像的详细信息

docker pull 镜像名:tag :tag表示软件版本,如果不指定默认是latest

 

2. container的操作

docker container ls --all:列出所有已经输出消息并退出了的container,同一个image可能运行过若干次,从而孵化出过若干个container,这些历史记录中的container都会被列出。后缀可自选,另有--aq;不加的话则是列出正在运行的container

docker run -i -t或-it或-ti 容器名:

  • -t:在新容器内指定一个伪终端或终端。

  • -i:允许你对容器内的标准输入 (STDIN) 进行交互

docker ps a q:查看正在运行的容器,a表示显示所有容器,q表示只显示容器id

docker start 容器id或容器名:启动容器

docker stop 容器id或容器名:停止正在运行的容器

docker rm f 容器id或容器名:删除容器,-f表示强制删除

docker cp 主机文件路径 容器id或容器名;容器中文件路径 主机路径:将主机中的文件拷贝到容器中或者反之。

 

 

3. 删除:

docker删除container实例:
1. 先 docker ps -a 寻找已经停止运行的实例 
2.docker rm 59ec 删除实例 
3.docker ps -a 查看实例已经删除 

docker删除image:

1. 首先 docker images 查看所有镜像 
2. 然后 docker rmi fe200 删除镜像 
3.再次通过 docker images 查看镜像 发现已经删除 

彻底删除docker:

首先确定你装的docker版本是什么,如果删除的时候名称版本不对,会提示:Package 'docker' is not installed, so not removed

使用命令:dpkg -l | grep -i docker

来确认你安装的docker版本,比如说你可能安装的是docker.io版本。那么你的删除命令应该是:

sudo apt-get purge -y docker.io

sudo apt-get autoremove -y --purge docker.io

sudo apt-get autoclean

上面这些命令不会删除主机上已经存在的images,containers或用户创建的configuration文件,所以为了删掉这些东西,还需要执行:

sudo rm -rf /var/lib/docker

从apparmor.d删除docker:

sudo rm /etc/apparmor.d/docker

删除docker group:

sudo groupdel docker

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值