使用docker进行容器化集成部署

远程服务器更新源

更新ubuntu的apt源

sudo apt-get update

安装包允许apt通过HTTPS使用仓库

sudo dpkg --configure -a
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

添加Docker官方GPG key【这个是国外服务器地址,所以网路不好的时候,会失败!在网路好的情况下,多执行几次就没问题了,如果下一行结果不是OK,则执行多几遍】

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

设置Docker稳定版仓库

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

添加仓库后,更新apt源索引

sudo apt-get update

前面的准备工作完成以后,接下来安装最新版Docker CE(社区版)

sudo apt-get install -y docker-ce

检查Docker CE是否安装正确

sudo docker pull ubuntu:20.04
# docker pull registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:ubuntu20.04

要获取基础镜像可以直接去官方网站上获取: https://hub.docker.com/

阿里云镜像:https://cr.console.aliyun.com/cn-heyuan/instances

启动与停止

安装完成Docker后,默认已经启动了docker服务,如需手动控制docker服务的启停,可执行如下命令

# 启动docker
sudo service docker start # 停止docker
sudo service docker stop # 重启docker
sudo service docker restart

安装docker-compose,这种安装方式是基于Linux操作系统的源来决定安装版本的,所以往往版本会比较低。

apt install -y docker-compose

ubuntu安装yarn

(可以直接在本地打包好前端项目后,放到ubuntu中)

导入软件源的 GPG key 并且添加 Yarn APT 软件源到你的系统,运行下面的命令:

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

一旦软件源被启用,升级软件包列表,并且安装 Yarn。

sudo apt update
sudo apt install yarn -y

上面的命令同时会安装 Node.js。如果你已经通过 nvm 安装了 Node,跳过 Node.js 安装过程:

sudo apt install --no-install-recommends yarn

完成之后,通过打印 Yarn 版本来验证安装过程:

yarn --version

目录结构

拉取项目:https://github.com/HkwJsxl/feisheng.git

服务器,目录结构:

/home/feisheng/
├── conf/
│ └── nginx/
│ └── web.conf
├── docker-compose.yml
└── fsweb/
└── fsapi/

远程部署服务器终端操作:

mkdir -p /home/feisheng/conf/nginx/
touch /home/feisheng/conf/nginx/web.conf
vim /home/feisheng/docker-compose.yml

阿里云镜像:https://cr.console.aliyun.com/cn-heyuan/instances

编排 nginx服务容器

拉取nginx

docker pull registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:nginx1.23.3
docker tag registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:nginx1.23.3 nginx:1.23.3

/home/feisheng/docker-compose.yml,代码:

version: '3'
services:
nginx:
image: nginx:1.23.3
restart: always
ports:
- "80:80"
container_name: "nginx"
volumes:
- ./fsweb:/home/fsweb
- ./conf/nginx/web.conf:/etc/nginx/conf.d/nginx.conf
networks:
- default
networks:
default:

/home/feisheng/conf/nginx/web.conf,这个文件是��备给nginx容器内部的虚拟主机配置文件

vim /home/feisheng/conf/nginx/web.conf

web.conf,代码:

server {
listen 80;
server_name www.fs.hkwpro.com;
# client_max_body_size 1000M;
# root /opt/dist; # client_max_body_size 20M; # Load configuration files for the default server block. location / {
root /home/fsweb;
index index.html;
# 单入口的url路径转发
try_files $uri $uri/ /index.html;
}
}

在远程部署终端启动容器服务

docker-compose -f /home/feisheng/docker-compose.yml up -d

服务端项目部署

根据我们之前分析的项目部署架构,后端需要调用mysql、redis、elasticsearch。因此我们需要先把这些外部软件先预装。

目录结构

/home/luffycity/
├── conf/
│ ├── redis/
│ │ └── master.conf
│ ├── mysql/
│ └── nginx/
│ └── web.conf
├── data/
│ ├── redis/
│ ├── elastic/
│ └── mysql/
├── docker-compose.yml
├── fsweb/
├── fsapi/
├── initdb/
│ └── feisheng.sql
├── logs/
│ └── mysql
└── plugins/

编排mysql服务容器

拉取mysql镜像

# 拉取
docker pull registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:mysql8.0.32
# 改名
docker tag registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:mysql8.0.32 mysql:8.0.32
# 删除改名之前的镜像
docker rmi registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:mysql8.0.32

