likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 12

从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并使用阿里云的镜像源,可以按照以下步骤进行操作:

  1. 更新系统:

sudo yum update
  1. 卸载旧版本的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
# 在文件中写入以以下内容,<your-accelerator-url> 替换为阿里云提供的加速器地址
json
{
  "registry-mirrors": ["<your-accelerator-url>"]
}

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、镜像命令

  1. 查看系统里的镜像(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、容器命令

  1. 启动容器(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、其他命令

  1. 查看镜像或容器中进程的信息
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="赵文超 <15013371705@163.com>"
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、下载安装

  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、常用命令

  1. 启动服务
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

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

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的时候没有则自动生成)

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

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

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

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的文件夹内执行才会生效

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

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

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

九、结语

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

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