# docker_demo **Repository Path**: null_640_4186/docker_demo ## Basic Information - **Project Name**: docker_demo - **Description**: 这是个前后端分离的demo项目,前端用vue开发,后端是python+flask。 项目的部署会把把前端打包成静态文件,部署在nginx容器里。python的后端程序也会打成容器镜像。此外还需要一个mysql 的容器镜像 - **Primary Language**: Python - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-01-17 - **Last Updated**: 2024-08-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 容器化部署demo ## 介绍 参考https://gitee.com/aiw-nine/pv/,这是个前后端分离的demo项目,前端用vue开发,后端是python+flask。 接下来会把前端打包成静态文件,部署在nginx容器里。python的后端程序也会打成容器镜像。此外还需要一个mysql 的容器镜像 ## 编镜像 ### web 1.修改代码并build前端为静态文件: cd vue-axios vi src/utils/request.js ``` import axios from 'axios' const request = axios.create({ baseURL: '/api', // 注意!! 这里是全局统一加上了 后端接口前缀 前缀,后端必须进行跨域配置! timeout: 5000 }) ``` baseURL里去掉http://localhost 运行npm run build,生成dist静态文件目录。 2.在 vue-axios下增加nginx.conf ```nginx ser nginx; worker_processes 1; #设置值和CPU核心数一致 error_log /var/log/nginx/error.log warn;#日志 pid /var/run/nginx.pid; worker_rlimit_nofile 65535; events { use epoll; worker_connections 65535; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; gzip on; gzip_min_length 100; #处理请求压缩的缓冲区数量和大小。比如32 4K表示按照内存页(one memory page)大小以4K为单位(即一个系统中内存页为4K),申请32倍的内存空间。建议此项不设置,使用默认值。 gzip_buffers 32 4k; #用于识别http协议的版本,早期的浏览器不支持gzip压缩,用户会看到乱码,所以为了支持前期版本加了此选项。默认在http/1.0的协议下不开启gzip压缩。 gzip_http_version 1.0; #gzip压缩级别,级别越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大。 gzip_comp_level 2; #压缩的文件类型 gzip_types text/plain application/javascript application/x-javascript application/json text/css font/ttf font/otf font/woff application/vnd.ms-fontobject image/vnd.microsoft.icon image/svg+xml application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; #是否在http header中添加Vary: Accept-Encoding gzip_vary on; #禁用IE 6 gzip gzip_disable "MSIE [1-6]\."; location / { root /app;#站点目录 try_files $uri $uri/ /此Vue路由名/index.html; index index.html; } #第三方代理 location /api/ { #rewrite ^.+api/?(.*)$ /$1 break; proxy_pass http://demo_backend:666/; #demo_backend为后端服务的容器名 } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } } ``` 3. 编写Dockerfile并build docker镜像 在vue-axios下新建Dockerfile,内容为 cat Dockerfile ```dockerfile FROM nginx RUN mkdir /app COPY ./dist /app COPY ./nginx.conf /etc/nginx/nginx.conf ENTRYPOINT nginx -g "daemon off;" ``` 运行docker build -f Dockerfile -t demo_web:v1 . ```shell (base) [root@c1 vue-axios]# docker images|grep demo_web demo_web v1 4a54e984801d 34 minutes ago 150MB ``` ### backend 1.修改代码 python-flask vi app/db.py ```python # 数据库操作类 import pymysql DB_CONFIG = { "host": "mysql8", #mysql8 为数据库的容器名 "port": 3306, "user": "root", "passwd": "123456", "db": "test", "charset": "utf8" } ``` 2.编写Dockerfile python-flask下新建Dockerfile,内容为 ```dockerfile FROM python:3.9-slim ENV LANG en_US.UTF-8 LC_ALL=en_US.UTF-8 COPY ./app /app RUN cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && python3 -m pip install --trusted-host mirrors.aliyun.com --no-cache-dir -i http://mirrors.aliyun.com/pypi/simple -r /app/requirements.txt \ && rm -rf /var/cache/* \ && rm -rf /tmp/* ENV PYTHONIOENCODING=utf-8 WORKDIR /app ENTRYPOINT ["python3","app.py"] ``` 3. build docker 镜像 docker build -f Dockerfile -t demo_backend:v1 . ```sh (base) [root@c1 python-flask]# docker images|grep backend demo_backend v1 b8c540b00a51 44 hours ago 132MB ``` ## docker 手动部署 #### network docker network create demo-network #### 部署mysql docker run -p 3306:3306 --net demo-network -e MYSQL_ROOT_PASSWORD=123456 -v /home/docker/mysql/mysql8/data:/var/lib/mysql:rw -v /home/docker/mysql/mysql8/log:/var/log/mysql:rw -v /home/docker/mysql/mysql8/conf/my.cnf:/etc/mysql/my.cnf:rw -v /etc/localtime:/etc/localtime:ro --name mysql8 --restart=always -d mysql:8.0.27 其中my.cnf的配置为: cat /home/docker/mysql/mysql8/conf/my.cnf ```in # Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # The MySQL Server configuration file. # # For explanations see # http://dev.mysql.com/doc/mysql/en/server-system-variables.html [client] default-character-set = utf8mb4 [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql # 限制导入导出文件目录的, 可自行搜索, 我暂时没有用到过, 下面这样表示不限制目录 secure-file-priv = character_set_server = utf8mb4 collation_server = utf8mb4_bin # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Custom config should go here !includedir /etc/mysql/conf.d/ # 这里是配置加密方式的 # 启动警告 'default_authentication_plugin' is deprecated and will be removed in a future release. Please use authentication_policy instead. default_authentication_plugin= mysql_native_password ``` 创建后端服务的数据表 ```bash (base) [root@c1 pv]# docker exec -it mysql8 /bin/sh # mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.27 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> CREATE DATABASE test CHARACTER SET utf8; mysql> CREATE TABLE user(id INT UNSIGNED AUTO_INCREMENT,name VARCHAR(25),age INT(8),sex VARCHAR(8),PRIMARY KEY ( `id` )); ``` #### 部署后端服务 docker run -p 666:666 --net demo-network -d --name demo_backend demo_backend:v1 #### 部署前端 docker run -p 80:80 --net demo-network -v /home/hpcadmin/wj/pv/vue-axios/nginx.conf:/etc/nginx/nginx.conf -d --name demo_web demo_web:v1 #### 测试 ![image-20230116151335233](https://gitee.com/null_640_4186/docker_demo/raw/master/images/image-20230116164135802.png) ## docker compose部署 1.编写docker-compose.yaml ``` version: "3.0" services: mysql8: # mysql服务 hostname: mysql8 container_name: mysql8 image: mysql:8.0.27 #command: --default-authentication-plugin=mysql_native_password #解决外部无法访问 ports: - "3306:3306" #容器端口映射到宿主机的端口 environment: MYSQL_ROOT_PASSWORD: '123456' MYSQL_ALLOW_EMPTY_PASSWORD: 'no' MYSQL_DATABASE: 'test' MYSQL_USER: 'root' MYSQL_PASSWORD: '123456' volumes: - /home/docker/mysql/mysql8/data:/var/lib/mysql - /home/docker/mysql/mysql8/log:/var/log/mysql #- /home/docker/mysql/mysql8/conf/my.cnf:/etc/mysql/my.cnf - mysql_conf:/etc/mysql - /etc/localtime:/etc/localtime networks: - compose-network demo_web: #自己单独的springboot项目 image: demo_web:v1 container_name: demo_web hostname: demo_web build: ./ #需要构建的Dockerfile文件 ports: - "80:80" #容器端口映射到宿主机的端口 depends_on: #web服务依赖mysql服务,要等mysql服务先启动 - demo_backend volumes: - /home/hpcadmin/wj/pv/vue-axios/nginx.conf:/etc/nginx/nginx.conf # - nginx_log:/var/log/nginx #- /home/hpcadmin/wj/pv/vue-axios/logs:/var/log/nginx networks: - compose-network demo_backend: #自己单独的springboot项目 image: demo_backend:v1 container_name: demo_backend hostname: demo_backend build: ./ #需要构建的Dockerfile文件 ports: - "666:666" #容器端口映射到宿主机的端口 depends_on: #web服务依赖mysql服务,要等mysql服务先启动 - mysql8 networks: - compose-network networks: ## 定义服务的桥 compose-network: driver: bridge volumes: mysql_conf: ``` 2. 启动容器 ```sh (base) [root@c1 docker_demo]# docker-compose up [+] Running 2/2 ⠿ Container demo_backend Created 0.1s ⠿ Container demo_web Created 0.0s Attaching to demo_backend, demo_web, mysql8 mysql8 | 2023-01-16 21:14:07-05:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started. mysql8 | 2023-01-16 21:14:08-05:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' mysql8 | 2023-01-16 21:14:08-05:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started. mysql8 | 2023-01-17T02:14:08.477703Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.27) starting as process 1 mysql8 | 2023-01-17T02:14:08.497209Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. mysql8 | 2023-01-17T02:14:08.975773Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. mysql8 | 2023-01-17T02:14:09.358644Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main mysql8 | 2023-01-17T02:14:09.358706Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main mysql8 | 2023-01-17T02:14:09.363917Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. mysql8 | 2023-01-17T02:14:09.364015Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. mysql8 | 2023-01-17T02:14:09.368320Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. mysql8 | 2023-01-17T02:14:09.441041Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock mysql8 | 2023-01-17T02:14:09.441125Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.27' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL. demo_backend | * Serving Flask app 'app' demo_backend | * Debug mode: on demo_backend | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. demo_backend | * Running on all addresses (0.0.0.0) demo_backend | * Running on http://127.0.0.1:666 demo_backend | * Running on http://172.27.0.3:666 demo_backend | Press CTRL+C to quit demo_backend | * Restarting with stat demo_backend | * Debugger is active! demo_backend | * Debugger PIN: 876-661-530 ``` 3. 测试 ![image-20230117101541308](https://gitee.com/null_640_4186/docker_demo/raw/master/images/image-20230116164135802.png)