在远程部署服务器上进行终端操作,创建目录结构

cd /home/feisheng
mkdir -p data/mysql logs/mysql initdb
vim /home/feisheng/docker-compose.yml

/home/feisheng/docker-compose.yml,代码:

version: '3'
services:
nginx:
image: nginx:1.23.3
restart: always
ports:
- "80:80"
container_name: "nginx"
volumes:
- ./fsweb:/home/fsweb
- ./conf/nginx/web.conf:/etc/nginx/conf.d/nginx.conf
networks:
- default mysql_master:
image: mysql:8.0.30
restart: always
container_name: "mysql_master"
networks:
- default
environment:
- "MYSQL_USER=fs"
- "MYSQL_PASSWORD=root123456"
- "MYSQL_DATABASE=fs"
- "TZ=Asia/Shanghai"
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
ports:
- 3306:3306
volumes:
- ./data/mysql:/var/lib/mysql
- ./logs/mysql:/logs
- ./initdb:/docker-entrypoint-initdb.d/ networks:
default:

把SQL文件移动到指定目录

# 将项目下的sql文件复制到服务器的initdb文件夹下(feisheng/docs/fs.sql)

重新启动docker-compose的容器服务

cd /home/feisheng
docker-compose -f docker-compose.yml down
docker-compose -f docker-compose.yml up -d # 注意:如果mysql容器要初始化数据库,则必须要保证在运行mysql容器之前,data目录是没有任何内容的!!!
# rm -rf /home/feisheng/data/ # 可以通过以下命令进入mysql容器
docker exec -it mysql_master mysql -uroot -proot123456
use fs;
show tables;

编排redis服务容器

拉取redis镜像

docker pull registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:redis7
docker tag registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:redis7 redis:7
docker rmi registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:redis7

创建目录和必须的文件

cd /home/feisheng
mkdir -p conf/redis data/redis/master
touch conf/redis/master.conf
vim conf/redis/master.conf

conf/redis/master.conf,主库配置文件,代码:

requirepass root123456
masterauth root123456
bind 0.0.0.0 # RDB快照
save 900 1
save 300 10
save 60 10000
dir "/data"
rdbcompression yes
dbfilename dump.rdb # AOF日志
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

保存redis配置文件,并编辑/home/luffycity/docker-compose.yml

cd /home/feisheng
vim /home/feisheng/docker-compose.yml

代码:

version: '3'
services:
nginx:
image: nginx:1.23.3
restart: always
ports:
- "80:80"
container_name: "nginx"
volumes:
- ./fsweb:/home/fsweb
- ./conf/nginx/web.conf:/etc/nginx/conf.d/nginx.conf
networks:
- default mysql_master:
image: mysql:8.0.32
restart: always
container_name: "mysql_master"
networks:
- default
environment:
- "MYSQL_ROOT_PASSWORD=root123456"
- "MYSQL_USER=fs"
- "MYSQL_PASSWORD=root123456"
- "MYSQL_DATABASE=fs"
- "TZ=Asia/Shanghai"
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
ports:
- 3306:3306
volumes:
- ./data/mysql:/var/lib/mysql
- ./logs/mysql:/logs
- ./initdb:/docker-entrypoint-initdb.d/ redis_master:
image: redis:7
restart: always
networks:
- default
ports:
- "6379:6379"
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
container_name: "redis_master"
volumes:
- ./conf/redis/master.conf:/usr/local/etc/redis/redis.conf
- ./data/redis/master:/data networks:
default:

启动服务

docker-compose -f docker-compose.yml down

docker-compose -f docker-compose.yml up -d

# 测试
docker exec -it redis_master redis-cli -a root123456

编排elasticsearch搜索引擎服务容器

拉取es镜像

docker pull registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:elasticsearch7.17.6

docker tag registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:elasticsearch7.17.6 elasticsearch:7.17.6

docker rmi registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:elasticsearch7.17.6

在服务器网络安全组中,开放9200,9300这2个端口

编辑/home/feisheng/docker-compose.yml

vim /home/feisheng/docker-compose.yml

代码:(至少2核4G的才能把es启动起来,2核2G的就不用尝试了)

