1. 背景
我们常常会基于某个 image 来启动一个 container,在这个 container 中我们可能会执行某些操作,比如创建一个文件,但是当这个 container 退出以后,如果我们以同一个的 image 启动了另一个 container,在这个 container 中是看不到之前那个 container 创建的文件的。如果想让后面的 container 看到之前那个 container 创建的文件,就要把之前那个 container 保存成一个镜像,然后基于这个镜像来启动后面的那个 container。
2. Create Image from Container
举个简单的例子:(假设我们都是以root权限操作)
docker run -i -t centos:7.3.1611 bash /bin/bash
该命令执行完我们就基于 centos:7.3.1611 启动了一个 container,在这个 container 中我们通过 bash 来与之前的 container 交流,同时,这条命令执行完我们会看到命令提示符变成了:
后面的 a64e7edccf38 就是这个 container 的 ID,接着我们可以在这个 container 中创建一个文件,如下:
echo -e "Hello, world." >/root/test.c
然后我们退出这个 container(执行 exit),并通过以下命令来将这个 container 保存成一个镜像:
docker commit a64e7edccf38 centos:new_change
接着我们可以以这个镜像来启动另一个 container,如下:
docker run -i -t centos:new_change /bin/bash
在该 containe r中我们可以找到之前创建的 test.c 文件,如果我们以原来的 centos:7.3.1611 来启动后一个 container,是找不到 test.c 的。
3. Docker Galaxy Container
基于前面的知识,我们现在对基于 shenweiyan/galaxy-dev:latest 镜像的 container 进行中文化处理,并打包成 image,提交到阿里云 docker 镜像中心。
关于 shenweiyan/galaxy-dev:latest
镜像,这里需要说明两点:
shenweiyan/galaxy-dev:latest
镜像来源于bgruening/galaxy-stable
基础镜像:docker tag bgruening/galaxy-stable:latest shenweiyan/galaxy-dev:latestbgruening/galaxy-stable:latest
详细信息,请参考:https://github.com/bgruening/docker-galaxy-stable
3.1. 登陆,安装 node
bgruening/galaxy-stable(v17.09)
默认的 node 版本为 v0.10.25,该版本在使用 make client
静态文件打包的时候会出错,因此需要先升级 node。
1. 获取正在运行的 Galaxy container
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79f2b6d67c6a shenweiyan/galaxy-dev:latest "/usr/bin/startup" 20 hours ago Up About a minute 443/tcp, 8800/tcp, 9002/tcp, 0.0.0.0:10021->21/tcp, 0.0.0.0:10022->22/tcp, 0.0.0.0:10080->80/tcp sharp_poincare
2. 进入运行中的 Galaxy container
$ docker exec -it 79f2b6d67c6a bash
root@79f2b6d67c6a:/galaxy-central# which node
/usr/bin/node
root@79f2b6d67c6a:/galaxy-central# node -v
v0.10.25
3. 源码安装升级 node
root@79f2b6d67c6a:/galaxy-central# cd /export/tool_deps/
root@79f2b6d67c6a:/export/tool_deps# mkdir source local
root@79f2b6d67c6a:/export/tool_deps# cd source
# node-v9.2.0 源码下载
root@79f2b6d67c6a:/export/tool_deps/source# wget https://nodejs.org/download/release/latest-v0.12.x/node-v0.12.18.tar.gz
root@79f2b6d67c6a:/export/tool_deps/source# tar zvxf node-v0.12.18.tar.gz
# node-v0.12.18 源码编译安装(非常耗时间)
root@79f2b6d67c6a:/export/tool_deps/source# cd node-v9.2.0
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# ./configure --prefix=/export/tool_deps/local/node-v0.12.18
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# make
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# make install
# 更改默认 node
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# mv /usr/bin/node /usr/bin/node.bak
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# mv /usr/bin/npm /usr/bin/npm.bak
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# ln -s /export/tool_deps/local/node-v0.12.18/bin/* /usr/local/sbin/node
# 确认默认 node、npm 版本
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# node -v
v0.12.18
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# npm -v
2.15.11
3.2. Galaxy 中文配置
Galaxy 默认的中文配置位于 <galaxy_root>/client/galaxy/scripts/nls/zh,不同的中文翻译可自行修改该目录下的 locale.js 文件进行配置。
Galaxy 部分中文翻译,请参考:https://github.com/istevenshen/galaxy/blob/dev/client/galaxy/scripts/nls/zh/locale.js
3.3. 打包静态文件
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# su galaxy
galaxy@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18$ cd /galaxy-central/
galaxy@79f2b6d67c6a:/galaxy-central$ node -v
v0.12.18
galaxy@79f2b6d67c6a:/galaxy-central$ make client
cd client && npm install
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.2 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
added 851 packages in 72.496s
cd client && node_modules/grunt-cli/bin/grunt
Running "check-modules" task
Running "uglify:target" (uglify) task
>> 231 sourcemaps created.
>> 231 files created.
Running "webpack" task
bundling webpack apps for production...
...
Running "less:dist" (less) task
>> 7 stylesheets created.
Running "clean:clean" (clean) task
>> 1 path cleaned.
Done, without errors.
# 退出 Galaxy container
galaxy@79f2b6d67c6a:/galaxy-central$ exit
exit
root@79f2b6d67c6a:/usr/local/source/node-v0.12.18#
exit
3.4. 停止 Galaxy container
# 执行停止操作前,请先确保 Galaxy container 已经退出,这一点非常重要
# 查看运行中的 Galaxy container
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79f2b6d67c6a shenweiyan/galaxy-dev:latest "/usr/bin/startup" 21 hours ago Up 33 minutes 443/tcp, 8800/tcp, 9002/tcp, 0.0.0.0:10021->21/tcp, 0.0.0.0:10022->22/tcp, 0.0.0.0:10080->80/tcp sharp_poincare
# 停止 Galaxy container
$ docker stop 79f2b6d67c6a
79f2b6d67c6a
3.5. 保存 container 为新镜像
# 保存镜像
$ docker commit 79f2b6d67c6a shenweiyan/galaxy-new
sha256:5629bfe51267105800600b8150ecbdd0d3b9bcd489893ec033034418da329129
3.6. 运行 galaxy-new 新镜像
# 查看所有镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
shenweiyan/galaxy-new latest 5629bfe51267 About an hour ago 2.46GB
shenweiyan/galaxy-dev latest d603aeb08687 22 hours ago 2.22GB
# 查看正在运行的 container
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 基于新镜像,启动 container
$ docker run -d -p 11080:80 -p 11021:21 -p 11022:22 -v /data/docker/galaxy-data/:/export/ shenweiyan/galaxy-new:latest
7dfe36b780e37612548509d900cf0fbd403c16117e3aa211d9147b04d257a8f0
# 查看正在运行的 container
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7dfe36b780e3 shenweiyan/galaxy-new:latest "/usr/bin/startup" 14 seconds ago Up 13 seconds 443/tcp, 8800/tcp, 9002/tcp, 0.0.0.0:11021->21/tcp, 0.0.0.0:11022->22/tcp, 0.0.0.0:11080->80/tcp wizardly_lichterman
最后,浏览器打开 “http://服务器ip:110080” 看到基于 galaxy-new 的中文版 Docker Galaxy(Tools 栏没有中文处理):
4. 阿里云镜像提交
4.1. 将镜像推送到 aliyun registry
详细的阿里云 Docker 镜像上传请参考:http://blog.shenweiyan.cn/post/Docker-%E9%95%9C%E5%83%8F%E4%B8%8A%E4%BC%A0%E5%88%B0%E9%98%BF%E9%87%8C%E4%BA%91,这里只记录一下主要的上传操作。
# username 为阿里云 docker 账户,需要先注册
$ sudo docker login --username=1910866178@qq.com registry.cn-shenzhen.aliyuncs.com
# [ImageId], [镜像版本号]请你根据自己的镜像信息进行填写
$ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/stevendev/galaxy-new:[镜像版本号]
$ sudo docker push registry.cn-shenzhen.aliyuncs.com/stevendev/galaxy-new:[镜像版本号]
TIP:注意您的网络环境
从阿里云 ECS 推送镜像时,可以选择走内网,速度将大大提升,并且将不会损耗您的公网流量。
如果您申请的机器是在经典网络,请使用 registry-internal.cn-shenzhen.aliyuncs.com 作为 registry 的域名登录, 并作为镜像名空间前缀。
如果您申请的机器是在 vpc 网络的,请使用 registry-vpc.cn-shenzhen.aliyuncs.com 作为 registry 的域名登录, 并作为镜像名空间前缀。
到这里,你的 Galaxy Docker 镜像已经上传完成,接下来可以把你的镜像分享给其他人,让他们部署使用或者在你的镜像基础上进行更深入的开发。
本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。