Solo 开源博客 - 修改源码构建自己 docker 镜像

1. Solo 开源博客介绍

Solo 是一款小而美的开源博客系统,专为程序员设计。
源码仓库:

2. fork 源码到自己的 GitHub

3. 开始定制自己的 solo 之旅

如果我们想要修改 solo 源码,第一步当然是要在本地把 solo 项目跑起来啦,参考搭建 Solo 开发环境

创建 solo 数据库

create database solo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

运行启动类

在 IDE 中直接运行 org.b3log.solo.Server 类。
启动成功后,就可以通过 localhost:8080 访问了

4. 通过本地 solo 项目构建 docker 镜像

docker 镜像的构建,会依照项目根部的 Dokerfile 进行构建
如 solo 的 Dokerfile 文件如下

FROM maven:3-jdk-8-alpine as MVN_BUILD

WORKDIR /opt/solo/
ADD . /tmp
RUN cd /tmp && mvn package -DskipTests -Pci -q && mv target/solo/* /opt/solo/ \
&& cp -f /tmp/src/main/resources/docker/* /opt/solo/

FROM openjdk:8-alpine
LABEL maintainer="Liang Ding<d@b3log.org>"

WORKDIR /opt/solo/
COPY --from=MVN_BUILD /opt/solo/ /opt/solo/
RUN apk add --no-cache ca-certificates tzdata

ENV TZ=Asia/Shanghai
EXPOSE 8080

ENTRYPOINT [ "java", "-cp", "lib/*:.", "org.b3log.solo.Server" ]
docker build -t aoker/mysolo:dev ,
docker run -d -p 8080:8080 --name solo \
--env RUNTIME_DB="MYSQL" \
--env JDBC_USERNAME="root" \
--env JDBC_PASSWORD="123456" \
--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
--env JDBC_URL="jdbc:mysql://docker.for.mac.host.internal:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
aoker/mysolo --listen_port=8080 --server_scheme=http --server_host=localhost --server_port=8080

--env JDBC_URL="jdbc:mysql://docker.for.mac.host.internal:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
可以看到我 MySQL 的配置,使用的是 docker.for.mac.host.internal,而非使用的 localhost,这是为什么呢?
这是因为我使用的 Mac 系统安装的 docker for Mac,docker for Mac 在 Mac 系统上的运行机制导致的
docker for Mac 比较特殊,docker 本身在 Mac 也是启动的虚拟机,并非像在 Linux 上面运行在宿主机的一个进程,所以 Mac 的 docker host 模式,容器共用的端口是与 docker 虚拟机共用的,并非宿主机

此时需要在容器中配置宿主机服务的 ip 由 localhost 改为
Mac 下 Docker 容器访问宿主机端口

Mac 下的 docker 其实是虚拟机,所以无法直接访问宿主机

Docker for Mac v 17.12 to v 18.02

直接使用: docker.for.mac.host.internal

Docker for Mac v 17.06 to v 17.11

直接使用: docker.for.mac.localhost

Docker for Mac 17.05 and below

设置主机主址别名:sudo ifconfig lo0 alias 123.123.123.123/24, 然后使用:123.123.123.123

5. 通过腾讯(阿里)云镜像仓库管理自己的镜像

我们修改源码后,最终会构建镜像,部署到云服务器上,这时我们可以通过云服务商提供的镜像仓库功能,管理自己的镜像,并在服务器上进行部署更新。

操作步骤

开通镜像仓库

说明:

首次使用镜像仓库的用户,需要先开通镜像仓库。

  1. 登录容器服务控制台,选择左侧导航栏中的【镜像仓库】>【我的镜像】。
  2. 根据以下提示填写相关信息,并单击【开通】进行初始化。如下图所示:
    • 用户名:默认是当前用户的账号,是您登录到腾讯云 docker 镜像仓库的身份。
    • 密码:是您登录到腾讯云 docker 镜像仓库的凭证。

创建命名空间

  1. 选择左侧导航栏中的【镜像仓库】>【我的镜像】,进入“我的镜像”页面。

  2. 在“我的镜像”页面中,选择【命名空间】页签并单击【新建】。如下图所示:

  3. 在弹出的“新建命名空间”窗口中,输入命名空间名并单击【提交】。如下图所示:

    说明:

    命名空间名称全局唯一,若您希望使用的命名空间名称已被其他用户使用,请尝试其他适用的命名空间名称。

创建镜像

  1. 选择左侧导航栏中的【镜像仓库】>【我的镜像】,进入“我的镜像”页面。

  2. 在“我的镜像”页面,单击镜像列表页上方的【新建】。如下图所示:

  3. 输入镜像名称和描述,然后【提交】。

    说明:

    命名空间将用于分类容器镜像,也是您创建的私人镜像地址的前缀,本文以 tkefiletest 为例。

推送镜像到镜像仓库

登录到腾讯云 registry

  1. 在终端替换以下命令中的相关信息并执行,登录腾讯云 registry。

    $ sudo docker login --username=[username] ccr.ccs.tencentyun.com
    

    username:腾讯云账号,开通时已注册。

  2. 输入密码后即登录完成。

上传镜像

根据以下提示替换命令中的相关信息并执行,上传镜像。

$ sudo docker tag [ImageId] ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]
$ sudo docker push ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]

下载镜像

  1. 执行以下命令登录到镜像仓库,需输入在 开通镜像仓库 中已设置的密码。

    $ sudo docker login --username=[username] ccr.ccs.tencentyun.com
    
  2. 替换命令中的相关信息并执行,下载镜像。

    $ sudo docker pull ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]
    

删除镜像

  1. 选择左侧导航栏中的【镜像仓库】>【我的镜像】,进入“我的镜像”页面。
  2. 在“我的镜像”页面,选择需删除镜像所在行右侧【删除】。
  3. 在弹出的“删除镜像仓库”窗口中,单击【确定】即可删除该镜像所有版本。如下图所示:

6. 利用腾讯云在线进行构建镜像

  1. 进入我们刚刚新建的镜像仓库,如图所示,会列出我们之前已经构建好的镜像版本
    image.png
  2. 我们进入镜像构建-构建配置,进行设置镜像构建,关联我们的源码仓库,授权腾讯云访问我们的 GitHub
    image.png
  3. 我们配置好后就可以看到配置好的配置
    image.png
  4. 点击立即构建,选择构建版本,并可以在线进行构建镜像,构建成功后,并会在下面生成构建记录,并创建对应版本镜像
    image.png
  1. 构建好的镜像如何部署到自己的服务器呢?

只需要执行如下命令即可,拉取镜像到服务器上

 $ sudo docker login --username=[username] ccr.ccs.tencentyun.com

替换命令中的相关信息并执行,下载镜像。

 $ sudo docker pull ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]

然后运行镜像,并可 run 起来了

docker run -d --name mysolo --network=host \

--env RUNTIME_DB="MYSQL" \

--env JDBC_USERNAME="root" \

--env JDBC_PASSWORD="123456" \

--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \

--env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \

-v /dockerData/solo/skins:/opt/solo/skins \

ccr.ccs.tencentyun.com/aoker/mysolo:3.6.7 --listen_port=8080 --server_scheme=http --server_host=服务器IP --server_port=8080
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。

    Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!
    具体细节请浏览 B3log 构思

    1093 引用 • 8401 回帖 • 631 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    314 引用 • 753 回帖 • 508 关注
1 操作
T-Aoker 在 2019-12-28 14:23:55 更新了该帖
4 回帖
请输入回帖内容...
  • acuilab

    话说把开源的搞成私有的,你没问问大 D 同意么?

    1 回复
  • T-Aoker

    @88250 D 大,这种有问题吗doge

  • 88250

    @acuilab @T-Aoker Solo 使用 AGPL 开源协议,简单说就是需要对所有能够访问到网站的人开源,所以只要是开源的就没有问题了。非要搞成闭源的话我也拦不住不是么 🤣

    1 回复
  • T-Aoker

    受教了