docker部署

311 阅读3分钟

Docker是什么?

Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源

  • 可以让开发者,将应用及其依赖包打包一个轻量级、可移植的容器,然后发布到任何Linux机器上。容器是沙盒机制,相互不会有任何接口
  • 基于Linux的高效、敏捷、轻量级的容器(虚拟化)方案。操作系统级的虚拟化技术
  • 一致的运行环境,

Docker架构

  1. 镜像:面向容器的只读模板
  2. 容器:镜像的运行实例。是单独运行的应用,和和镜像的关系,类似于面向对象的类和实例。镜像是静态的定义,容器是镜像运行的实体。
  3. 仓库:用来存储镜像的服务器

部署前后端分离系统

  • 前端工程化-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

image.png

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

image.png

在容器内查找刚才发布的html

docker内部是一台虚拟机,也是lniux服务器。docker exec

// 在容器 CONTAINER 中开启一个交互模式的终端
docker exec -it CONTAINER ID /bin/bash
以上述容器为例,查看发布的html是否在nginx服务的html目录下

image.png

定制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 的绝对路径

image.png

docker run -p 8001:80 nginx:textImage

image.png 更新镜像,再次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

image.png

定制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 image.png

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

image.png 两个服务两种颜色

image.png