version: '3'
services:
nginx:
image: nginx:1.23.3
restart: always
ports:
- "80:80"
container_name: "nginx"
volumes:
- ./fsweb:/home/fsweb
- ./conf/nginx/web.conf:/etc/nginx/conf.d/nginx.conf
networks:
- default mysql_master:
image: mysql:8.0.32
restart: always
container_name: "mysql_master"
networks:
- default
environment:
- "MYSQL_ROOT_PASSWORD=root123456"
- "MYSQL_USER=fs"
- "MYSQL_PASSWORD=root123456"
- "MYSQL_DATABASE=fs"
- "TZ=Asia/Shanghai"
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
ports:
- 3306:3306
volumes:
- ./data/mysql:/var/lib/mysql
- ./logs/mysql:/logs
- ./initdb:/docker-entrypoint-initdb.d/ redis_master:
image: redis:7
restart: always
networks:
- default
ports:
- "6379:6379"
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
container_name: "redis_master"
volumes:
- ./conf/redis/master.conf:/usr/local/etc/redis/redis.conf
- ./data/redis/master:/data elasticsearch_1:
image: elasticsearch:7.17.6
restart: always
container_name: "elasticsearch_1"
environment:
- "discovery.type=single-node"
- "bootstrap.memory_lock=true"
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "xpack.security.enabled=false"
- "http.cors.enabled=true"
- "http.cors.allow-origin=*"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/elastic:/usr/share/elasticsearch/data
- ./logs/elastic:/var/log/elasticsearch
- ./plugins:/usr/share/elasticsearch/plugins
ports:
- 9200:9200
networks:
- default networks:
default:

ik分词器下载解压到/home/feisheng/plugins/目录下。

mkdir -p /home/feisheng/data/elastic /home/feisheng/plugins
chmod 777 /home/feisheng/data/elastic # 下载ik中文分词插件
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.6/elasticsearch-analysis-ik-7.17.6.zip # 解压保存到es的插件目录
apt install unzip
unzip elasticsearch-analysis-ik-7.17.6.zip -d /home/feisheng/plugins/ik-7.17.6 # 启动服务
docker-compose -f docker-compose.yml down
docker-compose -f docker-compose.yml up -d # postman中测试访问 post http://47.120.38.34:9200/_analyze?pretty {
"analyzer": "ik_max_word",
"text": "我是中国人,我来自北京。"
}
# 监控docker-compose的所有容器运行的日志信息
docker-compose logs -f

es索引的生成是要结合django项目的ORM来生成,所以暂时先不用执行其他操作,先完成django项目的��署先。

基于Dockerfile定制服务端项目镜像

使用 Dockerfile之前,先切换成国内docker镜像源

mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json {
"registry-mirrors" : [
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com",
"https://cr.console.aliyun.com/"
]
}

下载Miniconda3

官网:https://docs.conda.io/en/latest/miniconda.html

https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-Linux-x86_64.sh

创建Dockerfile文件:

vim /home/feisheng/Dockerfile

/home/feisheng/Dockerfile,代码:

FROM ubuntu:20.04
LABEL maintainer="feisheng.Edu" ENV PYTHONUNBUFFERED 1 COPY ./Miniconda3-py38_23.1.0-1-Linux-x86_64.sh /opt/
COPY ./sources.list /etc/apt/sources.list
COPY ./fsapi /fsapi
COPY ./fsapi/requirements.txt /requirements.txt RUN apt-get update \
&& apt-get -y install wget \
&& mkdir /root/.conda \
&& bash /opt/Miniconda3-py38_23.1.0-1-Linux-x86_64.sh -b \
&& rm -f /opt/Miniconda3-py38_23.1.0-1-Linux-x86_64.sh ENV PATH /root/miniconda3/bin:$PATH RUN conda install pymysql -c conda-forge \
&& conda install uwsgi -c conda-forge \
&& pip install -r /requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple \
&& chmod -R 755 /fsapi WORKDIR /fsapi EXPOSE 8000 VOLUME /fsapi

注释版:

