0%

使用docker搭建写作环境

众所周知,在windows下面使用有些工具等于自虐,比如python, nodejs, pandoc …
所以,在windows下面,使用markdown写文档变成了一种非常不好的体验。

偏偏有时候又不得不使用windows。比如单位的某上网助手软件,只有windows版本。

幸好有了docker。

目的

在windows下愉快的使用 python (如 anaconda, jupyter-notebook, sphinx等), nodejs(如 hexo, gitbook 等),pandoc, git。

docker简介

Docker 是基于 Linux的一个 Sandbox 环境,通过模拟整个 Linux 的系统文件来实现。Docker不是虚拟机,更类似于在Linux中模拟WindowsWine

关于 docker 的基本概念和教程,可以参考这里

Windows7 搭建 docker环境

由于 windows10以下还不支持 Hyper-V,所以在windows10以下(Mac OS X 10.10.3 以下也是同样的问题)使用docker,是通过 Virtualbox变相实现的。

最早的工具是boot2docker,现在则使用docker-machine

安装

国内访问官网比较慢,可以使用镜像站点 https://get.daocloud.io/
对于Windows7,下载并安装 Docker Toolbox

创建及启动 docker 虚拟机

如前所述,Windows7 下面是创建了一个 Virtualbox 虚拟机启动docker,所以要先创建 docker 虚拟机:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#查看 docker虚拟机
$docker-machine ls
# 如果没有,可以创建一个
$docker-machine create box
# 启用 docker虚拟机
$docker-machine.exe env box

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="C:\Users\XXXXXXX\.docker\machine\machines\box"
export DOCKER_MACHINE_NAME="box"
export COMPOSE_CONVERT_WINDOWS_PATHS="true"
# Run this command to configure your shell:
# eval$("C:\Program Files\Docker Toolbox\docker-machine.exe" env box)

# 注意输出的信息,还要执行一个命令:
$eval$("C:\Program Files\Docker Toolbox\docker-machine.exe" env box)

# 启动 docker虚拟机
$docker-machine start

# 此时就可以使用docker命令了
$docker images

如果此时打开Virtualbox,会发现有一个名为 box 的虚拟机并处于启动状态。这个就是docker的运行环境。可以登录到该虚拟机:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$docker-machine ssh
## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
_ _ ____ _ _
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 17.11.0-ce, build HEAD : e620608 - Tue Nov 21 18:11:40 UTC 2017
Docker version 17.11.0-ce, build 1caf76c

交互式创建容器(container)

容器是以镜像(iamge)为模板的。可以查看或加载镜像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE

# 获取一个镜像作为模板
$docker pull ubuntu

# 基于镜像启动容器
$docker run -it ubuntu bash

# 如果使用 gitbash , 可能需要增加前缀
winpty docker run -it ubuntu bash

# 配置环境

# 安装基础环境
apt-get install bzip2 tzdata locales ttf-wqy-microhei git

echo "Asia/Shanghai" > /etc/timezone
dpkg-reconfigure -f noninteractive tzdata

locale-gen en_US.UTF-8


apt-get install pandoc graphviz



apt-get install npm
npm install -g hexo-cli gitbook-cli
ln -s /usr/bin/nodejs /usr/bin/node

保存到镜像

上面的改动都发生在容器内。也可以把这些改动提交到一个新的容器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 找到容器的ID
docker ps -a

# 提交到镜像,这个过程可以多次重复
docker commit a30595f088d8 blog_env

# 查看镜像
docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
blog_env latest 46365a6c0926 4 seconds ago 112MB
ros latest a674644c9bd3 11 days ago 1.18GB
ubuntu latest 0458a4468cbc 11 days ago 112MB
vnpy latest 35431482bc9c 8 weeks ago 2.7GB
hub.c.163.com/public/ubuntu 16.04-tools 1196ea15dad6 10 months ago 336MB

挂载主机文件夹

如果使用了 docker-machine,需要先将本地文件夹挂载到 docker 虚拟机上。
比如 d:\ –> /data。

然后在启动 docker 容器时,通过命令挂载:

1
2
3
docker run -it -v /data:/mydata blog_env

cd /mydata

这样在容器中,就可以通过 /mydata 访问到主机的文件夹了。

后台运行和网络访问

1
docker run -d -p 4000:4000 cd /data/holbrook.github.io && hexo s

使用

1
docker run -d -p 8888:8888 jupyter notebook --ip=0.0.0.0 --no-browser --allow-root

然后就可以使用http://docker-machine-ip:8888?token=xxxxxx 访问

winpty docker run -it -p 8888:8888 pyenv

编写Dockerfile

所有这些操作,都可以编写成一个 Docker 的 Makefile —— Dockerfile.

/2017/12/05/writing_env_within_docker/Dockerfile 是一个例子。
1
2
3
4
# 先清理容器,以免空间不足
docker rm$(docker ps -a -q)
# 通过dockerbuild制作镜像
docker build -t blog_env .

需要注意的是,当通过dockerfile创建挂载点(mount)时,
所有通过该镜像创建的容器都自动有了挂载点,
但是不能指定主机上的目录。

需要通过docker inspect查看过载点的Source,然后在主机中创建相应的目录。

提交镜像