仕事でよく使用されるアプリケーション ソフトウェアのローカル Docker 化について言えば、ワンクリックでデプロイできるのは良いことではないでしょうか?

背景

そんな混乱を感じたことはありませんか?

多くの場合、Mysql、Redis、RocketMQ、ES、Zookeeper、Nginx、Nacos などのソフトウェアをローカル コンピューターにインストールする必要がありますが、これには時間と労力がかかります。

  1. コンピューターを交換したとき、またはシステムを再インストールしたとき。

  2. 仕事でチューニングやテストを行う必要があるとき、これらのソフトウェア サービスは通常、運用保守や DBA によって構築されていますが、サーバー マシンにログインして表示する権限さえなく、これは苦痛です。

  3. 学ぼうと思ったら基礎環境の構築に追われてしまい、非情に時間の無駄です。

そこで、時間を節約するために、一般的に使用されるローカル ソフトウェアを使用して Docker 化をまとめ、ワンクリック起動を実現しました。とても香ばしいですか?

特記事項: この記事では、実際にソフトウェアを Docker 化する方法と、ローカル ホストと Docker サービス間の通信に焦点を当てます。docker のインストールについては、docker の基礎知識、docker-compose コマンドや使用方法については説明しません。

目標

  1. 各ソフトウェア Docker サービスは固定 IP を介してアクセスされ、Docker サービスが再起動されるたびに IP を変更することはできません。

  2. マシンは、127.0.0.1 + ポート マッピングではなく、IP を通じて Docker コンテナと直接通信します。

  3. 複数のサービスのワンクリック展開と単一サービスのワンクリック展開をサポートします。

実装手順

  1. app-network という名前のブリッジを作成します

    docker network create --driver bridge  --subnet=172.30.1.0/24 --gateway=172.30.1.1 --opt "com.docker.network.bridge.name"="app-network" app-network
    

    Docker サービスを構成し、すべて同じブリッジ アプリ ネットワークにブリッジします。

  2. mysql を例に挙げます (他のサービスも同様です)

    version: '3.5'
    services:
      db:
        image: hub.c.163.com/library/mysql:5.7
        restart: always
        container_name: "mysql_5_7"
        restart: always
        ports:
          - 3306:3306
        environment:
          TZ: Asia/Shanghai
          MYSQL_ROOT_PASSWORD: root
        #command:
        volumes:
          - ./conf.d:/etc/mysql/mysql.conf.d
          - ./data:/var/lib/mysql
        networks:
            default:
              ipv4_address: 172.30.1.2
    networks:
       default:
        external:
          name: app-network
    

    その中で: MYSQL_ROOT_PASSWORD は root ユーザーのログイン パスワードで、IP: 172.30.1.2 を指定します。

  • docker-compose.yml ファイルを書き込む

  • 起動スクリプトstart.shを作成します。

    #!/usr/bin/env bash
    
    # 创建目录
    mkdir -p ./conf.d
    mkdir -p ./data
    
    # 设置目录权限
    chmod -R 777 ./conf.d
    chmod -R 777 ./data
    
    
    # 下载并启动容器,且为 后台 自动启动
    docker-compose up -d
    
    
    # 显示 mysql 容器
    docker ps |grep mysql_5_7
    
  • mysqlを起動する

    tanyawendeMacBook-Pro:mysql bytearch$ sh ./start.sh 
    mysql_5_7 is up-to-date
    1be6fba30c7c   hub.c.163.com/library/mysql:5.7   "docker-entrypoint.s…"   7 hours ago   Up 7 hours   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mysql_5_7
  • これまでのところ、mysql サービスは正常に開始され、すべてが順調に進んでいますが、ホスト (MAC コンピューター) がコンテナーに ping を送信できません。

    tanyawendeMacBook-Pro:mysql bytearch$ ping 172.30.1.2
    PING 172.30.1.2 (172.30.1.2): 56 data bytes
    Request timeout for icmp_seq 0
    Request timeout for icmp_seq 1
    Request timeout for icmp_seq 2
    Request timeout for icmp_seq 3
    Request timeout for icmp_seq 4
    Request timeout for icmp_seq 5
    Request timeout for icmp_seq 6
    Request timeout for icmp_seq 7
    Request timeout for icmp_seq 8
    Request timeout for icmp_seq 9
    
  • Aliyun CentOS システムを試してみたところ、ping を実行できました。

  • [root@VM_0_14_centos ~]# ping 172.30.1.2
    PING 172.30.1.2 (172.30.1.2) 56(84) bytes of data.
    64 bytes from 172.30.1.2: icmp_seq=1 ttl=64 time=0.028 ms
    64 bytes from 172.30.1.2: icmp_seq=2 ttl=64 time=0.021 ms
    64 bytes from 172.30.1.2: icmp_seq=3 ttl=64 time=0.017 ms
    64 bytes from 172.30.1.2: icmp_seq=4 ttl=64 time=0.027 ms
    64 bytes from 172.30.1.2: icmp_seq=5 ttl=64 time=0.023 ms
    64 bytes from 172.30.1.2: icmp_seq=6 ttl=64 time=0.023 ms
    64 bytes from 172.30.1.2: icmp_seq=7 ttl=64 time=0.020 ms
    

データを確認すると、その理由は次のとおりです。

  1. Mac 上の Docker システム アーキテクチャ

OSX での docker の実装は、最初に Linux 仮想マシンを作成し、次に docker を仮想マシンに入れて実装します。Linux 仮想マシンと OSX 間の通信には、現在のバージョンではこのソケット ファイルを使用して通信します/var/run/docker.sock。 OSX ホスト マシンでは docker コンテナに ping を実行できません。

  1. Linux システム アーキテクチャの Docker

Docker は Linux カーネル コンテナに基づいて実装されており、Linux に docker をインストールすると、docker0 という仮想ネットワーク カードが作成され、Linux ホストと Docker コンテナ間の通信は docker0 仮想ネットワーク カードを介して行われます。

Linux システムの場合はこれで十分です。

マックはどうですか?完璧を求めるプログラマーにとって、これは許されることではなく、最後まで戦わなければなりません。

Mac コンピュータと Docker コンテナの通信ソリューション

解決策を見つけるために何度も試みた結果 (他の代替案を持っている学生がいたら、私に知らせてください!)

  1. Mac は brew を通じて docker-connector をインストールします

     brew install wenjunxiao/brew/docker-connector
    
  2. 次のコマンドを実行して、すべての Dockerbridgeネットワークをルートに追加します。

     docker network ls --filter driver=bridge --format "{
          
          {.ID}}" | xargs docker network inspect --format "route {
          
          {range .IPAM.Config}}{
          
          {.Subnet}}{
          
          {end}}" >> /usr/local/etc/docker-connector.conf
    

    または変更して/usr/local/etc/docker-connector.confルートを追加します

    route 172.30.1.0/24
    
  3. 設定が完了しました。サービスを再起動します

     sudo brew services start docker-connector
    
  4. 次のコマンドを使用して、docker 側で wenjunxiao/mac-docker-connector を実行します。hostネットワークを使用し、許可する必要があります。NET_ADMIN,pull connector容器的作用是作为桥接

     docker run -it -d --restart always --net host --cap-add NET_ADMIN --name connector wenjunxiao/mac-docker-connector
    
  5. もう終わりです

    tanyawendeMacBook-Pro:docker-app bytearch$ ping 172.30.1.2
    PING 172.30.1.2 (172.30.1.2): 56 data bytes
    64 bytes from 172.30.1.2: icmp_seq=0 ttl=63 time=3.019 ms
    64 bytes from 172.30.1.2: icmp_seq=1 ttl=63 time=3.751 ms
    64 bytes from 172.30.1.2: icmp_seq=2 ttl=63 time=1.850 ms
    64 bytes from 172.30.1.2: icmp_seq=3 ttl=63 time=3.992 ms
    64 bytes from 172.30.1.2: icmp_seq=4 ttl=63 time=3.695 ms
    

他の

上記のソース コードはオープン ソースであり、興味のある学生は閲覧することができます。

Gitee: https://gitee.com/bytarch_admin/docker-app.git

Github: https://github.com/bytarch/docker-app.git

ディレクトリ構造は次のとおりです。

.
├── README.md
├── install_network.sh
├── mac_connect_docker.md
├── mysql
│   ├── conf.d         //数据库配置文件
│   ├── data           //数据库data目录挂载,重启数据不丢失
│   ├── docker-compose.yml    
│   ├── start.sh       //启动脚本
│   └── stop.sh        //关闭脚本
├── redis
│   ├── conf
│   ├── data
│   ├── docker-compose.yml
│   ├── start.sh
│   └── stop.sh
├── rocketmq
│   ├── docker-compose.yml
│   ├── readme.md
│   ├── rmq
│   ├── rmqs
│   ├── start.sh
│   └── stop.sh
├── startAll.sh            //启动所有服务
├── stopAll.sh             //关闭所有服务
└── zookeeper
    ├── docker-compose.yml
    ├── start.sh
    ├── stop.sh
    ├── zoo1
    ├── zoo2
    └── zoo3
执行./startAll看看效果:

嗯,真香!要的就是这种效果!以后可以愉快地玩耍了!

おすすめ

転載: blog.csdn.net/weixin_38130500/article/details/120008935