# 设置当前镜像的基础镜像,FROM指令只能使用一次,而且在Dockerfile顶部第一个使用
FROM ubuntu:20.04
# 设置描述信息
LABEL maintainer="feisheng.Edu"
# 设置环境变量,PYTHONUNBUFFERED设置python解析器在终端下stdout错误信息,一次性输出,要不在暂存区积攒
ENV PYTHONUNBUFFERED 1 # 复制文件 容器外部:容器内部
COPY ./Miniconda3-py38_23.1.0-1-Linux-x86_64.sh /opt/
COPY ./sources.list /etc/apt/sources.list
COPY ./fsapi /fsapi
COPY ./fsapi/requirements.txt /requirements.txt
# 运行系统命令
RUN apt-get update \ # 更新源
&& apt-get -y install wget \ # 安装wget下载工具
&& mkdir /root/.conda \
&& bash /opt/Miniconda3-py38_4.10.3-Linux-x86_64.sh -b \
&& rm -f /opt/Miniconda3-py38_4.10.3-Linux-x86_64.sh # 设置环境变量 ENV PATH /root/miniconda3/bin:$PATH # 设置环境变量 # 给conda全局base虚拟环境安装pymysql和uwsgi
RUN conda install pymysql -c conda-forge \
&& conda install uwsgi -c conda-forge \
# 递归安装requirements.txt中的所有依赖模块
&& pip install -r /requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple \
# 设置目录权限
&& chmod -R 755 /fsapi # 设置进入容器的默认工作目录
WORKDIR /fsapi
# 暴露容器的端口
EXPOSE 8000
# 设置/luffycityapi目录为逻辑卷,方便创建容器时,可以把当前目录的内容映射到容器外面进行持久化存储
VOLUME /fsapi
vim /home/feisheng/sources.list

/home/feisheng/sources.list,代码:

deb http://repo.huaweicloud.com/ubuntu/ focal main restricted
deb http://repo.huaweicloud.com/ubuntu/ focal-updates main restricted
deb http://repo.huaweicloud.com/ubuntu/ focal universe
deb http://repo.huaweicloud.com/ubuntu/ focal-updates universe
deb http://repo.huaweicloud.com/ubuntu/ focal multiverse
deb http://repo.huaweicloud.com/ubuntu/ focal-updates multiverse
deb http://repo.huaweicloud.com/ubuntu/ focal-backports main restricted universe multiverse
deb http://repo.huaweicloud.com/ubuntu focal-security main restricted
deb http://repo.huaweicloud.com/ubuntu focal-security universe
deb http://repo.huaweicloud.com/ubuntu focal-security multiverse

通过docker-compose启动fsapi镜像,docker-compose.yml,代码:

version: '3'
services:
nginx:
image: nginx:1.23.3
restart: always
ports:
- "80:80"
container_name: "nginx"
volumes:
- ./fsweb:/home/fsweb
- ./conf/nginx/web.conf:/etc/nginx/conf.d/nginx.conf
networks:
- default mysql_master:
image: mysql:8.0.32
restart: always
container_name: "mysql_master"
networks:
- default
environment:
- "MYSQL_ROOT_PASSWORD=root123456"
- "MYSQL_USER=fs"
- "MYSQL_PASSWORD=root123456"
- "MYSQL_DATABASE=fs"
- "TZ=Asia/Shanghai"
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
ports:
- 3306:3306
volumes:
- ./data/mysql:/var/lib/mysql
- ./logs/mysql:/logs
- ./initdb:/docker-entrypoint-initdb.d/ redis_master:
image: redis:7
restart: always
networks:
- default
ports:
- "6379:6379"
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
container_name: "redis_master"
volumes:
- ./conf/redis/master.conf:/usr/local/etc/redis/redis.conf
- ./data/redis/master:/data api1:
build: .
image: fsapi:1.0.0
container_name: api1
restart: always
ports:
- 8000:8000
networks:
- default
volumes:
- ./fsapi:/fsapi
command: >
sh -c "uwsgi --http :8000 --workers 4 --master --enable-threads --module fsapi.wsgi"
environment:
- "DJANGO_SETTINGS_MODULE=fsapi.settings.prod"
- "MYSQL_PASSWORD=root123456"
- "REDIS_PASSWORD=root123456"
- "RONGLIANYUNACCTOKEN=b6c417ddecb64f899a0a48e30c97b55d"
depends_on:
- mysql_master
- redis_master networks:
default:

启动服务

cd /home/feisheng

docker-compose -f docker-compose.yml down

docker-compose -f docker-compose.yml up -d

# 如果有es的,等待1分钟后给elasticsearch构建索引
# docker exec -it api1 python manage.py rebuild_index # 进入api1容器内部
docker exec -it api1 /bin/bash # 在mysql容器中导入数据
docker cp /home/feisheng/initdb/fs.sql mysql_master:/home/
docker exec -it mysql_master /bin/bash
mysql -uroot -p
root123456
use fs;
set names utf8mb4;
source /home/fs.sql

