从Docker入门到使用Dockercompose一键部署整个网站项目(附整个项目源码)

2023年 7月 25日 40.6k 0

从Docker入门到使用Docker-compose一键部署整个网站项目

docker是最近几年非常火的部署项目工具,它在一致性、资源利用、扩展性上都有着不错的表现,很多公司都逐渐接受与使用docker,可以说未来不会docker的后端和运维很难就业;学习docker的使用需要一些linux的基础知识,推荐学习linux后再来学习~

项目源码地址

项目在线访问地址

因为这个开源项目还在开发当中,所以会存在些许bug,访问地址可能会因为个人的开发原因无法访问,敬请谅解~

一、Docker和容器概念

1-1、Docker是?

Docker是一个开源平台,通过将应用程序隔离到轻量级、可移植的容器中,自动化应用程序的部署、扩展和管理

1-2、容器是?

容器是一种轻量级、可移植和隔离的软件环境,允许开发人员在不同平台上运行和打包应用程序及其依赖项。它们有助于简化应用程序的开发、部署和管理过程,同时确保应用程序在不同基础架构下始终运行一致。

其实你可以把容器看作一个小软件,四五个小软件互相组合,组合成一个项目,然后其中的某些小软件可以复用,减少服务器的资源开销;

二、Docker安装与卸载

本人的linux使用的是centOS7.6;

2-1、安装

