使用Docker离线部署

本文阅读预计需要: 3 minutes

环境需求

离线部署指目标服务器无法访问公网,需要先在能联网的机器上准备好安装包和镜像,再拷贝到离线环境安装。

  • 服务器 A(离线):需要部署可道云的目标机器
  • 服务器 B(联网):已安装 Docker,用于下载安装包和拉取镜像

离线安装 Docker

Docker 是容器运行平台。请先从 Docker 官网下载页面 下载 RPM 安装包,以下以 CentOS 7 为例。 分别下载最新版本的:

将以上文件上传到服务器 A(假设放在 docker 目录),执行安装命令:

[root@kod ~]# rpm -ivh docker/*.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:docker-scan-plugin-0:0.23.0-3.el7################################# [ 17%]
   2:docker-ce-cli-1:20.10.19-3.el7   ################################# [ 33%]
   3:containerd.io-1.6.13-3.1.el7     ################################# [ 50%]
   4:docker-ce-rootless-extras-0:20.10################################# [ 67%]
   5:docker-ce-3:20.10.19-3.el7       ################################# [ 83%]
   6:docker-compose-plugin-0:2.14.1-3.################################# [100%]
[root@kod ~]# docker -v
Docker version 20.10.19, build d85ef84

导入镜像

在能联网、已安装 Docker 的服务器 B 上拉取镜像,并导出为 tar 包(便于拷贝到离线环境):

$ docker pull kodcloud/kodbox
$ docker pull redis:alpine
$ docker pull mariadb:10.6
$ docker save -o kodbox.tar kodcloud/kodbox
$ docker save -o redis.tar redis:alpine
$ docker save -o mariadb.tar mariadb

将 tar 包上传到离线服务器 A,执行导入命令:

$ docker load -i kodbox.tar
$ docker load -i redis.tar
$ docker load -i mariadb.tar

导入完成后,执行 docker images 应能看到 kodboxredismariadb 三个镜像。

HTTP 方式快速启动

注意

在离线服务器 A 上创建一个目录作为项目目录,后面所有命令都在这个目录下执行

  • 创建 .env 文件设置环境变量(必须修改等号右边的值,格式如 MYSQL_USER=kodbox,值不要包含 & 符号)。Docker 启动时会自动将这些变量传入容器:

    $ mkdir /kodbox && cd /kodbox
    $ vim .env
    
  • 创建 db.env 文件,设置数据库专用环境变量(执行 vim db.env 编辑):

    MYSQL_PASSWORD=
    MYSQL_DATABASE=kodbox
    MYSQL_USER=kodbox
    
  • 创建 docker-compose.yml 文件,配置端口映射和数据持久化目录:

    $ vim docker-compose.yml
    
    version: '3.5'
    
    services:
      db:
        image: mariadb:10.6
        restart: always
        command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
        volumes:
          - "./db:/var/lib/mysql"       #./db是数据库持久化目录,可以修改
          # - "./etc/mysql/conf.d:/etc/mysql/conf.d"       #增加自定义mysql配置
        environment:
          - MYSQL_ROOT_PASSWORD=
          - MARIADB_AUTO_UPGRADE=1
          - MARIADB_DISABLE_UPGRADE_BACKUP=1
        env_file:
          - db.env
    
      app:
        image: kodcloud/kodbox
        restart: always
        ports:
          - 80:80                       #左边80是使用端口,可以修改
        volumes:
          - "./site:/var/www/html"      #./site是站点目录位置,可以修改
        environment:
          - MYSQL_HOST=db
          - REDIS_HOST=redis
        env_file:
          - db.env
        depends_on:
          - db
          - redis
    
      redis:
        image: redis:alpine
        restart: always
    

进入项目目录,执行 docker compose up -d 启动服务。离线环境不会重新拉取镜像,直接使用已导入的本地镜像创建容器:

$ docker compose up -d
Creating network "kodbox_default" with the default driver
Creating kodbox_redis_1 ... done
Creating kodbox_db_1    ... done
Creating kodbox_app_1   ... done

列出docker容器,可以看到3个容器正在运行

$ docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED              STATUS              PORTS                          NAMES
f596f5b00305   kodcloud/kodbox   "/entrypoint.sh /usr…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, 9000/tcp   kodbox_app_1
5f94f6d1aabb   mariadb           "docker-entrypoint.s…"   About a minute ago   Up About a minute   3306/tcp                       kodbox_db_1
e6296b23fb0a   redis:alpine      "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp                       kodbox_redis_1

如果需要停止服务

$ docker compose down
Stopping kodbox_app_1   ... done
Stopping kodbox_db_1    ... done
Stopping kodbox_redis_1 ... done
Removing kodbox_app_1   ... done
Removing kodbox_db_1    ... done
Removing kodbox_redis_1 ... done
Removing network kodbox_default

由于数据库和kodbox已经挂载了持久化目录,需要时可以重新启动,不用担心数据丢失

$ docker compose up -d

然后访问 KodBox 安装向导,完成系统初始化。

Docker, 容器, 离线