访问:http://api.fs.hkwpro.com:8000/home/banner/

使用nginx对uwsgi进行反向代理

接下来,我们就需要把api1服务端容器里面的uwsgi的运行模式从http改成socket模式。

docker-compose.yml,修改如下。

version: '3'
services:
nginx:
image: nginx:1.23.3
restart: always
ports:
- "80:80"
container_name: "nginx"
volumes:
- ./fsweb:/home/fsweb
- ./conf/nginx/web.conf:/etc/nginx/conf.d/nginx.conf
networks:
- default mysql_master:
image: mysql:8.0.32
restart: always
container_name: "mysql_master"
networks:
- default
environment:
- "MYSQL_ROOT_PASSWORD=root123456"
- "MYSQL_USER=fs"
- "MYSQL_PASSWORD=root123456"
- "MYSQL_DATABASE=fs"
- "TZ=Asia/Shanghai"
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
ports:
- 3306:3306
volumes:
- ./data/mysql:/var/lib/mysql
- ./logs/mysql:/logs
- ./initdb:/docker-entrypoint-initdb.d/ redis_master:
image: redis:7
restart: always
networks:
- default
ports:
- "6379:6379"
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
container_name: "redis_master"
volumes:
- ./conf/redis/master.conf:/usr/local/etc/redis/redis.conf
- ./data/redis/master:/data api1:
build: .
image: fsapi:1.0.0
container_name: api1
restart: always
ports:
- 8000:8000
networks:
- default
volumes:
- ./fsapi:/fsapi
command: >
sh -c "uwsgi --socket :8000 --workers 4 --master --enable-threads --module fsapi.wsgi"
environment:
- "DJANGO_SETTINGS_MODULE=fsapi.settings.prod"
- "MYSQL_PASSWORD=root123456"
- "REDIS_PASSWORD=root123456"
- "RONGLIANYUNACCTOKEN=b6c417ddecb64f899a0a48e30c97b55d"
depends_on:
- mysql_master
- redis_master networks:
default:

修改nginx配置文件

vim /home/feisheng/conf/nginx/web.conf

conf/nginx/web.conf,如下:

# 集群分发(upstream+uwsgi_pass)
upstream feisheng {
server 47.120.38.34:8000;
} server {
listen 80;
server_name api.fs.hkwpro.com; location / {
include uwsgi_params;
uwsgi_pass feisheng;
}
} server {
listen 80;
server_name www.fs.hkwpro.com;
# client_max_body_size 1000M;
# root /opt/dist; # client_max_body_size 20M; # Load configuration files for the default server block. location / {
root /home/feisheng/fsweb;
index index.html;
# 单入口的url路径转发
try_files $uri $uri/ /index.html;
}
}

重启docker-compose

docker-compose -f docker-compose.yml down
docker-compose -f docker-compose.yml up -d # 在mysql容器中导入数据
docker cp /home/feisheng/initdb/fs.sql mysql_master:/home/
docker exec -it mysql_master /bin/bash
mysql -uroot -p
root123456
use fs;
set names utf8mb4;
source /home/fs.sql # 接下来,我们直接在浏览器中,通过如下地址访问:
http://api.fs.hkwpro.com/home/nav/header/
http://www.fs.hkwpro.com/

针对后端服务器的运营站点提供静态文件的访问支持

直接让前端的nginx容器同时提供服务端静态文件的访问支持。

修改docker-compose.yml,把服务端的静态文件目录映射到nginx容器中。代码:

