从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
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、镜像命令
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 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… 谢谢啦~🥗