Docker Compose 容器編排 NET Core 6+MySQL 8+Nginx + Redis

環境:

CentOS 8.5.2111
Docker 20.10.10
Docker-Compose 2.1.0

服務:

db  redis  web nginx

NET Core 6+MySQL 8+Nginx + Redis

Kubernetes 又稱 K8s ,是集群的 ,單機用 Docker Compose 編排容器 比較方便

 

cat /etc/system-release     #查看版本

sudo yum update 

dnf -y update     #更新系統環境

 

先安裝 Docker Engine 和 Docker Compose

1. Docker  安裝

Docker三大核心概念:
鏡像(Image)
容器(Container)
倉庫(Repository)

//docs.docker.com/compose/install/
//cloud.tencent.com/document/product/213/46000

 

DockerHub鏡像加速器

使用加速器可以提升獲取Docker官方鏡像的速度
Docker Version不低於1.10時,建議直接通過daemon config進行配置

配置文件/etc/docker/daemon.json(沒有時新建該文件)

1. 創建一個Docker的配置文件

sudo vim /etc/docker/daemon.json

 

2. 編寫配置文件

{
"registry-mirrors": [
"//個人申請的.mirror.aliyuncs.com",
"//mirror.ccs.tencentyun.com",
"//hub-mirror.c.163.com",
"//mirror.baidubce.com"
]
}

 

阿里雲的個人加速器地址://cr.console.aliyun.com/cn-shenzhen/instances/mirrors

 

 安裝 Docker

1.添加 Docker 軟體源 (docker-ce 社區版)

dnf config-manager --add-repo=https://mirrors.cloud.tencent.com/docker-ce/linux/centos/docker-ce.repo

2.查看已添加的 Docker 軟體源

dnf list docker-ce

3.安裝 Docker

dnf install -y docker-ce

4.重新載入並重啟

sudo systemctl daemon-reload
sudo systemctl restart docker

5.設置Docker開機自啟

sudo systemctl enable docker

啟動docker

sudo systemctl start docker

關閉docker

sudo systemctl stop docker

更新docker-ce

yum update docker-ce

 

Docker 常用命令

docker info   #查看資訊
docker version  #查看版本
docker images #查看已有鏡像
docker ps #查看當前運行中的容器
docker ps -a #查看所有容器,包括未運行中的
docker inspect netcoreip #查看容器詳細資訊
docker exec -it nginx ls #進入容器查看目錄結構與文件

docker rm -f $(docker ps -aq) #刪除全部容器
docker rmi -f $(docker images -aq) #刪除全部鏡像


docker run -it ImageId /bin/bash #ImageId docker images 命令獲取, 退出容器:執行 exit 命令
docker exec -it 容器ID /bin/bash #進入後台運行的容器
docker logs 容器ID/名稱 #如未查看到剛才運行的容器,查看啟動日誌排錯

 

強制刪除鏡像 例子

docker rmi -f 60c033c82171
docker rmi -f netcorezeng
docker rmi -f microsoft/dotnet

 

強制刪除容器 例子

docker rm -f mysql8

 

卸載Docker

sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

 

2.Docker-Compose 容器編排

//cloud.tencent.com/developer/article/1438222

V1 版本安裝(不用這個)

//docs.docker.com/compose/install/

sudo curl -L "//get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose #設置許可權

docker compose version #查看版本

sudo rm /usr/local/bin/docker-compose #刪除

 

V2 版本安裝 (當前用這個)

//docs.docker.com/compose/cli-command/#install-on-linux
//github.com/docker/compose

 

1.創建目錄

mkdir -p /usr/local/lib/docker/cli-plugins

2.下載

curl -SL https://github.com/docker/compose/releases/download/v2.1.0/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins

上面方法 一般都會因為網路原因下載失敗 使用下面方法
下載 docker-compose-linux-x86_64 重命名為 docker-compose 放到 /usr/local/lib/docker/cli-plugins

3.添加可執行許可權

chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

 

3.Docker-Compose 配置 

目錄結構:

 

工程目錄下 /home/docker_compose/docker-compose.yml

 

 

docker-compose.yml 配置