version: '3'
services:
nginx:
image: nginx:1.23.3
restart: always
ports:
- "80:80"
container_name: "nginx"
volumes:
- ./fsapi/static:/home/fsapi/static
- ./fsweb:/home/fsweb
- ./conf/nginx/web.conf:/etc/nginx/conf.d/nginx.conf
networks:
- default mysql_master:
image: mysql:8.0.32
restart: always
container_name: "mysql_master"
networks:
- default
environment:
- "MYSQL_ROOT_PASSWORD=root123456"
- "MYSQL_USER=fs"
- "MYSQL_PASSWORD=root123456"
- "MYSQL_DATABASE=fs"
- "TZ=Asia/Shanghai"
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
ports:
- 3306:3306
volumes:
- ./data/mysql:/var/lib/mysql
- ./logs/mysql:/logs
- ./initdb:/docker-entrypoint-initdb.d/ redis_master:
image: redis:7
restart: always
networks:
- default
ports:
- "6379:6379"
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
container_name: "redis_master"
volumes:
- ./conf/redis/master.conf:/usr/local/etc/redis/redis.conf
- ./data/redis/master:/data api1:
build: .
image: fsapi:1.0.0
container_name: api1
restart: always
ports:
- 8000:8000
networks:
- default
volumes:
- ./fsapi:/fsapi
command: >
sh -c "uwsgi --socket :8000 --workers 4 --master --enable-threads --module fsapi.wsgi"
environment:
- "DJANGO_SETTINGS_MODULE=fsapi.settings.prod"
- "MYSQL_PASSWORD=root123456"
- "REDIS_PASSWORD=root123456"
- "RONGLIANYUNACCTOKEN=b6c417ddecb64f899a0a48e30c97b55d"
depends_on:
- mysql_master
- redis_master networks:
default:

修改nginx配置文件web.conf,服务端对应的server配置项中增加一个location配置信息。conf/nginx/web.conf,如下:

upstream feisheng {
server 47.120.38.34:8000;
} server {
listen 80;
server_name api.fs.hkwpro.com; location / {
include uwsgi_params;
uwsgi_pass feisheng;
} location /static {
root /home/fsapi;
}
} server {
listen 80;
server_name www.fs.hkwpro.com;
# client_max_body_size 1000M;
# root /opt/dist; # client_max_body_size 20M; # Load configuration files for the default server block. location / {
root /home/fsweb;
index index.html;
# 单入口的url路径转发
try_files $uri $uri/ /index.html;
}
}

完成上面操作以后,我们可以看到当前api服务端的静态文件就提供了http正常浏览了。

重启docker-compose

docker-compose -f docker-compose.yml down
docker-compose -f docker-compose.yml up -d # 在mysql容器中导入数据
docker cp /home/feisheng/initdb/fs.sql mysql_master:/home/
docker exec -it mysql_master /bin/bash
mysql -uroot -p
root123456
use fs;
set names utf8mb4;
source /home/fs.sql # 访问(80端口)
http://api.fs.hkwpro.com/home/banner/

启动celery

关于celery的启动,因为需要依赖于django项目的。所以celery的启动自然也就和当前api容器一并运行。

修改celery的启动配置文件

vim /home/feisheng/fsapi/script/fs_celery_worker.ini

代码:

[program:fs_celery_worker]
# 启动命令 conda env list
command=/root/miniconda3/bin/celery -A fsapi worker -l info -n worker1
# 以管理员身份执行运行celery
user=root
numprocs=1
# 项目根目录的绝对路径,通过pwd查看
directory=/fsapi
# 项目虚拟环境
enviroment=PATH="/root/miniconda3/bin"
# 输出日志绝对路径
stdout_logfile=/fsapi/logs/celery.worker.info.log
# 错误日志绝对路径
stderr_logfile=/fsapi/logs/celery.worker.error.log
# 自动启动,开机自启
autostart=true
# 重启
autorestart=true # 进程启动后跑了几秒钟,才被认定为成功启动,默认1
startsecs=10
# 进程结束后60秒才被认定结束
stopwatisecs=60 # 优先级
priority=999
vim /home/feisheng/fsapi/script/fs_celery_beat.ini

代码:

[program:fs_celery_beat]
# 启动命令 conda env list
command = /root/miniconda3/bin/celery -A fsapi beat -l info
# 项目根目录的绝对路径,通过pwd查看
directory = /fsapi
# 项目虚拟环境
enviroment = PATH="/root/miniconda3/bin"
# 输出日志绝对路径
stdout_logfile = /fsapi/logs/celery.beat.info.log
# 错误日志绝对路径
stderr_logfile = /fsapi/logs/celery.beat.error.log
# 自动启动,开机自启
autostart = true
# 重启
autorestart = true # 进程启动后跑了几秒钟,才被认定为成功启动,默认1
startsecs = 10 # 进程结束后60秒才被认定结束
stopwatisecs = 60 # 优先级
priority = 998
vim /home/feisheng/fsapi/script/fs_celery_flower.ini

代码:

