Docker服务器部署

之前一直没有时间研究学习docker,这回有个新项目需要快速独立部署,因此正好学习一下。

1. 说明

该文档采用docker compose部署,因此服务器需安装dockerdocker-compose,具体的安装步骤本文档不进行赘述,可参考https://www.runoob.com/docker/docker-compose.html

部署的容器有六个:

  • Cassandra 3.11.10
  • Elasticsearch 7.6.2
  • RabbitMQ 3.8.16
  • MinIO latest
  • MySQL 8
  • Nginx
  • OpenJDK 8 (Jar启动服务)
目录结构
docker
  ├── cassandra
  |    ├── schema.cql
  |    └── cassandra.yaml
  ├── db
  |    └── db.sql
  ├── es
  |    ├── elasticsearch-analysis-ik-7.6.2
  |    └── Dockerfile
  ├── jar
  |    ├── Dockerfile
  |    └── {java application}.jar (由于频繁更新,部署时再放入目录)
  ├── rabbit
  |    └── Dockerfile
  ├── nginx
  |    ├── html (静态页面,前后端分离)
  |    └── conf
  └── docker-compose.yml

2. 数据挂载准备

为保证数据安全,容器的数据需挂载到宿主机的文件目录,以防数据丢失。本文档的挂载路径统一放在/home/volumes。若需要修改挂载目录路径,勿必记得修改docker-compose.yml里面的全部挂载目录路径。

// 新建目录
cd /home
mkdir volumes

3. Elasticsearch

需对Elasticsearch访问宿主机的权限进行配置。Es挂载目录在/home/volumes,新建es目录并授权。

cd /home/volumes
mkdir es
chomd 777 es/

Es使用宿主机虚拟内存区域,因此需要修改max_map_count参数。修改有两种方式:

  1. 直接执行命令
sudo sysctl -w vm.max_map_count=262144
  1. 修改文件
sudo vi /etc/sysctl.conf

// 添加到最后一行
vm.max_map_count=262144
  1. yaml文件
version: '3.5'

services:
  es:
    build: es
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
    container_name: es
    environment:
      - node.name=es
      - cluster.name=anson-es
      - cluster.initial_master_nodes=es
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - /home/volumes/es:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - anson-net
  1. Dockerfile
    复制ik插件到容器
FROM elasticsearch:7.6.2
COPY /elasticsearch-analysis-ik-7.6.2/ /usr/share/elasticsearch/plugins/elasticsearch-analysis-ik-7.6.2/

4. Cassandra

配置容器标签和环境变量、端口、挂载的路径。cqlsh服务是实现容器启动后自动建表,因为容器启动后才能只能cqlsh,所以命令中加入等待80秒再执行schema.cql

version: '3.5'

services:
  cassandra:
    image: cassandra:3.11.10
    container_name: cassandra
    environment:
      - CASSANDRA_DC=datacenter1
      - CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
      - CASSANDRA_LISTEN_ADDRESS=cassandra
      - CASSANDRA_BROADCAST_ADDRESS=cassandra
      - CASSANDRA_SEEDS=cassandra
    ports:
     - "9042:9042"
    restart: always
    volumes:
      - ./cassandra/cassandra.yaml:/opt/cassandra/conf/cassandra.yaml
      - /home/volumes/cassandra:/var/lib/cassandra
    networks:
      - anson-net

  cqlsh:
    image: cassandra:3.11.10
    container_name: cqlsh
    depends_on:
      - cassandra
    volumes:
      - ./cassandra/schema.cql:/schema.cql
    command: /bin/bash -c "sleep 80 && echo loading cassandra keyspace && cqlsh cassandra -f /schema.cql"
    networks:
      - anson-net

5. MySQL

version: '3.5'

services:
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: test_db
    ports:
      - 3306:3306
    volumes:
      - ./db:/docker-entrypoint-initdb.d
      - /home/volumes/db:/var/lib/mysql
    networks:
      - anson-net

表与数据也是在创建容器时自动初始化,因此需要注意表不要重复创建及数据不要重复导入,使用IF NOT EXISTSINSERT IGNORE INTO
如:

CREATE TABLE IF NOT EXISTS `example` (
  `id` int(64) NOT NULL AUTO_INCREMENT,
  `value` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
)
INSERT IGNORE INTO `example` VALUES (1, 'abc');

6. MinIO

version: '3.5'

services:
  minio:
    image: minio/minio:latest
    container_name: minio
    environment:
      MINIO_ROOT_USER: anson
      MINIO_ROOT_PASSWORD: 123456
    command: server /home/volumes/minio
    ports:
      - 9000:9000
    volumes:
      - /home/volumes/minio:/data
    networks:
      - anson-net

ps: 官网给的集群配置文件地址https://raw.githubusercontent.com/minio/minio/master/docs/orchestration/docker-compose/docker-compose.yaml

