From 8a33bc515bf6adff76829f9d4015d933554fb9bc Mon Sep 17 00:00:00 2001 From: xuweiwei <1900919313@qq.com> Date: Thu, 22 Apr 2021 17:07:34 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=9B=B4=E6=96=B0docker-compose=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E7=9A=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- torna-docker-compose/README.md | 245 +++++++++++++++++++++++++++++---- 1 file changed, 218 insertions(+), 27 deletions(-) diff --git a/torna-docker-compose/README.md b/torna-docker-compose/README.md index 0fd6c43d..9907fd16 100644 --- a/torna-docker-compose/README.md +++ b/torna-docker-compose/README.md @@ -1,42 +1,217 @@ -使用docker-compose部署torna +> 使用docker-compose部署torna。 +> +> 操作系统为CentOS7。 # 环境要求 -- docker 1.8+ +- docker 18+ - docker-compose 1.12+ - mysql 5.7+ + + + # 准备 -主要是初始化数据库和导入数据。直接下载项目的mysql脚本导入即可 + +* ~~主要是初始化数据库和导入数据。直接下载项目的mysql脚本导入即可~~,目前不需要这么做了,因为在启动mysql容器镜像的时候,已经自动执行了mysql的脚本文件了。 + + + +# Docker的安装 + +* 软件包更新到最新: + +```shell +yum -y update +``` + +* 关闭selinux: + +```shell +# 查看selinux是否开启 +getenforce +``` + +```shell +# 永久关闭selinux,需要重启 +sed -i 's/enforcing/disabled/' /etc/selinux/config +``` + +```shell +# 临时关闭selinux,重启之后,无效 +setenforce 0 +``` + +* 关闭swap分区: + +```shell +# 永久关闭swap分区,需要重启 +sed -ri 's/.*swap.*/#&/' /etc/fstab +``` + +```shell +# 临时关闭swap分区,重启之后,无效 +swapoff -a +``` + +* 重启机器: + +```shell +reboot +``` + +* 安装Docker: + +```shell +wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo +``` + +```shell +yum -y install docker-ce +``` + +```shell +systemctl enable docker && systemctl start docker +``` + +```shell +docker version +``` + +* 设置Docker的镜像加速器: + +```shell +sudo mkdir -p /etc/docker +``` + +```shell +sudo tee /etc/docker/daemon.json <<-'EOF' +{ + "exec-opts": ["native.cgroupdriver=systemd"], + "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"], + "live-restore": true, + "log-driver":"json-file", + "log-opts": {"max-size":"500m", "max-file":"3"} +} +EOF +``` + +```shell +sudo systemctl daemon-reload +``` + +```shell +sudo systemctl restart docker +``` + + + # docker-compose安装 -下面介绍docker-compose的安装。 -## 下载docker-compose + +* 命令行curl工具在线安装: + ``` -https://github-production-release-asset-2e65be.s3.amazonaws.com/15045751/6e19c880-7b13-11ea-97d7-bec401ece2d4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20200527%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200527T140431Z&X-Amz-Expires=300&X-Amz-Signature=6fa6e2efd7f3e53f608b28e70c0e756274e6439cb28b491b9f0aaf269429054d&X-Amz-SignedHeaders=host&actor_id=9592228&repo_id=15045751&response-content-disposition=attachment%3B%20filename%3Ddocker-compose-Linux-x86_64&response-content-type=application%2Foctet-stream +# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我们以编译好的二进制包方式安装在Linux系统中。 +curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose ``` -上面的连接可能会失效,如失效则请直接访问github找到对应的版本。 +* 在国内,GitHub访问可能很慢,请到下面的地址中去下载。 + ``` https://github.com/docker/compose/releases ``` -下载后重名为docker-compose。如果你在windows上下载也可以重命名后传到linux服务器上。 -然后将docker-compose放到`/usr/local/bin/`目录下。然后执行下列命令完成安装。 +* 下载后重名为docker-compose。如果你在windows上下载也可以重命名后传到linux服务器上。 +* 当然,也可以使用国内的地址在线安装。 + +```shell +curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose +``` + +* 将docker-compose放到`/usr/local/bin/`目录下。然后执行下列命令完成安装。 + ``` sudo chmod +x /usr/local/bin/docker-compose ``` -安装完成后可以执行下面命令检查 +* 创建软链接 + +```shell +sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose +``` + +* 安装完成后可以执行下面命令检查 + ``` docker-compose --version ``` + + +# docker-compose的卸载 + +* 卸载命令: + +```shell +rm /usr/local/bin/docker-compose +``` + + + # 部署torna -在部署torna的服务器上创建一个torna的目录用于放置部署配置。 + +> 在部署torna的服务器上创建一个torna的目录用于放置部署配置。 + ## 创建docker-compose.yaml编排文件 -编排文件内容参考如下: + +![torna-docker-compose目录结构](images/torna-docker-compose目录结构.jpg) + +* mysql.sql:略。 + +* Dockerfile(之所以有这个Dockerfile文件,是为了启动mysql容器的时候,执行mysql脚本): + +```dockerfile +FROM mysql:5.7 +#定义会被容器自动执行的目录 +ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d +#定义初始化sql文件 +ENV INIT_SQL mysql.sql +#把要执行的sql文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个sql +COPY $INIT_SQL $AUTO_RUN_DIR +#给执行文件增加可执行权限 +RUN chmod a+x $AUTO_RUN_DIR/$INIT_SQL ``` -version: '3' + +* docker-compose.yaml内容参考如下: + +```dockerfile +version: "3" services: + mysql: + build: + context: ./ + dockerfile: Dockerfile + container_name: mysql +# ports: +# - 3306:3306 + environment: + TZ: Asia/Shanghai + MYSQL_ROOT_PASSWORD: 123456 + MYSQL_ROOT_HOST: '%' + command: + --default-authentication-plugin=mysql_native_password + --character-set-server=utf8mb4 + --collation-server=utf8mb4_general_ci + --lower_case_table_names=1 + volumes: + - ./my.cnf:/etc/my.cnf + networks: + - torna-net + restart: always torna: image: tanghc2020/torna:latest container_name: torna ports: - 7700:7700 + depends_on: + - mysql + ## 建立连接 + links: + - mysql volumes: - ./application.properties:/torna/config/application.properties environment: @@ -44,42 +219,58 @@ services: - JAVA_OPTS=-server -Xmx512m -Xms512m -Djava.awt.headless=true networks: - torna-net + restart: always networks: torna-net: ``` -volumes中的配置表示把本地的配置挂载到torna容器中。可以挂载多个文件。 -容器中挂载的配置路径为/torna/config`。上面配置中暴露的端口是7700。 +* volumes中的配置表示把本地的配置挂载到torna容器中。可以挂载多个文件。 +* 上面配置中暴露的端口是7700。 + ## 创建application.properties -application.properties源自`server/boot/src/main/resources/application.properties`,因此实际使用过程中请参考最新的配置来更新, -下面主要是做说明和参考 +* application.properties源自`server/boot/src/main/resources/application.properties`,因此实际使用过程中请参考最新的配置来更新,下面主要是做说明和参考: + ``` # 服务端口 server.port=7700 # 数据库连接配置 -mysql.host=localhost:3306 +# mysql.host=localhost:3306 +mysql.host=mysql:3306 mysql.username=root -mysql.password=root +mysql.password=123456 ``` -主要是修改application.properties中的数据库配置为自己的数据库。 +* 主要是修改application.properties中的数据库配置为自己的数据库(注意:这里的mysql的host我写的是mysql,是因为docker-compose.yaml中的torna和mysql服务建立了连接,名称为mysql)。 -当然如果你的服务器可以连接外部网络,那么上面的过程你完全可以直接如命令下载到服务器: -``` +* 当然如果你的服务器可以连接外部网络,那么上面的过程你完全可以直接如命令下载到服务器: + +```shell mkdir /data/torna-docker-compose +``` + +```shell cd /data/torna-docker-compose +``` + +```shell wget https://gitee.com/durcframework/torna/raw/master/server/boot/src/main/resources/application.properties +``` + +```shell wget https://gitee.com/durcframework/torna/raw/master/torna-docker-compose/docker-compose.yml ``` -下载完后修改application.properties配置即可 + +* 下载完后修改application.properties配置即可. ## 启动和停止容器 -完成上面的配置后,就可以启动torna。 +* 完成上面的配置后,就可以启动torna。 + +* 启动 -启动 ``` docker-compose up -d ``` -停止 +* 停止 + ``` docker-compose down ``` @@ -90,7 +281,7 @@ docker-compose down http://ip:7700/ >登录账号相关信息直接查看项目的顶层readme文档。 ## 查看日志 -如果你需要观察sql语句在torna中的执行情况。通过docker logs来查看。 +* 如果你需要观察sql语句在torna中的执行情况。通过docker logs来查看。 ``` # 查询出torna容器的id -- Gitee From 928cfb1596c09f6c87ea159135c99d5131afafca Mon Sep 17 00:00:00 2001 From: xuweiwei <1900919313@qq.com> Date: Thu, 22 Apr 2021 17:09:07 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=9B=B4=E6=96=B0docker-compose=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E7=9A=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\256\345\275\225\347\273\223\346\236\204.jpg" | Bin 0 -> 9845 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "torna-docker-compose/images/torna-docker-compose\347\233\256\345\275\225\347\273\223\346\236\204.jpg" diff --git "a/torna-docker-compose/images/torna-docker-compose\347\233\256\345\275\225\347\273\223\346\236\204.jpg" "b/torna-docker-compose/images/torna-docker-compose\347\233\256\345\275\225\347\273\223\346\236\204.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..afb92e98ff99d42a0040eff69428ffd6c8490351 GIT binary patch literal 9845 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 literal 0 HcmV?d00001 -- Gitee