[program:fs_celery_flower]
# 启动命令 conda env list
command = /root/miniconda3/bin/celery -A fsapi flower --port=5555
# 项目根目录的绝对路径,通过pwd查看
directory = /fsapi
# 项目虚拟环境
enviroment = PATH="/root/miniconda3/bin"
# 输出日志绝对路径
stdout_logfile = /fsapi/logs/celery.flower.info.log
# 错误日志绝对路径
stderr_logfile = /fsapi/logs/celery.flower.error.log
# 自动启动,开机自启
autostart = true
# 重启
autorestart = true # 进程启动后跑了几秒钟,才被认定为成功启动,默认1
startsecs = 10 # 进程结束后60秒才被认定结束
stopwatisecs = 60 # 优先级
priority = 990
vim /home/feisheng/fsapi/script/supervisor.service

代码:

[Unit]
Description=supervisor
After=network.target [Service]
Type=forking
ExecStart=/root/miniconda3/bin/supervisord -n -c /fsapi/script/supervisord.conf
ExecStop=/root/miniconda3/bin/supervisorctl $OPTIONS shutdown
ExecReload=/root/miniconda3/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s [Install]
WantedBy=multi-user.target

服务端的安全组,开放5555端口。

docker-compose,代码:

version: '3'
services:
nginx:
image: nginx:1.23.3
restart: always
ports:
- "80:80"
container_name: "nginx"
volumes:
- ./fsapi/static:/home/fsapi/static
- ./fsweb:/home/fsweb
- ./conf/nginx/web.conf:/etc/nginx/conf.d/nginx.conf
networks:
- default mysql_master:
image: mysql:8.0.32
restart: always
container_name: "mysql_master"
networks:
- default
environment:
- "MYSQL_ROOT_PASSWORD=root123456"
- "MYSQL_USER=fs"
- "MYSQL_PASSWORD=root123456"
- "MYSQL_DATABASE=fs"
- "TZ=Asia/Shanghai"
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
ports:
- 3306:3306
volumes:
- ./data/mysql:/var/lib/mysql
- ./logs/mysql:/logs
- ./initdb:/docker-entrypoint-initdb.d/ redis_master:
image: redis:7
restart: always
networks:
- default
ports:
- "6379:6379"
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
container_name: "redis_master"
volumes:
- ./conf/redis/master.conf:/usr/local/etc/redis/redis.conf
- ./data/redis/master:/data elasticsearch:
image: elasticsearch:7.17.2
restart: always
environment:
- "discovery.type=single-node"
- "bootstrap.memory_lock=true"
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "xpack.security.enabled=false"
- "http.cors.enabled=true"
- "http.cors.allow-origin=*"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/elastic:/usr/share/elasticsearch/data
- ./logs/elastic:/var/log/elasticsearch
- ./plugins:/usr/share/elasticsearch/plugins
ports:
- 9200:9200
networks:
- default api1:
build: .
image: fsapi:1.0.0
container_name: api1
restart: always
ports:
- 8000:8000
networks:
- default
volumes:
- ./fsapi:/fsapi
command: >
sh -c "supervisord -c script/supervisord.conf && uwsgi --socket :8000 --workers 4 --master --enable-threads --module fsapi.wsgi"
environment:
- "DJANGO_SETTINGS_MODULE=fsapi.settings.prod"
- "C_FORCE_ROOT=1"
- "MYSQL_PASSWORD=root123456"
- "REDIS_PASSWORD=root123456"
- "RONGLIANYUNACCTOKEN=b6c417ddecb64f899a0a48e30c97b55d"
depends_on:
- mysql_master
- redis_master
- elasticsearch networks:
default:

启动服务

cd /home/feisheng
docker-compose -f docker-compose.yml down
docker-compose -f docker-compose.yml up -d # 在mysql容器中导入数据
docker cp /home/feisheng/initdb/fs.sql mysql_master:/home/
docker exec -it mysql_master /bin/bash
mysql -uroot -p
root123456
use fs;
set names utf8mb4;
source /home/fs.sql # 进入容器
docker exec -it api1 /bin/bash

结束

