最近在工作场所,需要配置一个GitLab,来供大家共享源代码。考虑到未来想在同时在一台机器上架Daily Build,于是选择了在Windows平台下,进行架设。
说到Windows平台的架设,一个比较简单无脑的方式是用 Docker Toolbox 一键配置出 VirtualBox 虚拟机环境下的 Boot2Docker,以进行容器操作。之后便可以根据 GitLab的Docker源 配置出来了。
不过,如果只采用其附带的Kitematic进行内部地址,到外部(Windows)系统的文件共享时,只能共享到 C:\User\当前用户\ 目录下的路径。这是由于在自动配置Boot2Docker时,仅仅将 C:\User\当前用户\ 目录,共享到了系统目录,自然也就只能设定那个目录下的东西了。
为此,我们需要手动地将额外的目录绑定到虚拟机环境内。下面是我编写的能实现这个功能的脚本(在 Docker Quickstart Terminal 产生的命令行中调用后,即可将当前的Docker Machine与SRC_HOST_PATH目录相连接):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
DEST_DOCKER_PATH="f/" SRC_HOST_PATH="E:\\" VBOXMANAGE="${VBOX_MSI_INSTALL_PATH}VBoxManage" VM="${DOCKER_MACHINE_NAME}" DOCKER_MACHINE="docker-machine" VM_STATUS="$(${DOCKER_MACHINE} status ${VM} 2>&1)" if [ "${VM_STATUS}" == "Running" ]; then "${DOCKER_MACHINE}" stop "${VM}" fi "${VBOXMANAGE}" registervm ~/.docker/machine/machines/${VM}/${VM}/${VM}.vbox "${VBOXMANAGE}" sharedfolder add ${DOCKER_MACHINE_NAME} --name ${DEST_DOCKER_PATH} --hostpath ${SRC_HOST_PATH} -automount "${VBOXMANAGE}" setextradata ${DOCKER_MACHINE_NAME} VBoxInternal2/SharedFoldersEnableSymlinksCreate/${DEST_DOCKER_PATH} 1 "${DOCKER_MACHINE}" start "${VM}" "${DOCKER_MACHINE}" env |
Boot2Docker启动时,会检测在VirtualBox中共享的文件夹,然后自动地挂载到 / 目录下。如你共享了外部系统的“E:\”目录,共享名称为“f/”,Boot2Docker会将这个共享挂载到 /f 目录下。我们可以利用这点,将其他的文件夹挂载进去。(Ref:剖析 boot2docker.iso)
这里用到了VBoxManage,一个命令行下变更虚拟机属性的工具,来进行修改。一是增加共享文件夹目录,二是允许其在目录下建立symlink(GitLab新建Repo的过程涉及到了Symlink)。(Ref:VBoxManage)
注:尽管你允许了,但是一般而言,你还需要使用管理员权限运行虚拟机,才能建立。或者你可以打开“secpol.msc”,本地策略->用户权限分配->创建符号连接,在里面加入Everyone,以允许虚拟机在普通权限建立。(Ref: VirtualBox共享文件夹无法创建符号连接的解决方法)
之后将部署文件docker-compose.yml中volume相关的内容改成刚才新挂载进去的目录就可以了:
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 |
... ... postgresql: restart: always image: sameersbn/postgresql:9.6-2 volumes: - /f/postgresql:/var/lib/postgresql/data:Z ... ... gitlab: restart: always image: sameersbn/gitlab:9.2.2 depends_on: - redis - postgresql ports: - "10816:80" - "10822:22" volumes: - /f/gitdata:/home/git/data:Z environment: - DEBUG=false - DB_ADAPTER=postgresql ... ... |
之后启动就会将所有运行相关文件,保存到你想要的外部目录了。
PS1:记得改postgresql的数据目录!!!!!!!(Ref: lose data when I restart the container. #872)
PS2:踩坑好难过Q Q
PS3:外部可以再拿nginx反向代理一下
PS4:docker真好玩真好玩,之后有分布式相关的东西一定要试试做docker镜像一键批量部署,想想就刺激(这算运维的工作…?)
PS5:f7(eiki)喜欢!