什么是Docker?
Docker是一款可以将应用程序与基础设施分离、代码及其所有依赖项打包,使应用程序能够从一个计算环境快速可靠地运行到另一个计算环境,达到快速交付、测试、部署的容器化技术
为什么要用Docker?
物理机时代:
成本高 - 需要购买一台实体机器,没办法共享
部署慢 - 发布一个应用需要走漫长的流程
资源浪费 - 平时应用实际用不到那么多物理资源,除了搞活动时期,大部分时候处于闲置状态,还有一部分资源被操作系统运行程序占用
硬件限制 - 不同硬件厂商有兼容问题
不利于迁移扩展 - 如果想迁移到其他服务器上,需要重头打包配置应用依赖
虚拟化时代:
资源利用率低 - 操作系统占用了一部分资源
移植性差 - 虚拟机上的应用对操作系统有较大依赖
启动速度慢 - 每次运行一个虚拟机上的应用都需要先启动系统
部署麻烦 - 如果从开发环境切换到测试和生产环境,仍然需要重新搭建应用相关依赖
容器化时代:
启动速度更快: 秒级启动。
快速的部署和交付: 开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后, 运维人员可以直接使用这个容器来部署代码。
更高效的虚拟化: 它是内核级的虚拟化,因此可以实现更高的性能和效率。
高效的迁移: Docker可以运行在不同的平台,用户可以轻松的将一个应用从一个平台迁移到另一个平台。
节省开支: Docker容器除了运行其中应用外,基本不消耗额外的系统资源,一台设备可以运行上千个容器。
资源隔离:可以对Docker进行资源限制,每个容器可以享用自己的物理资源,互不干扰
重要概念:镜像、容器
镜像:可以理解为软件安装包,可以方便的进行传播和安装。
容器:软件安装后的状态,每个软件运行环境都是独立的、隔离的,称之为容器。
安装
桌面版:https://www.docker.com/products/docker-desktop
服务器版:https://docs.docker.com/engine/install/#server
安装docker教程省略
docker 构建开发环境
使用dockerFile文件创建镜像
FROM node:12.22-slim
RUN apt-get update && apt-get install -y curl && apt-get install -y vim && apt-get install -y git
RUN npm install -g nrm
RUN npm install -g browser-sync
RUN npm install -g mp-cli-lc
RUN npm install -g wlg-cli-temp
ENV CHOKIDAR_USEPOLLING=true
COPY . ./project
WORKDIR /project
编译 docker build -t ff-env .
-t 设置镜像名字和版本号
运行 docker run -p 8080:8080 --name test-ff-env ff-env
-p 映射容器内端口到宿主机
--name 容器名字
-d 后台运行
运行容器之后验证环境是否安装成功,如图
docker命令
docker ps 查看当前运行中的容器
docker images 查看镜像列表
docker rm container-id 删除指定 id 的容器
docker stop/start container-id 停止/启动指定 id 的容器
docker rmi image-id 删除指定 id 的镜像
docker volume ls 查看 volume 列表
docker network ls 查看网络列表
发布镜像
官网注册账号
- 登录账号:docker login -u username
- 新建一个tag,名字必须跟你注册账号一样docker tag ff-env username/ff-env
- 推送docker
docker push username/ff-env - 运行
docker container run --name test-ff-env -it username/ff-env /bin/bash
目录挂载
如果只是使用 Docker 运行后,我们改了项目代码不会立刻生效,需要重新build和run,很是麻烦。
容器里面产生的数据,例如 log 文件,数据库备份文件,容器删除后就丢失了。
几种挂载方式
-
bind mount
直接把宿主机目录映射到容器内,适合挂代码目录和配置文件。可挂到多个容器上 -
volume
由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效,Linux 文件系统,适合存储数据库数据。可挂到多个容器上 -
tmpfs mount
适合存储临时文件,存宿主机内存中。不可多容器共享。
文档参考:https://docs.docker.com/storage/
挂载演示
bind mount
方式用绝对路径 -v D:/code:/app
volume
方式,只需要一个名字 -v db-data:/app
示例:
docker container run -v “/Users/fangfei/Desktop/项目/onLineProject:/project" -p 3000:9528 -it ff-env /bin/bash
Docker nginx 配置
安装命令:
docker pull nginx
sudo docker run --name nginx-test -p 8081:80 -d nginx
进入容器内部看看
docker exec -it e887f89973d8 bash
# e887f89973d8 为容器id
查看容器id
docker ps
退出容器
exit
映射docker-nginx目录到本地:
原因:虽然咱们能正常启动nginx,但配置得在容器中进行,这样的话太麻烦了,所以把配置文件给映射出来,方便配置与管理
第一步 本地创建管理目录
命令:
mkdir -p ff-docker/nginx
mkdir -p ff-docker/nginx/www
mkdir -p ff-docker/nginx/conf
mkdir -p ff-docker/nginx/logs
第二步 将容器中的相应文件copy到刚创建的管理目录中
docker cp 8a6ca66ba013:/etc/nginx/nginx.conf ff-docker/nginx/
docker cp 8a6ca66ba013:/etc/nginx/conf.d ff-docker/nginx/conf/
docker cp 8a6ca66ba013:/usr/share/nginx/html/ ff-docker/nginx/www/
docker cp 8a6ca66ba013:/var/log/nginx/ ff-docker/nginx/logs/
注:docker cp 8a6 中的 "8a6ca66ba013" 为容器ID前缀,只要唯一就好了
第三步 停止并移除容器
命令:
停止容器:docker stop 8a6ca66ba013
移除容器:docker rm 8a6ca66ba013
第四步 再次启动容器并作目录挂载(也相当于共享)
命令:
docker run -v "/Users/fangfei/ff-docker/nginx/www/html/:/usr/share/nginx/html" -v "/Users/fangfei/ff-docker/nginx/nginx.conf:/etc/nginx/nginx.conf" -v "/Users/fangfei/ff-docker/nginx/logs/nginx/:/var/log/nginx" -v "/Users/fangfei/ff-docker/nginx/conf/conf.d/:/etc/nginx/conf.d" --name nginx -p 8088:80 -d nginx
注: 地址必须是绝对地址,映射的路径必须到最后文件目录
docke 配置jenkins
这里找到一份详细的[教程]可以参考(https://juejin.cn/post/6967243012199940110#heading-14)
注:如果部署服务器在本地,可以使用docker启动jenkins,将本地地址映射到jenkins中,在将地址映射到nginx部署,这样就可以实现。可以使用Docker Compose