Docker是什么?
Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源
- 可以让开发者,将应用及其依赖包打包一个轻量级、可移植的容器,然后发布到任何Linux机器上。容器是沙盒机制,相互不会有任何接口
- 基于Linux的高效、敏捷、轻量级的容器(虚拟化)方案。操作系统级的虚拟化技术
- 一致的运行环境,
Docker架构
- 镜像:面向容器的只读模板
- 容器:镜像的运行实例。是单独运行的应用,和和镜像的关系,类似于面向对象的类和实例。镜像是静态的定义,容器是镜像运行的实体。
- 仓库:用来存储镜像的服务器
部署前后端分离系统
- 前端工程化-react
- 后端-node
- 数据库-mongo
- nginx
- 静态服务:把前端打包的静态页面运行起来
- 反向代理:把node提供的接口整合起来
Docker安装
更新 apt 包索引。
sudo apt-get update
安装 apt 依赖包,用于通过HTTPS来获取仓库:
sudo apt-get install
apt-transport-https
ca-certificates
curl
gnupg-agent
software-properties-common
添加 Docker 的官方 GPG 密钥:
curl -fsSL mirrors.ustc.edu.cn/docker-ce/l… | sudo apt-key add -
设置稳定版仓库
sudo add-apt-repository
"deb [arch=amd64] mirrors.ustc.edu.cn/docker-ce/l…
$(lsb_release -cs)
stable"
安装 Docker CE
sudo apt-get update
sudo apt-get install docker-ce
测试 Docker 是否安装成功
sudo docker run hello-world
docker测试
镜像加速
# /etc/docker/daemon.json
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com"
]
}
docker常用命令
// 拉取镜像
docker pull nginx
// 查看镜像
docker images nginx
// 查看运行进程
docker ps
docker ps -a
// 停止进程
docker stop CONTAINER ID
// 开始进程
docker start CONTAINER ID
// 删除一个或多个容器
docker rm CONTAINER ID
// 清除全部
docker system prune
将html快速部署到nginx服务器
// 创建html
echo 'hello docker 2022/0312' >> index.html
// -p 端口进行映射,将虚拟机的80端口映射到实体机的8000端口,nginx默认端口是80
// -v 绑定 将实体机的$PWD/www目录,映射到当前nginx默认的发布路径
// -d 后台运行
docker run -p 8000:80 -v $PWD/www:/usr/share/nginx/html -d nginx
在容器内查找刚才发布的html
docker内部是一台虚拟机,也是lniux服务器。docker exec
// 在容器 CONTAINER 中开启一个交互模式的终端
docker exec -it CONTAINER ID /bin/bash
以上述容器为例,查看发布的html是否在nginx服务的html目录下
定制nginx镜像
使用 docker build,创建一个 Dockerfile 文件,写一段html输出到docker主机的nginx默认地址
FROM nginx:latest
RUN echo '<span>this is new nginx-image</span>' > /usr/share/nginx/html/index.html
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。 FROM表示使用哪个镜像,RUN是在定制的镜像内部执行的指令
docker build -t nginx:textImage .
// -t:指定要创建的目标镜像名
// .:Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
docker run -p 8001:80 nginx:textImage
更新镜像,再次docker build
定制node镜像
创建一个node项目
npm init -y
npm i koa -s
FROM node:latest
// 将当前目录添加到/app/
ADD . /app/
// 相当于cd ...
WORKDIR /app
RUN npm install
// 暴露端口
EXPOSE 3000
CMD ["node", "app.js"]
同上定制镜像:docker build -t nodeimage . 开启镜像容器:docker run -p 3000:3000 -d nodeimage
定制pm2镜像
PM2是一个进程守护的程序,管理并保持应用程序在线。可以同时启动多个服务
// process.yml
// 执行文件、进程数,设置环境。注意空格
apps:
- script : app.js
insecure: 2
watch: true
env :
NODE_ENV: production
- script : server.js
insecure: 2
watch: true
env :
NODE_ENV: production
// 启动服务
pm2-runtime start process.yml
// 后台启动
pm2 start process.yml
pm2 stop process.yml
// Dockerfile
FROM keymetrics/pm2:latest-alpine
WORKDIR /usr/src/app
ADD . /usr/src/app
RUN npm config set registry https://registry.npm.taobao.org/ && \
npm i
CMD ["pm2-runtime", "start", "process.yml"]
docker只做镜像
docker build -t pm2image .
测试镜像
docker run -p 3001:3000 -d pm2image
docker-compose
- 用于定义和运行多容器 Docker 应用程序的工具
- 定义 Dockerfile 文件,使用 docker build、docker run 等命令操作容器
部署一个镜像
// docker-compose.yml
services:
hello:
image: nginx:tt
ports:
- 3004:80
docker-compose up 访问3004端口,页面显示之前定制的nginx镜像
多个镜像
// docker-compose.yml
version: '3.1'
services:
mongo:
image: mongo
restart: always
ports:
- 27017:27017
mongo-express:
image: mongo-express
restart: always
ports:
- 7000:8081
// version指定本 yml 依从的 compose 哪个版本制定的。
// restart宕机后是否会重启
docker-compose up
两个服务两种颜色