7. RabbitMQ

  1. YAML
    设置容器版本,连接用户的账号密码及挂载路径。
version: '3.5'

services:
  rabbit:
    build: rabbit
    image: rabbitmq:3.8.16
    container_name: rabbit
    environment:
      - RABBITMQ_DEFAULT_USER=anson
      - RABBITMQ_DEFAULT_PASS=123456
    ports:
      - 5672:5672
      - 15672:15672
    volumes:
      - /home/volumes/rabbit:/var/lib/rabbitmq
    networks:
      - anson-net
  1. Dockerfile
    启动后台插件,方便管理
FROM rabbitmq:3.8.16-management
RUN rabbitmq-plugins enable --offline rabbitmq_mqtt rabbitmq_federation_management rabbitmq_stomp

8. Nginx

  1. YAML
    设置容器版本,挂载路径。
version: '3.5'

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    network_mode: 'host'
    ports:
      - '80:80'
    restart: always
    volumes:
      - ./html:/usr/share/nginx/html
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    networks:
      - anson-net
  1. nginx.conf
    Nginx配置文件,路径转发
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  6000;
    proxy_connect_timeout       6000;
    proxy_send_timeout          6000;
    proxy_read_timeout          6000;
    send_timeout                6000;
    client_max_body_size 200m;
    server {
        listen       80;
        location / {
                  root   /usr/share/nginx/html;
                  index  index.html index.htm;
            #root /home/newtranx/new_document/html;
            #index index.html;
        }
        location /api/v1 {
                proxy_pass http://127.0.0.1:8081;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }

    }
}

9. OpenJDK 8

  1. YAML
version: '3.5'

services:
  jar:
    build: jar
    ports:
      - 8080:8080
    networks:
      - anson-net
  1. Dockerfile
    复制jar到容器并运行
FROM openjdk:8
ADD anson-0.0.1-SNAPSHOT.jar /anson.jar
ENTRYPOINT ["java", "-jar", "/anson.jar"]
ENV LANG C.UTF-8

10. docker compose

直接运行compose命令。

docker-compose up --build -d

11. MinIO配置

compose结束后,需配置minIO的bucket。浏览器打开http://{IP}:9000,输入用户名、密码进行登陆。点击页面右下角,创建bucket

12. 总结

Docker比Ansible简单太多了,而且不需要怎么关注宿主机的环境,方便快捷,不过还是需要点时间学习一下。附上完整的YAML。

version: '3.5'

services:
  cassandra:
    image: cassandra:3.11.10
    container_name: cassandra
    environment:
      - CASSANDRA_DC=datacenter1
      - CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
      - CASSANDRA_LISTEN_ADDRESS=cassandra
      - CASSANDRA_BROADCAST_ADDRESS=cassandra
      - CASSANDRA_SEEDS=cassandra
    ports:
     - "9042:9042"
    restart: always
    volumes:
      - ./cassandra/cassandra.yaml:/opt/cassandra/conf/cassandra.yaml
      - /home/volumes/cassandra:/var/lib/cassandra
    networks:
      - anson-net
  cqlsh:
    image: cassandra:3.11.10
    container_name: cqlsh
    depends_on:
      - cassandra
    volumes:
      - ./cassandra/schema.cql:/schema.cql
    command: /bin/bash -c "sleep 80 && echo loading cassandra keyspace && cqlsh cassandra -f /schema.cql"
    networks:
      - anson-net
  es:
    build: es
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
    container_name: es
    environment:
      - node.name=es
      - cluster.name=anson-es
      - cluster.initial_master_nodes=es
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - /home/volumes/es:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - anson-net
  rabbit:
    build: rabbit
    image: rabbitmq:3.8.16
    container_name: rabbit
    environment:
      - RABBITMQ_DEFAULT_USER=anson
      - RABBITMQ_DEFAULT_PASS=123456
    ports:
      - 5672:5672
      - 15672:15672
    volumes:
      - /home/volumes/rabbit:/var/lib/rabbitmq
    networks:
      - anson-net
  minio:
    image: minio/minio:latest
    container_name: minio
    environment:
      MINIO_ROOT_USER: anson
      MINIO_ROOT_PASSWORD: 123456
    command: server /home/volumes/minio
    ports:
      - 9000:9000
    volumes:
      - /home/volumes/minio:/data
    networks:
      - anson-net
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: test_db
    ports:
      - 3306:3306
    volumes:
      - ./db:/docker-entrypoint-initdb.d
      - /home/volumes/db:/var/lib/mysql
    networks:
      - anson-net
  nginx:
    image: nginx:latest
    container_name: nginx
    network_mode: 'host'
    ports:
      - '80:80'
    restart: always
    volumes:
      - ./html:/usr/share/nginx/html
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    networks:
      - anson-net
  jar:
    build: jar
    ports:
      - 8081:8081
      - 8084:8084
    networks:
      - anson-net
networks:
  anson-net:
    driver: bridge

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容