要在CentOS 7.6上安装Docker并使用阿里云的镜像源,可以按照以下步骤进行操作:

  • 更新系统:
  • 
    sudo yum update
    
  • 卸载旧版本的Docker(如果有):
  • sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
    

    3. 添加Docker的CE软件仓库:

    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    

    4. 安装Docker CE:

    sudo yum install docker-ce
    

    5. 启动Docker服务并将其设置为开机自启:

    sudo systemctl start docker
    sudo systemctl enable docker
    

    6. 配置Docker镜像源,使用阿里云提供的加速器:

    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    

    7. 创建或修改Docker配置文件 /etc/docker/daemon.json,如果文件不存在则创建:

    sudo nano /etc/docker/daemon.json
    # 在文件中写入以以下内容, 替换为阿里云提供的加速器地址
    json
    {
      "registry-mirrors": [""]
    }
    

    8. 重新启动Docker服务:

    sudo systemctl restart docker
    

    9. 查看docker是否安装成功:

    docker version
    

    10. 查看docker是否成功运行:

    systemctl status docker
    

    2-2、卸载

    卸载依赖:

     yum remove docker-ce docker-ce-cli containerd.io
    

    删除资源:

    rm -rf /var/lib/docker
    rm -rf /var/lib/containerd
    /var/lib/docker docker的默认工作路径
    

    三、Docker基本命令

    3-1、帮助命令

    docker version # 显示docker的版本信息  
    docker info # 显示docker的系统信息,包括镜像和容器的数量  
    docker 命令 —help # 帮助命令
    

    3-2、镜像命令

  • 查看系统里的镜像(docker images)
  • REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
    仓库源       镜像标签    镜像的id       创建时间       镜像的大小
    
      -a, --all             # 列出所有的镜像
          --digests        
      -f, --filter filter  
          --format string   
          --no-trunc       
      -q, --quiet          # 只显示镜像的id
    

    2. 搜索镜像(docker search)

    [root@iZwz9h9fhkcxrk3od8i2puZ /]# docker search mysql
    NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    mysql                           MySQL is a widely used, open-source relation…   14312     [OK]       
    mariadb                         MariaDB Server is a high performing open sou…   5464      [OK] 
    
    # 可选项,通过收藏来过率
    --filter=STARS=3000 搜索出来的镜像就是stars大于3000
    

    3. 下载镜像(docker pull 镜像名称)

     docker pull 镜像名[:tag]  # tag是下载的版本,如果不写版本,默认的就是latest最新版 
    #指定版本下载案例: docker pull mysql:5.7
    

    4. 删除(卸载)镜像(docker rmi)

    docker rmi 
    
    docker rmi -f 镜像id # 删除指定的镜像
    
    docker rmi -f 镜像id 镜像id 镜像id # 删除多个镜像(空格分隔)
    
    docker rmi -f $(docker images -aq) # 删除全部的镜像
    

    5. 删除所有的未被使用的镜像

    docker image prune -a --force
    

    6. 删除所有的未被使用的镜像的缓存文件

    docker builder prune
    

    3-3、容器命令

  • 启动容器(docker run)
  • docker ps # 列出所有运行的容器
     
    docker ps -a # 列出所有的容器 运行过的 历史的 所有 
    
    docker run nodejs  # 这个命令是 以 nodejs 镜像 启动 容器,容器没有 命名 ,随机生成名
    字
    docker run [可选参数] nodejs # 新建容器并启动
    
    -name=”name”  # 容器名字:用来区分容器
    
    -d  # 后台方式运行:相当于nohup
    
    -it # 使用交互式运行:进入容器查看内容
    
    -p # 指定容器的端口(四种方式)小写字母p
        -p # 主机端口:容器端口(常用)
        -p # ip:主机端口:容器端口
        -p # 容器端口
    
    -P # 随机指定端口,大写p
    

    2. 进入容器(docker run -it)

    docker run -it tomcat /bin/bash # 这个命令是 进去启动 并 进去 容器内部
    # 案例
    [root@iZwz9h9fhkcxrk3od8i2puZ /]# docker run -it centos /bin/bash
    [root@4aacb16f5545 /]# ^C # 这是进入容器
    

    3. 退出容器(exit)

    exit # 容器直接停止,并退出
    ctrl+d # 容器不停止,退出
    

    4. 删除容器(docker rm)

    docker rm 容器id # 删除容器(不能删除正在运行的容器)如果要强制删除:docker rm -f 容器id
    docker rm -f $(docker ps -aq) # 删除全部容器
    docker ps -a -q|xargs docker rm # 删除所有容器
    

    5. 启停容器

    docker start 容器id # 启动容器
    docker restart 容器id # 重启容器
    docker stop 容器id # 停止当前正在运行的容器
    docker kill 容器id # 强制停止当前容器
    

    6. 后台启动容器

    docker run -d 容器ID
    

    7. 查看日志

    docker logs -tf 625e6fabcdd5
    docker logs -tf —tail 10 625e6fabcdd5 十条最新的 日志
    

    8. 进入当前正在运行的容器

    # -it 交互模式执行
    docker exec -it 625e6fabcdd5 /bin/bash
    docker attach 625e6fabcdd5
    
    docker exec # 进入容器后开启一个新的终端,可以再里面操作(常用)
    docker attach # 进入容器正在执行的终端(就类似于vscode中不重新开启项目新的终端进入),
                  # 不会启动新的进程。
    

    3-4、其他命令

  • 查看镜像或容器中进程的信息
  • docker inspect 625e6fabcdd5(容器/镜像 id)
    

    2. 从容器内拷贝文件到主机

    docker cp 容器id:容器内路径 目的主机的路径
    
    docker cp 625e6fabcdd5:/home/test.js /home
    

    四、容器数据卷是什么

    容器数据卷就是设置容器内某个文件夹内的数据同步到主系统内,以后容器被删除了,也不会导致数据的丢失,也叫卷技术;

    4-1、使用数据卷

    # 在运行一个容器时,加上-v即可
    docker run -v 主机目录:容器内目录 镜像名
    
    # 测试,查看容器信息
    docker inspect 容器id  
    

    五、DockerFile

    dockerfile是用来构建docker镜像的文件!命令参数脚本!
    构建步骤:
    1、编写一个dockerfile文件
    2、docker build 构建成为一个镜像
    3、docker run运行镜像
    4、docker push发布镜像(DockerHub、阿里云镜像仓库!)

    5-1、基本命令

    FROM          # 基础镜像,一切从这里开始构建
    LABEL         # 镜像是谁写的:姓名+邮箱 LABEL maintainer="赵文超 "
    RUN           # 镜像构建的时候需要运行的命令
    ADD           # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
    WORKDIR       # 镜像的工作目录
    VOLUME        # 挂载的目录
    EXPOSE        # 暴露容器端口配置
    CMD           # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
    ENTRYPOINT    # 指定这个容器启动的时候要运行的命令,可以追加命令
    ONBUILD       # 当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令。触发指令。
    COPY          # 类似ADD,将我们文件拷贝到镜像中 COPY  
    ENV           # 构建的时候设置环境变量!
    

    5-2、案例

    # 此Dockerfile是构建一个nodejs环境的后台项目
    
    # 下载node14
    FROM node:14-alpine
    
    RUN mkdir -p /home/backend
    
    WORKDIR /home/backend
    
    # 复制Dockerfile文件相同路径下的所有文件到容器内部的/home/backend (一般是package.json、  
    # package-lock.json、dist等文件)
    COPY ./ /home/backend
    
    # 设置镜像源
    RUN npm config set registry https://registry.npm.taobao.org
    
    # 下载依赖项
    RUN npm install
    
    RUN npm install -g pm2
    
    ENV NPM_CONFIG_LOGLEVEL warn
    
    # 暴露端口,非常重要,不暴露端口,外部就无法访问容器内部;
    # 如果是 run 命令构建容器的化,暴露端口则是 -p 9000:9000
    EXPOSE 9000
    
    CMD ["pm2-runtime", "start", "ecosystem.config.js"]
    

    六、Docker网络

    我们每次启动一个docker容器,docker就会给容器分配一个ip,在后期多容器运行时,我们需要构建一个内部网络的ip,然后同一个项目内的所有容器都配置该ip进行互相连接;这部分我个人也不是很熟悉,如果想深入学习的同学可以看下面文章或者找资料;

    Docker容器间通信方法

    上面都是一些docker最基本的操作及尝试,仅仅是帮助你了解docker,方便后面的项目部署;docker的知识很多,系统性学习还是推荐去B站找相关视频~

    七、Docker compose

    7-1、下载安装

  • 安装依赖
  • sudo yum install -y curl
    

    2. 下载Docker Compose二进制文件

    sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    

    3. 添加执行权限

    sudo chmod +x /usr/local/bin/docker-compose
    

    4. 验证安装

    docker-compose --version
    

    7-2、常用命令

  • 启动服务
  • docker-compose up -d
    

    2. 停止服务

    docker-compose down
    

    3. 列出所有运行容器

    docker-compose ps
    

    4. 查看服务日志

    docker-compose logs
    

    5. 构建镜像

    docker-compose build
    

    6. 启动服务

    docker-compose start
    

    7. 停止已运行的服务

    docker-compose stop
    

    8. 重启服务

    docker-compose restart
    

    八、Docker-compose一键部署整个网站项目

    每个镜像创建容器后,都看下能否跑的起来,ps就是在运行,跑不起来就logs打印日志,解决错误;

    8-1、配置nginx镜像

    linux文件目录结构

    nginx在linux中的文件路径 /home/leno_admin/nginx

    Dockerfile 文件

    FROM nginx
    
    WORKDIR /home/frontend
    
    COPY react .
    
    COPY nginx.conf /etc/nginx/nginx.conf
    
    EXPOSE 8000
    

    nginx.conf 文件

    # 全局配置
    #user  nobody;
    worker_processes  1;
    
    # 最大连接数 
    events {
        worker_connections  1024;
    }
    
    # 服务
    http {
        # http全局配置 静态资源配置
        include       mime.types;
        default_type  application/octet-stream;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    
        # 负载均衡
        upstream leno_admin {
            # 服务器资源 weight 权重配置
           
            server backend:9000 weight=3;
            # server 127.0.0.1:9010 weight=1;
        }
    
        # 配置链接服务 可以配置多个server
        server {
            listen     8000;
            # server_name  localhost; # 开发环境
            server_name  120.79.243.62;  # docker
          
            # 可以根据路径走哪些文件 可以配置多个 
            # root 文件默认是从nginx根目录开始
            location / {
                # root  react; # 开发环境
                root  /home/frontend; # docker
                try_files $uri $uri/ /index.html;
                index index.html index.htm;
            }
    
            location /prod-api/ {
                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;
    	        proxy_set_header X-Forwarded-Proto $scheme;
    		proxy_set_header X-NginX-Proxy true;
             
                # 反向代理
                # 在docker compose中,都是通过服务名来进行项目的查找的
                proxy_pass http://leno_admin/;
            }
            
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
        }
    
    }
    

    8-2、配置mysql:8容器

    docker run --name mysql8 --restart=always --privileged=true -e MYSQL_ROOT_PASSWORD="your pwd" -v /home/leno_admin/mysql/logs:/logs -v /home/leno_admin/mysql/data:/var/lib/mysql -v /home/leno_admin/mysqlData/leno_admin.sql:/docker-entrypoint-initdb.d/leno_admin.sql -p 3306:3306 -d mysql
    
    • --restart=always:容器崩溃或退出后自动重新启动。
    • --privileged=true:启用容器的特权模式,允许容器内的进程拥有更高的权限。
    • -v /home/leno_admin/mysqlData/leno_admin.sql:/docker-entrypoint-initdb.d/leno_admin.sql 此为导入初始的数据库到容器内

    mysql在linux中的文件路径 /home/leno_admin/mysql (两个文件夹run的时候没有则自动生成)

    8-3、配置redis容器

    # 拉取 docker-hub 远程的redis 镜像
    docker pull redis
    
    # 启动容器,并且设置密码和容器奔溃自启动
    docker run -d --name redis --restart=always -p 6379:6379 redis redis-server --requirepass "your pwd"
    

    8-4、配置nodejs pm2容器(后端项目)

    FROM node:14-alpine # -alpine提供基础nodejs环境,减少包的体积
    
    RUN mkdir -p /home/backend
    
    WORKDIR /home/backend
    
    COPY ./ /home/backend
    
    # 设置镜像源
    RUN npm config set registry https://registry.npm.taobao.org
    
    RUN npm install
    
    RUN npm install -g pm2
    
    ENV NPM_CONFIG_LOGLEVEL warn
    
    EXPOSE 9000
    
    CMD ["pm2-runtime", "start", "ecosystem.config.js"]
    

    启动容器

    docker run -d -p 9000:9000 -v /home/leno_admin/app/logs:/home/backend/logs --name backend backend
    

    nodejs项目 在linux中的文件路径 /home/leno_admin/app

    8-5、将本地项目的镜像上传阿里云镜像仓库

    依次将你刚刚打包好的镜像推送到阿里云的镜像仓库,Docker Hub也可以,如果你不测试远程镜像仓库拉去镜像,可以跳过这个步骤,直接下一步,配置docker-compose.yml

    1、登录阿里云账号

    docker login --username=your username registry.cn-shenzhen.aliyuncs.com
    
    # 接下来输入密码
    

    2、推送镜像到阿里云仓库

    # 本地创建阿里云仓库镜像
    docker tag f372b9c031d4 registry.cn-shenzhen.aliyuncs.com/zwc-docker/leno_admin:backend-1.0
    
    # 上传到仓库
    docker push registry.cn-shenzhen.aliyuncs.com/zwc-docker/leno_admin:backend-1.0
    

    8-6、docker-compose.yml 文件配置

    需要注意的是,如果不用阿里云镜像仓库,你的image:后面就是你系统本机上的镜像名称;ports:是端口映射,必须配置;networks:容器间通信;environment:变量环境配置,比如配置密码等;volumes:数据卷,将一些你认为需要备份的文件信息同步到主机当中;

    version: "3"
    
    # 内部通用网络,其他的都需要配置
    networks:
      app-leno-admin-web:
        driver: bridge
    
    services:
      mysql:
        image: registry.cn-shenzhen.aliyuncs.com/zwc-docker/leno_admin:mysql-8.0
        ports:
          - 3306:3306
        command: --default-authentication-plugin=mysql_native_password
        restart: always
        networks:
          - app-leno-admin-web
        environment:
          - TZ=Asia/Guangzhou
          - MYSQL_ROOT_PASSWORD=your pwd
        volumes:
          - /home/leno_admin/mysql/data:/var/lib/mysql
          - /home/leno_admin/mysql/logs:/logs
    
      redis:
        image: registry.cn-shenzhen.aliyuncs.com/zwc-docker/leno_admin:redis-1.0
        ports:
          - 6379:6379
        networks:
          - app-leno-admin-web
        environment:
          - TZ=Asia/Guangzhou
    
      backend:
        image: registry.cn-shenzhen.aliyuncs.com/zwc-docker/leno_admin:backend-1.0
        ports:
          - 9000:9000
        depends_on:
          - mysql
          - redis
        networks:
          - app-leno-admin-web
        volumes:
          - /home/leno_admin/backend/logs:/home/backend/logs
    
      frontend:
        image: registry.cn-shenzhen.aliyuncs.com/zwc-docker/leno_admin:frontend-1.0
        ports:
          - 8000:8000
        networks:
          - app-leno-admin-web
        depends_on:
          - backend
    

    我用docker compose从阿里云镜像拉去镜像本地构建容器,此命令需要在有docker-compose.yml的文件夹内执行才会生效

    构建成功后,用docekr ps查看容器是否都在运行

    九、结语

    到此为止,我们就将nodejs项目成功上传到镜像仓库内,并且从仓库内拉取到linux系统中统一运行了,因为我个人是前端开发,后端也是只会nodejs,所以对docker的理解也是较浅,如果有什么错误还请见谅;

    最后,也希望大家能够给我的开源项目leno_admin点赞支持一下(gitee.com/zhao-wencha… 谢谢啦~🥗

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论