Ubuntu下docker部署的更多相关文章

  1. .net core Ubuntu下docker部署(精简版)

    一.首先先添加一个.netCore 项目,选择启用docker(我用的是vs2019,之前的可能需要手动点击项目添加docker支持) 没有的话需要手动添加 之后你的项目会存在这个dockerfile ...

  2. ubuntu下vnc部署安装

    ubuntu下vnc部署安装,参考如下博客:https://www.cnblogs.com/xuliangxing/p/7642650.html https://jingyan.baidu.com/a ...

  3. Tars | Win10下Docker部署TarsJava(SpringBoot)全过程及踩坑记录

    @ 目录 前言 1. 相关环境版本: 坑点一:VMware与Win10 Docker冲突 坑点二:20.版本TarsJava(SpringBoot)依赖文件缺失 2. Docker安装: 坑点三:Do ...

  4. Windows 下 docker 部署 gitlab ci

    一.安装 1. 安装 docker Docker下载 注意:Windows 10 家庭版获取 之前的版本不能直接安装 Docker ,而是需要去安装 Docker Toolbox 我这里安装的是 Do ...

  5. ubuntu下docker安装

    首先来一个官网安装教程链接:https://docs.docker.com/install/linux/docker-ce/ubuntu/ 目前docker主要有docker-CE 与 docker- ...

  6. Mac下 Docker部署SpringBoot应用

    一.安装Docker环境 使用 Homebrew 安装 macOS 我们可以使用 Homebrew 来安装 Docker. Homebrew 的 Cask 已经支持 Docker for Mac,因此 ...

  7. Ubuntu16.04 下docker部署web项目

    概念性的请戳 第一步:更新apt-get update 第二步:安装环境 apt-get install \ apt-transport-https \ ca-certificates \ curl ...

  8. centos7下docker 部署javaweb

    LXC linux container 百度百科:http://baike.baidu.com/link?url=w_Xy56MN9infb0hfYObib4PlXm-PW02hzTlCLLb1W2d ...

  9. Ubuntu下安装部署MongoDB以及设置允许远程连接

    最近因为项目原因需要在阿里云服务器上部署MongoDB,操作系统为Ubuntu,网上查阅了一些资料,特此记录一下步骤. 1.运行apt-get install mongodb命令安装MongoDB服务 ...

  10. hadoop2 Ubuntu 下安装部署

    搭建Hadoop环境( 我以hadoop 2.7.3 为例, 系统为 64bit Ubuntu14.04 ) hadoop 2.7.3 官网下载 , 选择自己要安装的版本.注意每个版本对应两个下载选项 ...

随机推荐

  1. [转帖]VCSA证书过期问题处理

    1.  故障现象 2022年10月25日,登陆VC报错. 按照报错信息,结合官方文档,判断为STS证书过期导致. vCenter Server Appliance (VCSA) 6.5.x, 6.7. ...

  2. 我们开源了一个 Ant Design 的单元测试工具库

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:佳岚 欢迎大家点一个小小的 Star ant-design ...

  3. React中生命周期的讲解

    什么是生命周期? 从出生到成长,最后到死亡,这个过程的时间可以理解为生命周期. React中的组件也是这么一个过程. React的生命周期分为三个阶段:挂载期(也叫实例化期).更新期(也叫存在期).卸 ...

  4. 【k哥爬虫普法】简历大数据公司被查封,个人隐私是红线!

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  5. docker 发布web项目到linux

    一.准备工作 1.连接到Liunx的工具 MobaXterm 填好Ip 直接点ok就行 输入用户名和密码进入系统 2.已发布的.netcore网站或微服务 在要发布的项目上右键---->添加-- ...

  6. layui之静态表格的分页及搜索功能以及前端使用XLSX导出Excel功能

    LayUI官方文档:https://layui.dev/docs/2/#introduce XLSX NPM地址:https://www.npmjs.com/package/xlsx XLSX 使用参 ...

  7. paddleNLP-BUG和一些细节记录【一】

    1.TypeError: isfile() takes 1 positional argument but 2 were given File "/root/miniconda3/envs/ ...

  8. 6.9 Windows驱动开发:内核枚举进线程ObCall回调

    在笔者上一篇文章<内核枚举Registry注册表回调>中我们通过特征码定位实现了对注册表回调的枚举,本篇文章LyShark将教大家如何枚举系统中的ProcessObCall进程回调以及Th ...

  9. Celery Worker log 中记录 task_id

    import inspect import logging import threading from logging import Logger as Logger, LogRecord from ...

  10. CF940F Machine Learning题解

    题目链接:洛谷 或者 CF 不是特别难的题,抽象下题意就是算区间次数出现的次数 mex 和带单点修改.看到范围 \(1e5\) 还带修改,传统的 mex 求法里貌似就莫队类算法好带修,考虑带修莫队. ...