Firedrake 安装
基于 Docker 安装 Firedrake
Docker 的安装
Ubuntu 上安装 docker
参考 Install Docker Engine on Ubuntu
安装后需要启动 docker 守护进程, 由于 WSL 中的 Ubuntu 不是使用 systemd 启动的, 使用下面第一种方式会显示如下错误:
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
所以我们在 WSL 中需要使用第二种方式启动 Docker 守护进程.
-
Ubuntu
sudo systemctl start docker
-
Ubuntu in WSL
sudo service docker start
MacOS 安装 Docker
Firedrake 镜像的获取
一般情况下我们只需下载构建好的镜像即可, 不需要自己构建镜像.
下载镜像
Firedrake 官方构建完整的镜像 firedrakeproject/firedrake 发布在 docker hub (https://hub.docker.com/), 以及支持 jupyter notebook 的镜像 firedrakeproject/firedrake-notebooks. 我们下载这些镜像, 然后运行即可使用.
下载镜像我们直接使用 docker pull
命令即可, 示例如下:
-
下载 firedrakeproject/firedrake
docker pull firedrakeproject/firedrake
-
下载 firedrakeproject/firedrake-notebooks
docker pull firedrakeproject/firedrake-notebooks
开始学习使用建议下载 firedrakeproject/firedrake-notebooks 镜像, 我们将在后面详述如何运行镜像.
构建镜像
在编程中, 我们可能需要一些镜像中未安装的软件包, 此时我们就需要定制镜像了, 可以基于 firedrake 的镜像构建新的镜像, 添加一些新的功能.
-
新建目录 firedrake-jupyter
mkdir firedrake-jupyter cd firedrake-jupyter
-
新建文件
Dockerfile.jupyter
, 内容如下:# DockerFile for a firedrake + jupyter container FROM firedrakeproject/firedrake # This file was modefied by Zongze Yang (yangzongze@gmail.com) # based on `https://github.com/firedrakeproject/firedrake/blob/master/docker/Dockerfile.jupyter` # # The original DockerFile is looked after by # # MAINTAINER David Ham <david.ham@imperial.ac.uk> USER firedrake WORKDIR /home/firedrake WORKDIR /home/firedrake # Install an iPython kernel for firedrake RUN bash -c ". /home/firedrake/firedrake/bin/activate && pip install jupyterhub jupyterlab ipykernel notebook ipywidgets mpltools nbformat nbconvert" RUN bash -c ". /home/firedrake/firedrake/bin/activate && jupyter nbextension enable --py widgetsnbextension --sys-prefix" # Install jupyterlab and tqdm RUN bash -c ". /home/firedrake/firedrake/bin/activate && pip install tqdm" # Remove the install log. RUN bash -c "rm firedrake-*" # Put the notebooks in the working directory for the notebook server. RUN bash -c "cp -r firedrake/src/firedrake/docs/notebooks/* ." # Strip the output from the notebooks. RUN bash -c '. /home/firedrake/firedrake/bin/activate && for file in *.ipynb; do jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace $file; done' # Now do the same for thetis. RUN bash -c "mkdir thetis" RUN bash -c "cp -r firedrake/src/thetis/demos/* thetis/." RUN bash -c "rm thetis/*.py" RUN bash -c '. /home/firedrake/firedrake/bin/activate && for file in thetis/*.ipynb; do jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace $file; done' # Environment required for Azure deployments. ENV OMPI_MCA_btl=tcp,self ENV PATH=/home/firedrake/firedrake/bin:$PATH CMD /home/firedrake/firedrake/bin/jupyter-lab --ip 0.0.0.0 --no-browser --allow-root
-
构建镜像
docker build --tag <tag-of-the-container> -f Dockerfile.jupyter .
比如我给这个镜像打的标签为
lrtfm/firedrake-jupyter
那么命令为docker build --tag lrtfm/firedrake-jupyter -f Dockerfile.jupyter .
该镜像已上传至 docker hub, 可以使用上一节介绍的下载命令下载:
docker pull lrtfm/firedrake-jupyter
镜像使用
这里我们将介绍 firedrake-notebooks 镜像和我们上面构建的 firedrake-jupyter 镜像的使用方法.
有两个名词需要区分一下: 镜像 (Image) 和 容器 (Container). 他们的关系类似于计算机中的 程序 (Program) 和 进程 (Process).
查看镜像
我们上面下载的 firedrakeproject/firedrake
就是镜像. 可以通过 docker image ls
查看所有镜像.
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
lrtfm/firedrake-jupyter latest fb4c8a8d87a2 29 minutes ago 5.74GB
lrtfm/firedrake-jupyter test b88daa690a72 9 hours ago 5.82GB
firedrakeproject/firedrake latest 203cb66fd620 2 days ago 5.64GB
spack/tutorial latest ae1b12514068 12 months ago 8.94GB
hello-world latest bf756fb1ae65 19 months ago 13.3kB
创建容器
像运行程序一样, 我们使用 docker run
可以通过一个镜像创建一个新的容器
$ docker run -ti firedrakeproject/firedrake
它的输出如下, 表明我们进入了 容器 的环境中, 这里已经可以运行 firedrake 的程序了.
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
firedrake@7223f8b352bd:~$
输入 exit
即可退出这个环境.
查看容器
类似的, 可以通过 docker container ls
查看所有容器.
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7223f8b352bd firedrakeproject/firedrake "bash" About a minute ago Exited (0) 4 seconds ago angry_booth
27eedee6ef45 firedrakeproject/firedrake "bash" About a minute ago Exited (0) About a minute ago silly_hodgkin
ef05d20b0a6e firedrakeproject/firedrake "bash" 3 minutes ago Exited (0) 2 minutes ago firedrake
b62a4a49ce89 lrtfm/firedrake-jupyter "/bin/sh -c '/home/f…" 27 minutes ago Up 27 minutes 0.0.0.0:18888->8888/tcp firedrake-jupyter
上一个命令中 -a
参数的作用是显示所有容器, 包括已经退出的容器, 否则只仅显示当前运行的容器.
共享主机目录到容器
由于镜像内的内容都是只读的, 你在运行它得到容器后, 可以对容器进行更改, 但对镜像本身是没有影响的. 由于容器是类似与进程的东西, 它也不是永久的, 所以我们在创建容器时一般会共享主机的文件夹给容器, 这样我们可以把程序和数据放在这个文件家中. 容器中对这个文件夹的修改在主机上是可见的, 也是可以永久留存的. 共享文件夹需要在运行 docker run
命令时, 使用 -v
选项:
docker run -v path-to-host-fold:path-to-container-fold firedrakeproject/firedrake
如果我像把当前目录共享给容器, 容器中路径设为 /home/firedrake/workdir
, 就可以运行如下命令:
docker run -ti -v $(pwd):/home/firedrake/workdir firedrakeproject/firedrake
运行后我们可以查看目录 /home/firedrake
, 发现多了 workdir
目录, 其内容为主机文件夹中内容
$ docker run -ti -v $(pwd):/home/firedrake/workdir firedrakeproject/firedrake
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
firedrake@0895c511469e:~$ ls
firedrake firedrake-install firedrake-install.log workdir
firedrake@0895c511469e:~$ ls
firedrake firedrake-install firedrake-install.log workdir
firedrake@0895c511469e:~$ ls workdir/
Dockerfile.jupyter Untitled.ipynb
docker run
其他选项介绍
-
-d
在后台运行容器 -
--name <the-name>
给容器命名, 这样下次可以直接使用docker start <the-name>
启动容器, 而不用重新docker run
. 因为容器如果绑定主机端口的话, 不删除该容器 (即使该容器已退出), 就不能使用docker run
绑定该端口. 我们使用 jupyter 时需要绑定端口, 使得我们可以使用主机的浏览器访问容器中的服务, 所以我们一般第一次使用docker run --name <the-name> ...
创建一个有名字的容器, 下次直接使用docker start <the-name>
即可运行, 如果要停止它秩序使用docker stop <the-name>
即可. -
-p <host-port>:<container-port>
端口映射, 把容器的端口<container-port>
映射到主机的端口<host-port>
. 由于上述容器如firedrakeproject/firedrake-notebooks
中的 jupyter 服务的端口为8888
, 这里就需要把<container-port>
改为8888
, 而主机的端口可以任意设置, 只要没有使用过, 一般要大于1024
, 也可以设置为8888
示例介绍
运行 firedrakeproject/firedrake-notebooks
-
创建名为
firedrake-notebook
的容器, 并绑定主机的端口18888
, (可以任意设置, 记下设置的值, 后面会用到)docker run -d -v $(pwd):/home/firedrake/workdir --name firedrake-notebook -p 18888:8888 firedrakeproject/firedrake-notebooks
-
查看
jupyter server
的 token (后面需要用的到网页登录密码)这里有两种方式, 第一种方式比较通用 (对 jupyter notebook, jupyter lab 都适用), 第二种方式根据所使用的jupyter 启动命令不同而不同.
-
使用
docker logs firedrake-notebook
从日志中查看 tokendocker logs firedrake-notebook
输出结果如下
$ docker logs firedrake-jupyter [I 2021-08-04 03:39:42.318 ServerApp] jupyterlab | extension was successfully linked. [I 2021-08-04 03:39:42.333 ServerApp] Writing Jupyter server cookie secret to /home/firedrake/.local/share/jupyter/runtime/jupyter_cookie_secret [I 2021-08-04 03:39:42.621 ServerApp] nbclassic | extension was successfully linked. [I 2021-08-04 03:39:42.701 ServerApp] nbclassic | extension was successfully loaded. [I 2021-08-04 03:39:42.702 LabApp] JupyterLab extension loaded from /home/firedrake/firedrake/lib/python3.8/site-packages/jupyterlab [I 2021-08-04 03:39:42.702 LabApp] JupyterLab application directory is /home/firedrake/firedrake/share/jupyter/lab [I 2021-08-04 03:39:42.706 ServerApp] jupyterlab | extension was successfully loaded. [I 2021-08-04 03:39:42.706 ServerApp] Serving notebooks from local directory: /home/firedrake [I 2021-08-04 03:39:42.706 ServerApp] Jupyter Server 1.10.2 is running at: [I 2021-08-04 03:39:42.706 ServerApp] http://e6a211f17c41:8888/lab?token=362ffa501b2c35d3070b9a91403568082851296d97d635e1 [I 2021-08-04 03:39:42.706 ServerApp] or http://127.0.0.1:8888/lab?token=362ffa501b2c35d3070b9a91403568082851296d97d635e1 [I 2021-08-04 03:39:42.707 ServerApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). [C 2021-08-04 03:39:42.710 ServerApp] To access the server, open this file in a browser: file:///home/firedrake/.local/share/jupyter/runtime/jpserver-7-open.html Or copy and paste one of these URLs: http://e6a211f17c41:8888/lab?token=362ffa501b2c35d3070b9a91403568082851296d97d635e1 or http://127.0.0.1:8888/lab?token=362ffa501b2c35d3070b9a91403568082851296d97d635e1
这里网址中的
token
值362ffa501b2c35d3070b9a91403568082851296d97d635e1
为网页登录需要的密码.-
使用
docker exec firedrake-notebook jupyter notebook list
直接查看 token (若是使用 jupyter-lab 启动的, 需要把 notebook 换成 lab)$ docker exec firedrake-notebook jupyter notebook list Currently running servers: http://0.0.0.0:8888/?token=f5fb3c3a48e1c72606e7540bb2ea71bab1e5e97248a70b4e :: /home/firedrake
-
-
打开浏览器输入网址
127.0.0.1:18888
(这里18888
为上面绑定的主机端口) -
输入 token 至此即可在浏览器中编写和运行 Firedrake 程序了. Firedrake 教程请参考其网站 https://firedrakeproject.org/
-
完成工作如果需要关闭 container, 运行
docker stop firedrake-notebook
即可 -
重新打开 container, 运行
docker start firedrake-notebook
即可
运行 lrtfm/firedrake-jupyter
同上, 不在赘述
运行容器
docker run -d -v $(pwd):/home/firedrake/workdir --name firedrake-jupyter -p 18888:8888 lrtfm/firedrake-jupyter
查看 token
$ docker exec firedrake-jupyter jupyter lab list
Currently running servers:
http://0.0.0.0:8888/?token=f5fb3c3a48e1c72606e7540bb2ea71bab1e5e97248a70b4e :: /home/firedrake