拿到一个全新的阿里云服务器后,使用ssh进入服务器,执行以下步骤
1、apt升级
sudo apt-get update
2、添加相关软件包
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
3、下载软件包的合法性,需要添加软件源的 GPG 秘钥
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
4、source.list 中添加 Docker 软件源
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
5、安装 Docker CE
sudo apt-get update sudo apt-get install docker-ce
6、启动 Docker CE
# 添加docker服务 sudo systemctl enable docker # 启动docker sudo systemctl start docker
7、建立 docker 用户组(附加、可以不用)
# root权限比较高 # 如果是个人服务器,只需要用root的话,这一步可以跳过 sudo groupadd docker sudo usermod -aG docker $USER
8、 Helloworld 测试
docker run hello-world
9、镜像加速
# 加入微软云和七牛云 # 进入daemon.json文件,进行编辑 vi /etc/docker/daemon.json # 将以下内容弄进去 { "registry-mirrors": [ "https://dockerhub.azk8s.cn", "https://reg-mirror.qiniu.com" ] } # 重启docker服务,让它生效 sudo systemctl daemon-reload sudo systemctl restart docker
安装一个简单的 Nginx 服务
以下步骤在docker安装完成之后
1、拉取官方镜像 - 面向docker的只读模板
docker pull nginx
# 安装完成后,查看安装结果
docker images nginx
2、创建一个页面,把它发布出去
mkdir www # 建立一个网页 echo 'Hello docker!!!' >> www/index.html # 查看一下 cat www/index.html # -p代表端口映射 # 把它发布在我们服务器的8000端口上(注意:这里需要将阿里云服务器的8000端口入方向打开,阿里云服务器的8000端口默认是关闭的) # 映射到nginx的80端口 # 因为nginx默认的服务是80端口 # /usr/share/nginx/html 这个是nginx的默认目录 docker run -p 8000:80 -v $PWD/www:/usr/share/nginx/html nginx # 测试一下,在本机浏览器输入以下网址 http://00.00.00.00(IP地址):8000 # 会显示 “Hello docker!!!” 就代表成功 # 这种情况实际上是用命令行来启动,如果我们想让他后台执行的话(实际上就是后台模式) docker run -p 8000:80 -v $PWD/www:/usr/share/nginx/html -d nginx # 会返回一个UUID # 查看docker进程 docker ps # 如果我们想停止这个服务的话,只需要打前三位 # 例如:其中c99是UUID的前三位 docker stop c99 # 如果想重新启动 docker start c99 #如果在停止的情况下,使用docker ps查询不到,因为它没有被允许,此时可以用以下命令来查询所有 docker ps -a
3、如果想进入docker内部(docker实际上是一台linux服务器),进入伪终端
docker exec -it c99 /bin/bash # 此时已经进来了,可以确认一下刚刚的网页 cd /usr/share/nginx/html cat index.html # 可以看到 Hello docker !!! # 退出 exit
4、删除这个docker镜像
docker rm c99
Dockerfile定制镜像(定制一个nginx镜像)
镜像的定制实际上就是定制每一层所添加的配置、文件。
如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,
用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。
这个脚本就是 Dockerfile
1、配置Dockerfile文件
cd source/docker mkdir nginx cd nginx # 定制镜像的描述文件 vi Dockerfile # 将以下内容弄进 Dockerfile文件 FROM nginx:latest RUN echo '<h1>Hello Dockerfile !!!</h1>' > /usr/share/nginx/html/index.html
2、定制镜像
# 在 /source/docker/nginx 下
# 定制nginx的版本为 mynginx
# . 的意思是,我的镜像定制文件(Dockerfile)在当前目录下
docker build -t nginx:mynginx .
3、试验一下是否成功
docker run -p 8000:80 nginx:mynginx # 在本机访问 http://00.00.00.00(IP地址):8000 # 可以看到内容,就表示成功
定制一个NodeJS镜像(需要先在服务器上安装node)
安装nodejs过程如下
# 在 /root 下新建nodejs文件夹(这里可以按照自己配置的路径) mkdir nodejs # 官网下载 wget https://nodejs.org/dist/v12.10.0/node-v12.10.0-linux-x64.tar.xz
# 如果官网下载报错:wget:unable to resolv host address
# 可以尝试进行下列操作
vi /etc/resolv.conf
# 添加下列代码
nameserver 8.8.8.8 #google https://nodejs.org
# 解压 tar xf node-v12.10.0-linux-x64.tar.xz # 输入以下命令(注意,/root/nodejs 换成你自己官网下载node的解压路径,我这里是在 /root/nodejs 解压的) ln -s /root/nodejs/node-v12.10.0-linux-x64/bin/node /usr/local/bin/node ln -s /root/nodejs/node-v12.10.0-linux-x64/bin/npm /usr/local/bin/npm
# 测试
node -v
输出: v12.10.0
npm -v
输出: 6.10.3
代表nodejs安装成功
下面接着定制NodeJS镜像
进入 /source/docker 目录
mkdir node cd node # 先初始化一个npm的项目 npm init -y # 加一个包 npm i koa -S # 看一下 cat package.json # 写一个最简单的程序 vi app.js # 将下面代码弄进 app.js 文件 const Koa = require('koa') const app = new Koa() app.use(ctx => { ctx.body = 'Hello NodeJS !!!' }) app.listen(3000, () => { console.log('app started at 3000') }) # 定制Dockerfile vi Dockerfile # 将下面代码弄进 Dockerfile 文件 # 这个实际上是一个经典linux系统的node10版本 # 把宿主机上当前目录添加到app目录下 # WORKDIR 相当于进入app目录 FROM node:10-alpine ADD . /app/ WORKDIR /app RUN npm install EXPOSE 3000 CMD ["node", "app.js"]
试一下定制镜像是否成功
docker build -t mynode .
试一下运行效果
docker run -p 3000:3000 mynode # 这里如果不行,可能是原来的没有关闭掉 # 使用 docker ps 命令查看 # 使用 docker stop 307 命令关闭,其中 307 是uuid 的前三位
在本机访问 http://0.0.0.0(服务器ip):3000 可以看到运行效果
定制PM2镜像
在node使用的时候,很少用node直接去运行,一般会使用PM2这样一个进程守护的程序
通过这样一个程序去运行node
PM2:利用多核资源
node程序
# 将上面的node程序拷贝过来 cd source/docker cp -R node pm2 cd pm2
1、pm2运行的时候,我们一般使用process.yml 文件来描述它的运行过程
vi process.yml # 将下面代码弄进 process.yml文件(这里注意,script 等前面是两个空格,NODE_ENV前面是四个空格) apps: script: app.js instances: 2 watch: true env: NODE_ENV: production
2、然后我们编辑Dockerfile文件
vi Dockerfile # 用下面的代码覆盖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 EXPOSE 3000 CMD ["pm2-runtime", "start", "process.yml"]
3、试验一下是否成功
docker build -t mypm2 . docker run -p 3000:3000 -d mypm2 # 然后在本机访问 http://0.0.0.0(IP地址):3000 # 可以看到 Hello NodeJS !!! 的话,就代表成功
# 会返回一个UUID:假设为 bc8896214hkjnduu......
# 关掉
docker stop bc8
Compose安装
apt install docker-compose # 试验一下是否安装成功 mkdir helloworld vi docker-compose.yml # 将下面代码弄进去 version: '3.1' services: hello-world: image: hello-world # 启动 docker-compose up # 如果能打印出日志,说明没有问题,安装完毕
简介:Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
一句话概括:如果好几个Docker想一起工作,就用 Compose
下面来安装MongoDB以及MongoDB-express(数据库可视化工具,在浏览器上显示)
cd source/docker mkdir mongo cd mongo vi docker-compose.yml #将下面代码弄进去 version: '3.1' services: mongo: image: mongo restart: always ports: - 27017:27017 mongo-express: image: mongo-express restart: always ports: - 8000:8081 # 启动 docker-compose up
# 如果想后端启动
docker-compose up -d
# 如果HTTP超时的话,可以设置超时时间(可能因为服务器比较慢导致)
COMPOSE_HTTP_TIMEOUT=200 docker-compose up -d
# 在本机访问 http://0.0.0.0(IP地址):8000 就可以看到页面(需要在阿里云配置开启外部访问8000端口)
使用docker来部署一个前后端分离的项目
这里使用夏老师的 docker_cli 项目 :后端使用的nodejs,前端使用的是taro,使用mongodb数据库
https://github.com/su37josephxia/docker_ci
需要的效果:本地修改代码,可以随时同步的服务器上面去
使用vscode的 Deploy 插件
首先建立一个.vscode文件夹(夏老师的项目里面已经建过了)
里面新建 settings.json 文件
// files: **/* 代表所有的文件 // exclude: 把里面的东西例外出去 // deployOnSave:如果选 true ,每次保存文件都会自动进行同步 // targets 部署到什么地方 // name: 随便写 // dir: 传到服务器的什么目录下 // host:服务器地址 // privateKey: 私钥,登录需要的私钥地址 { "deploy":{ "packages": [{ "files": [ "**/*" ], "exclude": [ "node_modules/**", ".git/**", ".vscode/**", "**/node_modules/**" ], "deployOnSave": false }], "targets": [{ "type": "sftp", "name": "AliyunServer", "dir": "/root/source/docker_cli", "host": "00.00.00.00", "port": 22, "user": "root", "privateKey": "/User/xia/.ssh/id_rsa" }] } }
下载好项目后,在 docker_cli 目录新建一个文件夹: nginx
在nginx中新建一个文件夹:conf.d
在conf.d中新建一个文件:docker.conf
server { listen 80; location / { root /var/www/html index index.html index.htm; } location ~ .(gif|jpg|png)$ { root /static; index index.html index.htm; } }
右键 docker.conf 文件,选择 Deploy
在服务器查看
cd /source/docker_cli cat nginx/conf.d/docker.conf # 如果里面有内容,则说明上传成功
接着在项目的根目录下,建立一个文件:docker-compose.yml
version: '3.1' services: nginx: restart: always image: nginx ports: - 8091:80 volumes: - ./nginx/conf.d/:/etc/nginx/conf.d - ./frontend/dist:/var/www/html/ - ./static/:/statoc/
然后将此文件 Deploy 一下
然后在服务器中
/source/docker_cli 下
执行命令:docker-compose up
然后在本机访问:http://0.0.0.0(IP地址):8091 (阿里云默认是不打开8091端口的,需要在阿里云设置一下)
可以访问到前端页面
下面配一下后端
在项目的 backend 文件夹下新建一个文件:process.yml
apps: - script: server.js instances: 2 watch: true env: NODE_ENV: production
在 backend文件夹下新增一个文件: .dockerignore
node_modules
在 backend文件夹下新增一个文件: 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 EXPOSE 3000 # pm2在docker中使用命令为 pm2-docker CMD ["pm2-runtime", "start", "process.yml"]
修改backend/models文件夹下 conf.js 文件
本来为:
module.exports = { url: "mongodb://localhost:27017", dbName: 'taro' }
改为:
// mongo 是一个域名:在docker内部使用的一个域的域名 module.exports = { url: "mongodb://mongo:27017", dbName: 'taro' }
接下来在nginx上进行反向代理
修改 nginx/conf.d/docker.conf 文件
server { listen 80; location / { root /var/www/html index index.html index.htm; } location ~ .(gif|jpg|png)$ { root /static; index index.html index.htm; } location /api { proxy_pass http://app-pm2:3000 proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
修改 docker-compose.yml 文件
version: '3.1' services: app-pm2: container_name: app-pm2 # 构建容器 build: ./backend ports: - "3000:3000" mongo: image: mongo restart: always ports: - 27017:27017
然后将 backend nginx docker-compose.yml 这三个文件都Deploy一下
在服务器中 /source/docker_cli 下,将服务关掉
docker-compose down
看一下有没有同步过来
cat docker-compose.yml
cat backend/Dockerfile
cat nginx/conf.d/docker.conf
运行一下
docker-compose up
在本机访问 http://0.0.0.0:8091
可以看到页面就代表成功