docker安裝

拿到一個全新的阿里雲服務器後,使用ssh進入服務器,執行如下步驟

一、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

 

安裝一個簡單的 Nginx 服務

如下步驟在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定製鏡像(定製一個nginx鏡像)

鏡像的定製實際上就是定製每一層所添加的配置、文件。

若是咱們能夠把每一層修改、安裝、構建、操做的命令都寫入一個腳本,

用這個腳原本構建、定製鏡像,那麼以前說起的沒法重複的問題、鏡像構建透明性的問題、體積的問題就都會解決。

這個腳本就是 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鏡像(須要先在服務器上安裝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

 

一、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

 

 

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

能夠看到頁面就表明成功

相關文章
相關標籤/搜索