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