docker学习使用

73 阅读7分钟

使用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记得设置允许的请求来源

image.png

  • 编写依赖需求文件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: