最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

docker-compose實(shí)現(xiàn)容器任務(wù)編排的方法步驟

 更新時(shí)間:2023年01月04日 09:48:47   作者:北鳥(niǎo)南游  
本文主要介紹了docker-compose實(shí)現(xiàn)容器任務(wù)編排的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

項(xiàng)目開(kāi)發(fā)中,往往都需要啟動(dòng)多個(gè)容器,容器之間又相互依賴,存在著啟動(dòng)的順序。docker-compose就是可以通過(guò)命令控制依次啟動(dòng)容器。
容器編排工具可以幫助我們批量地創(chuàng)建、調(diào)度和管理容器,幫助我們解決規(guī)?;萜鞯牟渴饐?wèn)題。
Docker 三種常用的編排工具:Docker Compose、Docker Swarm 和 Kubernetes。

本文主要是使用 docker-compose 實(shí)現(xiàn)react【nginx】、express【node】、mysql【mysql】搭建項(xiàng)目前端通過(guò)express訪問(wèn)mysql數(shù)據(jù)庫(kù)的功能。

項(xiàng)目目錄結(jié)構(gòu)

.
├── docker-compose.yml
├── express-mysql
│   ├── app.js
│   ├── bin
│   ├── Dockerfile
│   ├── node_modules
│   ├── package.json
│   ├── public
│   ├── routes
│   ├── src
│   ├── views
│   └── yarn.lock
├── init.sql
├── react-express
│   ├── Dockerfile
│   ├── Dockerfile.build
│   ├── node_modules
│   ├── package.json
│   ├── public
│   ├── react-express.conf
│   ├── src
│   └── yarn.lock
└── start.sh

創(chuàng)建前端項(xiàng)目

使用 [create-react-app](https://create-react-app.bootcss.com/) 搭建前端項(xiàng)目,并安裝axios插件,進(jìn)行數(shù)據(jù)的調(diào)用。

npx create-react-app react-express
cd react-express
yarn add axios
npm start

調(diào)整首頁(yè)內(nèi)容

下載好項(xiàng)目,修改src/App.js的內(nèi)容,實(shí)現(xiàn)可以請(qǐng)求后端接口返回的數(shù)據(jù)。

import "./App.css";
import { useState, useEffect } from "react";
import axios from "axios";

function App() {
  const [user, setUser] = useState([]);
  useEffect(() => {
    axios.get("http://localhost:8088/sql").then((res) => {
      setUser(res.data);
    });
  }, []);
  return (
    <div className="App">
      <header className="App-header">
        {user.map((u, i) => (
          <p key={i}> {u.username}</p>
        ))}
      </header>
    </div>
  );
}

export default App;

添加Dockerfile文件

使用Dockerfile構(gòu)建前端鏡像。

FROM nginx
COPY ./build /usr/share/nginx/html
COPY ./react-express.conf /etc/nginx/conf.d
WORKDIR /usr/share/nginx/html
EXPOSE 80
# 啟動(dòng)ngnix
CMD ["nginx", "-g", "daemon off;"]

添加.dockerignore文件,排除不需要打包到docker鏡像的文件

node_modules
# testing
/coverage

# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*

添加nginx配置文件

添加react-express.conf文件

server {
  listen 80;
  server_name localhost; # 如 www.baidu.com
  root /usr/share/nginx/html; # 指向打包后的目錄

  location / {
    index index.html;
  }
}

生成前端鏡像

只需要將編譯后的build文件添加到docker鏡像中,生成鏡像前,先執(zhí)行下 npm run build

npm run build
docker build -t react-express .

可以看到成功生成react-express鏡像。并暴露端口為80,該鏡像為后面執(zhí)行docker-compose做準(zhǔn)備。

創(chuàng)建后端項(xiàng)目

首先確保本地安裝express;

npm install -g express

使用[express-generator](https://www.expressjs.com.cn/starter/generator.html)生成器生產(chǎn)express-mysql項(xiàng)目

mkdir express-mysql
cd express-mysql
npx express-generator

下載完成后,目錄結(jié)構(gòu)如下:

.
├── Dockerfile
├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
├── routes
│   ├── index.js
│   └── users.js
├── views
│   ├── error.jade
│   ├── index.jade
│   └── layout.jade
└── yarn.lock

為了連接mysql數(shù)據(jù)庫(kù),新增src目錄結(jié)構(gòu)

  .
  ├── Dockerfile
  ├── app.js
  ├── bin
  │   └── www
  ├── package.json
  ├── public
  │   ├── images
  │   ├── javascripts
  │   └── stylesheets
  ├── routes
  │   ├── index.js
  │   └── users.js
+ ├── src
+ │   ├── config.js
+ │   ├── db.js
  ├── views
  │   ├── error.jade
  │   ├── index.jade
  │   └── layout.jade
  └── yarn.lock

修改app.js設(shè)置跨域

// 在路由調(diào)用之前設(shè)置
app.all('*', function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By",' 3.2.1')
    res.header("Content-Type", "application/json;charset=utf-8");
    next();
});

// ...

連接mysql的配置

src/config.js文件

module.exports = {
  port: 3333, // express 服務(wù)啟動(dòng)端口
  /* 數(shù)據(jù)庫(kù)相關(guān)配置 */
  db: {
    host: 'localhost', // 主機(jī)名
    port: 8808,        // MySQL 默認(rèn)端口為 3306
    user: 'root',          // 使用 root 用戶登入 MySQL
    password: '123456', // MySQL 密碼,用你自己的
    database: 'blog', // 使用數(shù)據(jù)庫(kù)
    useConnectionPooling: true, // 使用連接池進(jìn)行連接,否則過(guò)一會(huì)node連接的mysql就會(huì)斷開(kāi),出現(xiàn)錯(cuò)誤
    connectionLimit: 50,
    queueLimit: 0,
    waitForConnection: true
  }
}

src/db.js文件內(nèi)容

const mysql = require("mysql");
// 獲取數(shù)據(jù)庫(kù)配置信息
const config = require("./config").db;

//創(chuàng)建一個(gè)mysql連接對(duì)象
let connection;

function handleError(err) {
  if (err) {
    // 如果是連接斷開(kāi),自動(dòng)重新連接
    if (err.code === "PROTOCOL_CONNECTION_LOST") {
      connect();
    } else {
      console.error(err.stack || err);
    }
  }
}

// 連接數(shù)據(jù)庫(kù)
function connect() {
  console.log("連接數(shù)據(jù)庫(kù) connect");
  //創(chuàng)建一個(gè)mysql連接對(duì)象
  connection = mysql.createPool(config);
  connection.getConnection(handleError);
  connection.on("error", handleError);
}

connect();
module.exports = connection;

進(jìn)行sql查詢

routes/index.js下設(shè)置sql查詢

var express = require("express");
var router = express.Router();
const connection = require("../src/db");
/* GET home page. */
router.get("/sql", function (req, res, next) {
  /* 使用 connection.query 來(lái)執(zhí)行 sql 語(yǔ)句 */
  // 第一個(gè)參數(shù)為 sql 語(yǔ)句,可以透過(guò) js 自由組合
  // 第二個(gè)參數(shù)為回調(diào)函數(shù),err 表示查詢異常、第二個(gè)參數(shù)則為查詢結(jié)果(這里的查詢結(jié)果為多個(gè)用戶行)
  connection.query("select username from user", (err, users) => {
    if (err) {
      res.send("query error"+ err);
    } else {
      // 將 MySQL 查詢結(jié)果作為路由返回值
      res.send(users);
    }
  });
});

module.exports = router;

構(gòu)建后端鏡像

新建Dockerfile文件

FROM node:16.11.0
COPY ./ /app
WORKDIR /app
RUN npm config set registry https://registry.npm.taobao.org && npm install
EXPOSE 3000
CMD npm start

新建.dockerignore文件

node_modules
*.lock
*.log
yarn-error.log
package-lock.json

在當(dāng)前目錄下,執(zhí)行docker構(gòu)建鏡像的命令,測(cè)試下是否有問(wèn)題。

docker build -t express-mysql .

初始化數(shù)據(jù)庫(kù)

創(chuàng)建sql腳本,在容器啟動(dòng)后給mysql容器初始化數(shù)據(jù)?!境跏蓟瘮?shù)據(jù)有很多其它方案,可以在創(chuàng)建鏡像時(shí)通過(guò)修改配置將初始化數(shù)據(jù)存入鏡像,有興趣可自行搜索】,在這里只使用簡(jiǎn)單的手動(dòng)處理方案,降低認(rèn)知難度。

DROP TABLE IF EXISTS `user`;
create table user
(
    id       bigint auto_increment
             primary key,
    username varchar(255) not null
)
    collate = utf8mb4_unicode_ci;
INSERT INTO blog.user (id, username) VALUES (1, 'admin');
INSERT INTO blog.user (id, username) VALUES (2, 'docker');

創(chuàng)建 mysql容器

docker run -d --name mysql-user -p 8087:3306 \
-v /data/docker-data/docker_mysql/conf:/etc/mysql/conf.d \
-v /data/docker-data/docker_mysql/logs:/logs \
-v /data/docker-data/docker_mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7

登錄mysql并初始化數(shù)據(jù)

mysql -hlocalhost -P8087 -uroot -p123456 <<EOFuse blog;source /data/compose/init.sql;quitEOF
mysql -hlocalhost -P8087 -uroot -p123456 <<EOF
use blog;
source /data/compose/init.sql;
quit
EOF

