使用dcoker部署
从零开始 在腾讯云服务器上使用docker 搭建 vue+django+msyql项目(超详细_腾讯云服务器建一个docker数据库镜像用django链接-CSDN博客
网站
- docker.com
- hub.docker.com下载镜像
安装docker
无脑按照菜鸟教程手动安装,安装,配合b站小马视频观看
常用命令
# 查看镜像
sudo docker images
# 删除镜像
#(注意!!!,未在运行的容器使用了镜像,也会导致该镜像不能被删除)
sudo docker rmi
# 查看容器
sudo docker ps
sudo docker ps -a #可查看过往容器启动历史
# 停止容器
sudo docker stop 容器id
# 删除容器
sudo docker rm 容器id
# 进入容器
sudo docker exec -it id /bin/bash
# 退出容器
exit
# 打包为镜像
sudo docker build -t 取的名字:版本 .
# 运行映射端口
sudo docker run -it -d -p 4080(外部访问):4081(内部对应端口) 取的名字:版本
# 查看日志
# 通过这个指令,相当于可以看到控制台,比如django运行起来成功或者失败的信息都会打印
sudo docker logs 容器名称
# 访问网址
sudo curl 地址 #就可查看是否能够访问
#挂在nginx日志
sudo docker run -it -d -p 9090:80 -v /home/nginx/logs:/var/log/nginx viot_vue
使用docker部署mysql
使用云服务器,记得要在网页上开通端口,否则是访问不了的
- docker hub 下载想要的mysql版本镜像
- 直接运行容器映射端口
sudo docker run -it -d -p 3306(外部):3307(内部) -e MYSQL_ROOT_PASSWORD=your_password mysql:8.2.0
# 注意内部mysql一定要是3306,否则无法连接成功
sudo docker run -it -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
服务器内部直接访问mysql
# 进入容器
sudo docker exec -it e95c0d2996f6 /bin/bash
# 登录
mysql -u 用户名 -p
无法连接到数据库 数据库可能有自己的端口,此时我们不能使用localhost或者映射的端口去访问数据库,可利用下面的命令进行查看
root@edgex:~/viottool/java# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' bb7f0759b027
172.17.0.3
docker部署django
- 记得改setting,数据库改成部署好的,debug改成false,allowed记得设置允许的请求来源
- 编写依赖需求文件requirements.txt,可以在当前项目下运行
pip freeze > requirements.txt
(用这个命令会导出很多),可能需要手动删除一些,不然到时候下载会报错的
- 编写Dockerfile文件(这是我自己写的一个)
```
# 使用官方的 Python 镜像作为基础镜像
FROM python:3.8.3
# 设置工作目录
WORKDIR /app
# 将本地的 requirements.txt 文件复制到容器中
COPY requirements.txt .
# 安装应用所需的依赖包
RUN pip install --no-cache-dir -r requirements.txt
# 将当前目录下的所有文件复制到容器的 /app 目录中
COPY . .
# 设置环境变量
ENV PORT=4080
# 运行 Django 应用
CMD ["python", "manage.py", "runserver", "0.0.0.0:4080"]
```
- 打包为镜像
sudo docker build -t 取的名字:版本 .
- 运行映射
sudo docker run -it -d -p 4080:4081 取的名字:版本
Dockerfile
- FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
- RUN:用于执行后面跟着的命令行命令。
# 运行多个命令
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
- CMD: 运行程序的命令
nginx文件参考
nginx.conf
worker_processes 2;
worker_cpu_affinity auto;
worker_rlimit_nofile 1024;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
http {
server_names_hash_bucket_size 128;
include mime.types;
default_type application/octet-stream;
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
access_log off;
error_log error.log crit;
keepalive_timeout 65;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_body_buffer_size 10m;
client_max_body_size 100m;
open_file_cache max=100000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 6;
gzip_http_version 1.0;
gzip_min_length 1000;
gzip_proxied any;
gzip_vary on;
gzip_types
text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
text/javascript application/javascript application/x-javascript
text/x-json application/json application/x-web-app-manifest+json
text/css text/plain text/x-component
font/opentype application/x-font-ttf application/vnd.ms-fontobject
image/x-icon;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
server {
listen 80;
server_name localhost;
add_header Content-Security-Policy "default-src *;style-src 'self' 'unsafe-inline';script-src 'self' 'unsafe-inline' 'unsafe-eval';img-src * data:;worker-src * blob:;font-src 'self' data:;";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header 'Referrer-Policy' 'origin';
location ~ \.(lha|gz|ace|lzh|tar|arj|zip|tar.gz|rar|arj)$ {
deny all;
}
location / {
root /home/ui;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /api {
proxy_pass http://10.219.196.46:9095;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /rest {
proxy_pass http://localhost:9095;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ^~ /gateway/ {
proxy_pass http://localhost:9095;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ^~ /gw/ {
proxy_pass http://localhost:9095;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
Dockerfile
# 基础镜像
FROM nginx
# author
MAINTAINER hong
# 挂载目录
VOLUME /home/ui
# 创建目录
RUN mkdir -p /home/ui
# 指定路径
WORKDIR /home/ui
# 复制conf文件到路径
COPY ./nginx.conf /etc/nginx/nginx.conf
# 复制html文件到路径
COPY ./dist /home/ui
Compose
version: "3.8" # 使用的 Docker Compose 版本
services: # 定义各个服务
redis: # Redis 服务配置
image: redis:alpine # 使用的镜像
ports:
- "6379" # 映射 Redis 默认端口(6379)
networks:
- frontend # 连接到 frontend 网络
deploy: # 部署相关配置
replicas: 2 # 创建 2 个副本
update_config:
parallelism: 2 # 并行更新 2 个副本
delay: 10s # 延迟 10 秒进行更新
restart_policy:
condition: on-failure # 失败时重启容器
db: # PostgreSQL 数据库服务配置
image: postgres:9.4 # 使用的镜像
volumes:
- db-data:/var/lib/postgresql/data # 挂载数据卷用于持久化数据库数据
networks:
- backend # 连接到 backend 网络
deploy: # 部署相关配置
placement:
constraints:
- "node.role==manager" # 将容器部署到拥有 manager 角色的节点上
vote: # 投票应用服务配置
image: dockersamples/examplevotingapp_vote:before # 使用的镜像
ports:
- "5000:80" # 映射端口,将容器内的 80 端口映射到主机的 5000 端口
networks:
- frontend # 连接到 frontend 网络
depends_on:
- redis # 在 Redis 启动之后再启动该服务
deploy:
replicas: 2 # 创建 2 个副本
update_config:
parallelism: 2 # 并行更新 2 个副本
restart_policy:
condition: on-failure # 失败时重启容器
result: # 投票结果应用服务配置
image: dockersamples/examplevotingapp_result:before # 使用的镜像
ports:
- "5001:80" # 映射端口,将容器内的 80 端口映射到主机的 5001 端口
networks:
- backend # 连接到 backend 网络
depends_on:
- db # 在数据库服务启动之后再启动该服务
deploy: # 部署相关配置
replicas: 1 # 创建 1 个副本
update_config:
parallelism: 2 # 并行更新 2 个副本
delay: 10s # 延迟 10 秒进行更新
restart_policy:
condition: on-failure # 失败时重启容器
worker: # 工作节点服务配置
image: dockersamples/examplevotingapp_worker # 使用的镜像
networks:
- frontend # 连接到 frontend 网络
- backend # 连接到 backend 网络
deploy: # 部署相关配置
mode: replicated # 复制模式部署
replicas: 1 # 创建 1 个副本
labels: [APP=VOTING] # 标签为 APP=VOTING
restart_policy:
condition: on-failure # 失败时重启容器
delay: 10s # 延迟 10 秒进行重启
max_attempts: 3 # 最大重试次数为 3 次
window: 120s # 在 120 秒的窗口期内
visualizer: # 可视化容器服务配置
image: dockersamples/visualizer:stable # 使用的镜像
ports:
- "8080:8080" # 映射端口,将容器内的 8080 端口映射到主机的 8080 端口
stop_grace_period: 1m30s # 容器停止的优雅期限为 1 分 30 秒
volumes:
- "/var/run/docker.sock:/var/run/docker.sock" # 挂载 Docker 守护进程的 Unix 套接字
deploy: # 部署相关配置
placement:
constraints:
- "node.role==manager" # 将容器部署到拥有 manager 角色的节点上
networks: # 定义网络
frontend:
backend:
volumes: # 定义卷
db-data: