背景
そんな混乱を感じたことはありませんか?
多くの場合、Mysql、Redis、RocketMQ、ES、Zookeeper、Nginx、Nacos などのソフトウェアをローカル コンピューターにインストールする必要がありますが、これには時間と労力がかかります。
コンピューターを交換したとき、またはシステムを再インストールしたとき。
仕事でチューニングやテストを行う必要があるとき、これらのソフトウェア サービスは通常、運用保守や DBA によって構築されていますが、サーバー マシンにログインして表示する権限さえなく、これは苦痛です。
学ぼうと思ったら基礎環境の構築に追われてしまい、非情に時間の無駄です。
そこで、時間を節約するために、一般的に使用されるローカル ソフトウェアを使用して Docker 化をまとめ、ワンクリック起動を実現しました。とても香ばしいですか?
特記事項: この記事では、実際にソフトウェアを Docker 化する方法と、ローカル ホストと Docker サービス間の通信に焦点を当てます。docker のインストールについては、docker の基礎知識、docker-compose コマンドや使用方法については説明しません。
目標
各ソフトウェア Docker サービスは固定 IP を介してアクセスされ、Docker サービスが再起動されるたびに IP を変更することはできません。
マシンは、127.0.0.1 + ポート マッピングではなく、IP を通じて Docker コンテナと直接通信します。
複数のサービスのワンクリック展開と単一サービスのワンクリック展開をサポートします。
実装手順
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 サービスを構成し、すべて同じブリッジ アプリ ネットワークにブリッジします。
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
データを確認すると、その理由は次のとおりです。
Mac 上の Docker システム アーキテクチャ
OSX での docker の実装は、最初に Linux 仮想マシンを作成し、次に docker を仮想マシンに入れて実装します。Linux 仮想マシンと OSX 間の通信には、現在のバージョンではこのソケット ファイルを使用して通信します/var/run/docker.sock
。 OSX ホスト マシンでは docker コンテナに ping を実行できません。
Linux システム アーキテクチャの Docker
Docker は Linux カーネル コンテナに基づいて実装されており、Linux に docker をインストールすると、docker0 という仮想ネットワーク カードが作成され、Linux ホストと Docker コンテナ間の通信は docker0 仮想ネットワーク カードを介して行われます。
Linux システムの場合はこれで十分です。!!
マックはどうですか?完璧を求めるプログラマーにとって、これは許されることではなく、最後まで戦わなければなりません。
Mac コンピュータと Docker コンテナの通信ソリューション
解決策を見つけるために何度も試みた結果 (他の代替案を持っている学生がいたら、私に知らせてください!)
Mac は brew を通じて docker-connector をインストールします
brew install wenjunxiao/brew/docker-connector
次のコマンドを実行して、すべての Docker
bridge
ネットワークをルートに追加します。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
設定が完了しました。サービスを再起動します
sudo brew services start docker-connector
次のコマンドを使用して、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
もう終わりです
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看看效果:
嗯,真香!要的就是这种效果!以后可以愉快地玩耍了!