一、apt升級html
sudo apt-get update
二、添加相關軟件包前端
sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
三、下載軟件包的合法性,須要添加軟件源的 GPG 祕鑰node
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
四、source.list 中添加 Docker 軟件源linux
sudo add-apt-repository \ "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \ $(lsb_release -cs) \ stable"
五、安裝 Docker CEnginx
sudo apt-get update sudo apt-get install docker-ce
六、啓動 Docker CEgit
# 添加docker服務 sudo systemctl enable docker # 啓動docker sudo systemctl start docker
七、創建 docker 用戶組(附加、能夠不用)github
# root權限比較高 # 若是是我的服務器,只須要用root的話,這一步能夠跳過 sudo groupadd docker sudo usermod -aG docker $USER
八、 Helloworld 測試mongodb
docker run hello-world
九、鏡像加速docker
# 加入微軟雲和七牛雲 # 進入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
如下步驟在docker安裝完成以後數據庫
一、拉取官方鏡像 - 面向docker的只讀模板
docker pull nginx
# 安裝完成後,查看安裝結果
docker images nginx
二、建立一個頁面,把它發佈出去
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
三、若是想進入docker內部(docker其實是一臺linux服務器),進入僞終端
docker exec -it c99 /bin/bash # 此時已經進來了,能夠確認一下剛剛的網頁 cd /usr/share/nginx/html cat index.html # 能夠看到 Hello docker !!! # 退出 exit
四、刪除這個docker鏡像
docker rm c99
鏡像的定製實際上就是定製每一層所添加的配置、文件。
若是咱們能夠把每一層修改、安裝、構建、操做的命令都寫入一個腳本,
用這個腳原本構建、定製鏡像,那麼以前說起的沒法重複的問題、鏡像構建透明性的問題、體積的問題就都會解決。
這個腳本就是 Dockerfile
一、配置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
二、定製鏡像
# 在 /source/docker/nginx 下
# 定製nginx的版本爲 mynginx
# . 的意思是,個人鏡像定製文件(Dockerfile)在當前目錄下
docker build -t nginx:mynginx .
三、試驗一下是否成功
docker run -p 8000:80 nginx:mynginx # 在本機訪問 http://00.00.00.00(IP地址):8000 # 能夠看到內容,就表示成功
安裝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 能夠看到運行效果
在node使用的時候,不多用node直接去運行,通常會使用PM2這樣一個進程守護的程序
經過這樣一個程序去運行node
PM2:利用多核資源
node程序
# 將上面的node程序拷貝過來 cd source/docker cp -R node pm2 cd pm2
一、pm2運行的時候,咱們通常使用process.yml 文件來描述它的運行過程
vi process.yml # 將下面代碼弄進 process.yml文件(這裏注意,script 等前面是兩個空格,NODE_ENV前面是四個空格) apps: script: app.js instances: 2 watch: true env: NODE_ENV: production
二、而後咱們編輯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"]
三、試驗一下是否成功
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
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_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
能夠看到頁面就表明成功