docker-compose編排容器

到目前已經(jīng)完成了前端、后端、數(shù)據(jù)庫(kù)的創(chuàng)建,項(xiàng)目執(zhí)行依賴多個(gè)容器啟動(dòng),上面的過(guò)程非常繁瑣,而且容易出現(xiàn)錯(cuò)誤。接下來(lái)就使用docker-compose可以使用一個(gè)命令將3個(gè)容器同時(shí)啟動(dòng)。

安裝[docker-compose](https://docs.docker.com/compose/)

安裝完成后查看版本信息

docker-compose version
---
docker-compose version 1.29.2, build unknown
docker-py version: 5.0.3
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.0.2k-fips  26 Jan 2017

新建yml文件

docker-compose.yml是docker-compose啟動(dòng)的默認(rèn)文件

version: "3.1"
services:
 react:
  build:
    context: "./react-express"
    dockerfile: Dockerfile
  depends_on:
   - express
  ports:
   - "8086:80"
 mysql:
  image: mysql:5.7
  container_name: mysql5
  ports:
   - "8087:3306"
  environment:
   MYSQL_ROOT_PASSWORD: 123456
   MYSQL_DATABASE: "blog"
  volumes:
   - "/data/docker-data/docker_mysql/conf:/etc/mysql/conf.d"
   - "/data/docker-data/docker_mysql/logs:/logs"
   - "/data/docker-data/docker_mysql/data:/var/lib/mysql"
 express:
  build:
    context: "./express-mysql"
    dockerfile: Dockerfile
  ports:
    - "8088:3000"
  depends_on:
   - mysql

設(shè)置完成 yml 文件,執(zhí)行啟動(dòng)命令

docker-compose up
# 或者 后臺(tái)啟動(dòng)
docker-compose up -d
docker-compose ps
      Name                     Command               State                          Ports                       
----------------------------------------------------------------------------------------------------------------
compose_express_1   docker-entrypoint.sh /bin/ ...   Up      0.0.0.0:8088->3000/tcp,:::8088->3000/tcp           
compose_react_1     /docker-entrypoint.sh ngin ...   Up      0.0.0.0:8086->80/tcp,:::8086->80/tcp               
mysql5              docker-entrypoint.sh mysqld      Up      0.0.0.0:8087->3306/tcp,:::8087->3306/tcp, 33060/tcp

一個(gè)命令就可以啟動(dòng)多個(gè)容器,并且組織好容器之間的依賴關(guān)系。

繼續(xù)優(yōu)化

創(chuàng)建前端鏡像存在的問(wèn)題.
每次打包前端鏡像時(shí),需要先完成 build 的階段,也就是前端編譯的過(guò)程。該過(guò)程其實(shí)也可以自動(dòng)處理。

方案1:使用shell執(zhí)行

在項(xiàng)目目錄下創(chuàng)建 start.sh 文件, 將前端編譯的過(guò)程放到外部node環(huán)境【jenkins、或者服務(wù)器】執(zhí)行。

#!/bin/bash
cd react-express
yarn run build
cd ..
docker-compose up -d
mysql -hlocalhost -P8087 -uroot -p123456 <<EOF
use blog;
source ./init.sql;
quit
EOF

方案2:采用鏡像多階段構(gòu)建

思路:將編譯過(guò)程放到node環(huán)境中,打包出來(lái)build目錄,然后將build目錄拷貝到后邊鏡像內(nèi)。

新建一個(gè)Dockerfile.build文件。

# 第一階段,先對(duì)前端項(xiàng)目進(jìn)行編譯打包
FROM node:16.11.0 AS nodeapp
COPY ./ /app
WORKDIR /app
RUN yarn && yarn build

#多階段構(gòu)建,最終會(huì)以最后的鏡像作為基礎(chǔ)鏡像
# 第二階段,將打包的數(shù)據(jù)拷貝到后邊鏡像內(nèi),并創(chuàng)建nginx鏡像
FROM nginx
COPY --from=nodeapp /app/build /usr/share/nginx/html
COPY ./react-express.conf /etc/nginx/conf.d
WORKDIR /usr/share/nginx/html
EXPOSE 80
# 啟動(dòng)ngnix
CMD ["nginx", "-g", "daemon off;"]

然后同步修改下docker-compose.yml文件

version: "3.1"
services:
 react:
  build:
    context: "./react-express"
    dockerfile: Dockerfile.build
  depends_on:
   - express
  ports:
   - "8086:80"
 mysql:
  image: mysql:5.7
  container_name: mysql5
  ports:
   - "8087:3306"
  environment:
   MYSQL_ROOT_PASSWORD: 123456
   MYSQL_DATABASE: "blog"
  volumes:
   - "/data/docker-data/docker_mysql/conf:/etc/mysql/conf.d"
   - "/data/docker-data/docker_mysql/logs:/logs"
   - "/data/docker-data/docker_mysql/data:/var/lib/mysql"
 express:
  build:
    context: "./express-mysql"
    dockerfile: Dockerfile
  ports:
    - "8088:3000"
  depends_on:
   - mysql

到此這篇關(guān)于docker-compose實(shí)現(xiàn)容器任務(wù)編排的方法步驟的文章就介紹到這了,更多相關(guān)docker-compose 容器任務(wù)編排內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • docker使用阿里云鏡像倉(cāng)庫(kù)的方法

    docker使用阿里云鏡像倉(cāng)庫(kù)的方法

    本篇文章主要介紹了docker使用阿里云鏡像倉(cāng)庫(kù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Docker之cAdvisor的安裝使用方式

    Docker之cAdvisor的安裝使用方式

    這篇文章主要介紹了Docker之cAdvisor的安裝使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Docker容器中沒(méi)有vi/ps等命令問(wèn)題

    Docker容器中沒(méi)有vi/ps等命令問(wèn)題

    這篇文章主要介紹了Docker容器中沒(méi)有vi/ps等命令問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳解Windows下運(yùn)用Docker部署Node.js開(kāi)發(fā)環(huán)境

    詳解Windows下運(yùn)用Docker部署Node.js開(kāi)發(fā)環(huán)境

    這篇文章主要介紹了詳解Windows下運(yùn)用Docker部署Node.js開(kāi)發(fā)環(huán)境,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • dockerfile基于apline將JDK20打包成鏡像

    dockerfile基于apline將JDK20打包成鏡像

    這篇文章主要為大家介紹了dockerfile基于apline將JDK20打包成鏡像步驟及驗(yàn)證,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • docker nginx + https 子域名配置詳細(xì)教程

    docker nginx + https 子域名配置詳細(xì)教程

    這篇文章主要介紹了docker nginx + https 子域名配置詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 如何找到Docker容器(redis)中的持久化文件

    如何找到Docker容器(redis)中的持久化文件

    要查看Docker容器的dump.rdb和appendonly.aof文件(如果啟用了AOF持久化)的位置,我們需要知道容器中Redis配置文件的內(nèi)容或者容器的數(shù)據(jù)卷的掛載位置,本文給大家介紹如何找到Docker容器(redis)中的持久化文件,感興趣的朋友一起看看吧
    2023-10-10
  • dockerfile中ENTRYPOINT與CMD的結(jié)合使用及區(qū)別

    dockerfile中ENTRYPOINT與CMD的結(jié)合使用及區(qū)別

    這篇文章主要介紹了dockerfile中ENTRYPOINT與CMD的結(jié)合使用,大家都知道CMD 與 ENTRYPOINT都是用于指定啟動(dòng)容器執(zhí)行的命令,那么他們倆有什么區(qū)別呢,本文給大家詳細(xì)介紹,需要的朋友可以參考下
    2021-08-08
  • Docker學(xué)習(xí)之基于Dockerfile搭建JAVA Tomcat運(yùn)行環(huán)境的方法

    Docker學(xué)習(xí)之基于Dockerfile搭建JAVA Tomcat運(yùn)行環(huán)境的方法

    本篇文章主要介紹了Docker學(xué)習(xí)之基于Dockerfile搭建JAVA Tomcat運(yùn)行環(huán)境的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • docker私有倉(cāng)庫(kù)的鏡像刪除方式

    docker私有倉(cāng)庫(kù)的鏡像刪除方式

    該文章介紹了如何使用Docker私有倉(cāng)庫(kù)刪除鏡像的步驟,包括獲取Token、請(qǐng)求鏡像列表和刪除鏡像的具體操作,同時(shí),還解決了在刪除鏡像時(shí)遇到的MANIFEST_UNKNOWN錯(cuò)誤,并提供了相應(yīng)的解決辦法
    2025-02-02

最新評(píng)論

阜新市| 陇南市| 慈溪市| 巴塘县| 萨嘎县| 当涂县| 运城市| 子洲县| 化州市| 东兰县| 青阳县| 任丘市| 绥棱县| 通榆县| 长汀县| 苏尼特左旗| 建水县| 兰西县| 广元市| 井冈山市| 曲靖市| 益阳市| 长寿区| 鄱阳县| 秦皇岛市| 屯昌县| 泰安市| 汝阳县| 濮阳县| 武陟县| 乌海市| 湘潭市| 云南省| 黄大仙区| 沅江市| 抚顺市| 南郑县| 石城县| 麻阳| 拉萨市| 图们市|