Docker 化你的开源项目

引言

在我开源的 蓝眼云盘 (https://github.com/eyebluecn/tank) 中有 网友建议 道使用docker并且push到DockerHub上,这样子就可以一行代码直接安装蓝眼云盘了。这个提议非常好,因此本篇文章就记录下蓝眼云盘docker化的整个详细过程。在阅读这篇文章之前,读者需要具有Docker基础,我推荐阅读 《Docker — 从入门到实践》

目标

  • 熟悉docker和docker-compose的基本操作
  • 熟悉将 golang 工程部署到docker的整个流程
  • 能够在docker中快速启动蓝眼云盘,访问 http://server-ip:6010 可以看到首页内容

环境

1. 宿主机环境

$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

宿主机不要求和我完全一致,其他版本的Linux也行,甚至Mac Os, Windows ,只要能安装docker都行。

2. docker

$ docker version

Client:
 Version:       18.01.0-ce
 API version:   1.35
 Go version:    go1.9.2
 Git commit:    03596f5
 Built: Wed Jan 10 20:07:19 2018
 OS/Arch:       linux/amd64
 Experimental:  false
 Orchestrator:  swarm

Server:
 Engine:
  Version:      18.01.0-ce
  API version:  1.35 (minimum version 1.12)
  Go version:   go1.9.2
  Git commit:   03596f5
  Built:        Wed Jan 10 20:10:58 2018
  OS/Arch:      linux/amd64
  Experimental: false

docker 尽量使用最新版本

构建Docker镜像

1. 准备源代码

clone 项目 Github后端tank地址 到本地。

# 可以根据自己的实际情况,决定项目放置的位置
$ mkdir -p /data/group/golang/
$ cd /data/group/golang/

# clone 蓝眼云盘项目
$ git clone https://github.com/eyebluecn/tank.git
$ cd tank

2. 制作Dockerfile文件

我们需要从源代码开始编译整个项目,Dockerfile文件描述整个构建的过程。
在tank根目录下创建文件Dockerfile
在clone下来的蓝眼云盘项目中,Dockerfile已经存在了,你可以直接阅读Dockerfile中的内容,或者删除这个文件重新创建,以作学习练习使用。

Dockerfile的内容如下:

# 使用1.9的golang作为母镜像
FROM golang:1.9

# 维护者信息,也就是作者的姓名和邮箱
MAINTAINER eyeblue "eyebluecn@126.com"

# 指定工作目录就是 tank。工作目录指的就是以后 每层构建的当前目录 。
WORKDIR $GOPATH/src/tank

# 将tank项目下的所有文件移动到golang镜像中去
COPY . $GOPATH/src/tank

# 这里为了维持docker无状态性,准备数据卷作为日志目录和上传文件目录
VOLUME /data/log
VOLUME /data/matter
# 通过环境变量的方式,为应用指定日志目录和上传文件目录。
ENV TANK_LOG_PATH=/data/log TANK_MATTER_PATH=/data/matter


# golang.org库国内无法下载,这里从我准备的github中clone
# github.com的库可以直接通过`go get`命令下载
# `go install tank`是对项目进行打包
# `cp`是将项目需要的html等文件移动到可执行文件的目录下。
RUN git clone https://github.com/eyebluecn/golang.org.git $GOPATH/src/golang.org \
    && go get github.com/disintegration/imaging \
    && go get github.com/json-iterator/go \
    && go get github.com/go-sql-driver/mysql \
    && go get github.com/jinzhu/gorm \
    && go get github.com/nu7hatch/gouuid \
    && go install tank \
    && cp -r $GOPATH/src/tank/build/* $GOPATH/bin

# 声明运行时容器提供服务端口,这只是一个声明。默认是6010端口
EXPOSE 6010

# tank作为执行文件 启动这个容器就会去执行 `/go/bin/tank`
ENTRYPOINT ["/go/bin/tank"]

3. 开始构建docker镜像

首先保证当前目录是Dockerfile所在的目录,然后执行以下指令即可开始构建:

$ docker build -t eyeblue/tank:1.0.2 .

其中eyeblue 是我的 Docker Hub ID,tank是镜像名,1.0.2是我当前构建的镜像版本。
注意最后的小点.不要遗漏了。

如果构建成功,会看到以下提示

Successfully built 3cc1bf6757af
Successfully tagged eyeblue/tank:1.0.2

4. 推送到远程

只有当我们把自己构建的镜像push到Docker Hub后,别人才能很方便的下载,一行命令执行我们的应用。如果你对Docker Hub注册,或者命令行登录不熟悉,请参考这篇文章:《Docker Hub》

推送到远程的指令如下:

$ docker push eyeblue/tank:1.0.2

如果命令执行成功,你将看到以下提示

The push refers to repository [docker.io/eyeblue/tank]
62f3bd4ed81c: Pushed
b417ac3c9fc9: Pushed
2a7192ac3426: Pushed
b7600cc31df2: Mounted from library/golang
690bf254e66f: Mounted from library/golang
23c5addd579d: Mounted from library/golang
af1e37edd79f: Mounted from library/golang
b31411566900: Mounted from library/golang
06f4de5fefea: Mounted from library/golang
851f3e348c69: Mounted from library/golang
e27a10675c56: Mounted from library/golang
1.0.2: digest: sha256:7ba3c6b95ab5fef022342543fbb7cff5bf8b61c2ae2795900c83ba616da32375 size: 2635

运行项目

1. docker-compose 安装

我们的蓝眼云盘项目在运行的时候依赖mysql数据库,在docker中运行一个镜像依赖另一个镜像的时候就要使用到docker-compose。首先进入docker-compose下载页 。找到一个稳定版本的安装脚本,在命令行中执行便可。

$ curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

$ chmod +x /usr/local/bin/docker-compose

2. 编写docker-compose.yml

docker-compose.yml描述了镜像启动的数据卷,环境变量,启动方式,依赖项等。运行蓝眼云盘的docker-compose.yuml如下:

#docker-compose版本,这里的3不要动
version: "3"
services:

   # 数据库的镜像信息
   # 使用mysql:5.7的镜像
   db:
     image: mysql:5.7
     volumes:
       # 数据库文件存放在宿主机的`~/data/mysql`位置,如果宿主机目录不存在,则会自动创建
       - ~/data/mysql:/var/lib/mysql
     # 如果启动失败,则总是会重启。因为镜像有依赖的情况,不停重启可以保证依赖项启动成功后自己再运行
     restart: always
     environment:
       # 指定root密码为`tank123`,并且创建一个新数据库`tank`,同时用户名和密码为`tank` `tank123`
       MYSQL_ROOT_PASSWORD: tank123
       MYSQL_DATABASE: tank
       MYSQL_USER: tank
       MYSQL_PASSWORD: tank123

   # 蓝眼云盘的镜像信息
   # 依赖 mysql:5.7 的镜像
   tank:
     image: eyeblue/tank:1.0.2
     depends_on:
       - db
     ports:
       # 端口映射关系,宿主机端口:镜像端口
       - "6010:6010"
     # 如果启动失败,则总是会重启。因为镜像有依赖的情况,不停重启可以保证依赖项启动成功后自己再运行
     restart: always
     environment:
       # mysql的端口
       TANK_MYSQL_PORT: 3306
       # Mysql的主机,和services的第一个节点一致。
       TANK_MYSQL_HOST: db
       # 数据库
       TANK_MYSQL_SCHEMA: tank
       # 数据库的用户名
       TANK_MYSQL_USERNAME: tank
       # 数据库的密码
       TANK_MYSQL_PASSWORD: tank123
       # 超级管理员的昵称。只能是英文或数字
       TANK_ADMIN_USERNAME: admin
       # 超级管理员邮箱,作为登录账号
       TANK_ADMIN_EMAIL: admin@tank.eyeblue.cn
       # 超级管理员密码,作为登录密码
       TANK_ADMIN_PASSWORD: 123456
     volumes:
       # 日志文件存放在宿主机的`~/data/tank/log`位置,如果宿主机目录不存在,则会自动创建
       - ~/data/tank/log:/data/log
       # 上传文件存放在宿主机的`~/data/tank/matter`位置,如果宿主机目录不存在,则会自动创建
       - ~/data/tank/matter:/data/matter

3. 运行项目

首先保证当前目录是docker-compose.yml所在的目录,然后执行以下指令即可运行蓝眼云盘:

$ docker-compose up -d

4. 验证

由于数据库启动需要一定的时间,因此大约20s后,打开浏览器访问http://127.0.0.1:6010,如果看到以下界面则表示运行成功。

[图片上传失败...(image-a9a12-1517293121825)]

5. 停止项目

方法一:使用以下命令来停止蓝眼云盘

$ docker-compose stop

方法二:当然你也可以用停止容器的方式来停止蓝眼云盘

$ docker container ls

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                    NAMES
f5f64735fc53        eyeblue/tank:1.0.2   "/go/bin/tank"           20 minutes ago      Up 13 seconds       0.0.0.0:6010->6010/tcp   tank_tank_1
3a859cad3e7e        mysql:5.7            "docker-entrypoint.s…"   20 minutes ago      Up 14 seconds       3306/tcp                 tank_db_1

$ docker container stop f5
$ docker container stop 3a

参考文章

我开源了一个私人云盘——蓝眼云盘

Docker — 从入门到实践

Docker实战 - 将golang工程部署到docker

原文发布于蓝眼博客 https://blog.eyeblue.cn/home/article/510f9316-9ca1-40fe-b1b3-5285505a527d

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,499评论 15 147
  • 0. 前言 docker是什么?docker是用GO语言开发的应用容器引擎,基于容器化,沙箱机制的应用部署技术。可...
    sessionboy阅读 3,832评论 2 49
  • 一 、什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国...
    Blazzer阅读 3,125评论 0 13
  • 是结束,也是开始...... 西藏之行结束的那天下午,我独自一人在拉萨火车站坐上了回京的火车。 天渐渐黑了下来。窗...
    君君1001阅读 871评论 21 31
  • 你说三亚又降温了 我这里不 因为一直都冷 我戴上帽子和手套 冷从缝隙里钻 在我身上取暖 有人说为啥冬天人就喜欢赖床...
    觉知之光阅读 87评论 1 2