version: "3.9"
services:
   db:
        image: mysql
        container_name: mysql8
        restart: always
        volumes:
            - ./my.cnf:/etc/mysql/my.cnf
            - /home/data/mysql:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: "root密碼"
            MYSQL_DATABASE: "資料庫名稱"
            MYSQL_USER: "用戶名"
            MYSQL_PASSWORD: "用戶密碼"
        ports:
            - 3306:3306
        command:
            - --default-authentication-plugin=mysql_native_password
            - --character-set-server=utf8mb4
            - --collation-server=utf8mb4_bin

   redis:
        image: redis
        container_name: redis
        volumes:
            - /home/data/redis:/var/lib/redis
            - ./redis.conf:/usr/local/etc/redis/redis.conf
        ports:
            - 6379:6379
        command:
            redis-server /usr/local/etc/redis/redis.conf

   web:
        image: ${DOCKER_REGISTRY-}netcorezeng
        container_name: netcoreapp
        build:
          context: /home/app
          dockerfile: Dockerfile
        restart: always
        ports:
            - 5000:80
        depends_on:
            - db
            - redis
        environment:
           TZ: Asia/Shanghai

   nginx:
        image: nginx
        container_name: nginx
        restart: always
        ports:
            - 80:80
            - 443:443
        volumes:
            - ./nginx.conf:/etc/nginx/nginx.conf       
            - /home/sslcrt:/etc/nginx/cert
            - /home/log/nginx:/var/log/nginx
            - /home/app:/usr/share/nginx/html

 

my.cnf 配置

[client]

#socket = /usr/mysql/mysqld.sock

default-character-set = utf8mb4

[mysqld]

#pid-file = /var/run/mysqld/mysqld.pid
#socket = /var/run/mysqld/mysqld.sock
#datadir = /var/lib/mysql
#socket = /usr/mysql/mysqld.sock
#pid-file = /usr/mysql/mysqld.pid

datadir = /home/data/mysql
character_set_server = utf8mb4
collation_server = utf8mb4_bin
default-time_zone = '+8:00'
secure-file-priv= NULL

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

# Custom config should go here

!includedir /etc/mysql/conf.d/

 

nginx.conf 配置

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: //nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr $http_x_forwarded_for - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See //nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen 80;
        server_name xx.com www.xx.com;      
       location / {
        root /usr/share/nginx/html;
        index index.html;
        proxy_pass //web;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_cache_bypass $http_upgrade;
        add_header Access-Control-Allow-Methods *;
        add_header Access-Control-Allow-Origin $http_origin;
        } 
        }


    server {
        listen 443 ssl;
        server_name  xx.com www.xx.com;
        ssl_certificate "cert/1_bundle.crt";
        ssl_certificate_key "cert/2_.key";
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

       # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        root /usr/share/nginx/html;
        index index.html;
        proxy_pass //web;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_cache_bypass $http_upgrade;
        add_header Access-Control-Allow-Methods *;
        add_header Access-Control-Allow-Origin $http_origin;
        }
    }
}

 

Dockerfile 配置

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM base AS final
WORKDIR /app
# 將本地應用拷貝到 容器/app 目錄下
COPY ./ ./
ENTRYPOINT ["dotnet", "NETCoreZeng.dll"]

 

 

1.創建工程目錄

mkdir /home/docker_compose
cd /home/docker_compose

2.創建 Dockerfile 模板文件

注意:一定要是UNIX格式,不能是windows格式

/home/app/Dockerfile

3.配置服務文件 docker-compose.yml

注意:不可以有製表符

語法錯誤: found character that cannot start any token (不可以有製表符)
did not find expected key

使用 YAML 時需要注意下面事項:
●不支援製表符 tab 鍵縮進,需要使用空格縮進
●通常開頭縮進2個空格
●字元後縮進1個空格,如冒號 : 、逗號 , 、橫杠 –
●用 # 號注釋
●如果包含特殊字元用單引號 『』 引起來
●布爾值必須用引號 「」 括起來

4.運行 Compose

錯誤提示:can’t find a suitable configuration file in this directory or any parent: not found

切換到工程目錄下
cd /home/docker_compose

再運行
docker compose up -d

錯誤提示:yaml: line 33: did not find expected key(格式要規範 不能多空格 如 web db redis 前面的空格)
錯誤提示:cannot load certificate No such file or directory(證書默認目錄 /etc/nginx )

 

 

docker compose version #查看版本
docker compose info
docker compose up #創建並啟動所有服務
docker compose up -d #在後台所有啟動服務
docker compose images #所有鏡像
docker compose ps #查看當前正在運行的容器
docker compose ps -a #查看所有容器,包括未運行中的
docker compose stop #停止所有容器
docker compose stop web #停止某個服務
docker compose rm -f web #移除已經停止的服務容器
docker compose restart #重啟

docker compose logs -t --tail="10" #查看nginx最新10條日誌

sudo rm /usr/local/lib/docker/cli-plugins/docker-compose #卸載 Docker Compose

 

容器時間與宿主機不一致

docker-compose.yml 裡面添加
environment:
TZ: Asia/Shanghai

 

容器之間連接 

 SERVICE 服務分別是 :db redis  web nginx

nginx.conf

proxy_pass //web;

 

appsettings.json

 "ConnectionStrings": {
    "MySqlConnection": "server=db;xxxxxxxx;"
  },

 

最後

看起來 很多東西配置  其實 配置好 docker_compose 裡面幾個服務的配置   靈魂的東西都在裡面了

切換到工程目錄下
cd /home/docker_compose

再運行
docker compose up -d

就可以了