文章目錄
- 1. Docker複雜安裝
- 1.1 安裝Mysql的主從複製
- 主從搭建步驟
- 1.2 安裝Redis集羣
- 1.2.1 面試題:1~2億條數據需要緩存,請問應該怎樣設計
- 1.2.2 三主三從集羣配置步驟
- 1.2.3 主從容錯切換遷移案例
- 1.2.4 主從容錯的切換遷移
- 1.2.5 主從擴容案例
- 1.2.6 主從縮容案例
- 1.3 補充:將容器設置為開機自啓
- 2. DockerFlie解析
- 2.1 是什麼?
- 2.2 DockerFlie構建過程解析
- 2.2.1 Dockerfile內容基礎知識
- 2.2.2 Docker執行DockerFile大致流程
- 2.2.3 小總結
- 2.3 DockerFlie常用保留字指令
- 2.4 案例
- 2.4.1 自定義鏡像mycentosjava8
- 2.4.2 虛懸鏡像
- 2.4.3 自定義鏡像myUbuntu
- 3. Docker微服務實戰
- 3.1 通過IDEA創建一個普通的微服務模塊
- 3.2 通過Dockerfile發佈微服務部署到Docker中
- 4. Docker網絡
- 4.1 是什麼
- 4.2 常用的基本命令
- 4.3 能幹啥
- 4.4 網絡模式
- 5. Docker-compose容器編排
- 5.1 是什麼
- 5.2 能幹啥
- 5.3 去哪下載
- 5.4 Compose核心概念
- 5.5 Compose使用的三個步驟
- 5.6 Compose常用命令
- 5.7 Compose編排服務
- 6. Docker輕量級可視化工具Portainer
- 6.1 是什麼
- 6.2 安裝
- 7. Docker容器監控之CAdvisor+InfluxDB+Granfana
- 7.1 原生命令
- 7.2 是什麼
- 7.3 使用
1. Docker複雜安裝
1.1 安裝Mysql的主從複製
主從搭建步驟
1、新建主服務器容器實例3307
docker run -p 3307:3306 --name mysql-master #3307映射到3306,容器名為mysql-master
-v /app/mysql/mydata/mysql-master/log:/var/log/mysql #容器數據卷
-v /app/mysql/mydata/mysql-master/data:/var/lib/mysql
-v /app/mysql/mydata/mysql-master/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root # -e配置環境,配置了root的密碼為root
-d mysql:5.7
完整命令
docker run -p 3307:3306 --name mysql-master -v /app/mysql/mydata/mysql-master/log:/var/log/mysql -v /app/mysql/mydata/mysql-master/data:/var/lib/mysql -v /app/mysql/mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
2、進入/app/mysql/mydata/mysql-master/conf目錄下新建my.cnf
[mysqld]
## 設置server_id,同一局域網中需要唯一
server_id=101
## 指定不需要同步的數據庫名稱
binlog-ignore-db=mysql
## 開啓二進制日誌功能
log-bin=mall-mysql-bin
## 設置二進制日誌使用內存大小(事務)
binlog_cache_size=1M
## 設置使用的二進制日誌格式(mixed,statement,row)
binlog_format=mixed
## 二進制日誌過期清理時間。默認值為0,表示不自動清理。
expire_logs_days=7
## 跳過主從複製中遇到的所有錯誤或指定類型的錯誤,避免slave端複製中斷。
## 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062
3、修改完配置之後重啓master實例
docker restart mysql-master
4、進入mysql-master容器
[root@centos100 conf]# docker exec -it mysql-master /bin/bash
root@b58afbb1ac1a:/# mysql -uroot -p
Enter password:
...
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql | <--上面配置不需要同步的數據庫名稱mysql,指的就是這個庫
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
5、master容器實例內創建數據同步用户
#創建一個用户
mysql> create user 'slave'@'%' identified by '123456';
Query OK, 0 rows affected (0.03 sec)
#授權
mysql> grant replication slave,replication client on *.* to 'slave'@'%';
Query OK, 0 rows affected (0.00 sec)
6、新建從服務器容器3308
docker run -p 3308:3306 --name mysql-slave #端口映射,3308映射到3306,修改容器名為mysql-slave
-v /app/mysql/mydata/mysql-slave/log:/var/log/mysql #添加容器卷
-v /app/mysql/mydata/mysql-slave/data:/var/lib/mysql
-v /app/mysql/mydata/mysql-slave/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root #創建root密碼為root
-d mysql:5.7 #鏡像名
完整命令
docker run -p 3308:3306 --name mysql-slave -v /app/mysql/mydata/mysql-slave/log:/var/log/mysql -v /app/mysql/mydata/mysql-slave/data:/var/lib/mysql -v /app/mysql/mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
7、進入/app/mysql/mydata/mysql-slave/conf目錄下新建my.cnf
[mysqld]
## 設置server_id,同一局域網中需要唯一
server_id=102
## 指定不需要同步的數據庫名稱
binlog-ignore-db=mysql
## 開啓二進制日誌功能,以備Slave作為其它數據庫實例的Master時使用
log-bin=mall-mysql-slave1-bin
## 設置二進制日誌使用內存大小(事務)
binlog_cache_size=1M
## 設置使用的二進制日誌格式(mixed,statement,row)
binlog_format=mixed
## 二進制日誌過期清理時間。默認值為0,表示不自動清理。
expire_logs_days=7
## 跳過主從複製中遇到的所有錯誤或指定類型的錯誤,避免slave端複製中斷。
## 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062
## relay_log配置中繼日誌
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave將複製事件寫進自己的二進制日誌
log_slave_updates=1
## slave設置為只讀(具有super權限的用户除外)
read_only=1
8、修改完配置後重啓slave實例
docker restart mysql-slave
9、在主數據庫中查看主從同步狀態
[root@centos100 conf]# docker exec -it mysql-master /bin/bash
root@b58afbb1ac1a:/# mysql -uroot -p
Enter password:
...
mysql> show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000001 | 617 | | mysql | |
+-----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
10、進入mysql-slave容器
[root@centos100 conf]# docker exec -it mysql-slave /bin/bash
root@ee7d461daf7f:/# mysql -uroot -p
Enter password:
11、在從數據庫中配置主從複製
change master to master_host='宿主機ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
主從複製命令參數説明
master_host:主數據庫的IP地址;
master_port:主數據庫的運行端口;
master_user:在主數據庫創建的用於同步數據的用户賬號;
master_password:在主數據庫創建的用於同步數據的用户密碼;
master_log_file:指定從數據庫要複製數據的日誌文件,通過查看主數據的狀態,獲取File參數;
master_log_pos:指定從數據庫從哪個位置開始複製數據,通過查看主數據的狀態,獲取Position參數;
master_connect_retry:連接失敗重試的時間間隔,單位為秒。
12、在從數據庫中查看主從同步狀態
show slave status\G;
13、在從數據庫開啓主從同步
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
執行這個命令之前,在12步時可以看到
Slave_IO_Running: No
Slave_SQL_Running: No
當執行成功後
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
14、查看從數據庫狀態發現已經同步
15、主從複製測試
主機創建庫、表
mysql> create database db01;
Query OK, 1 row affected (0.00 sec)
mysql> use db01;
Database changed
mysql> create table t1(id int,name varchar(12));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t1 values (1,'zhangsan');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
+------+----------+
1 row in set (0.00 sec)
從機
mysql> use db01;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from t1;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
+------+----------+
1 row in set (0.00 sec)
1.2 安裝Redis集羣
cluster(集羣)模式-docker版
哈希槽分區進行億級數據存儲
1.2.1 面試題:1~2億條數據需要緩存,請問應該怎樣設計
單機單台100%不可能,肯定是分佈式存儲,用redis如何落地?
1. 哈希取餘分區 1.1 2億條記錄就是2億個k,v,我們單機不行必須要分佈式多機,假設有3台機器構成一個集羣,用户每次讀寫操作都是根據公式: hash(key) % N個機器台數,計算出哈希值,用來決定數據映射到哪一個節點上。 1.2 優點: 簡單粗暴,直接有效,只需要預估好數據規劃好節點,例如3台、8台、10台,就能保證一段時間的數據支撐。使用Hash算法讓固定的一部分請求落到同一台服務器上,這樣每台服務器固定處理一部分請求(並維護這些請求的信息),起到負載均衡+分而治之的作用。 1.3 缺點: 原來規劃好的節點,進行擴容或者縮容就比較麻煩了額,不管擴縮,每次數據變動導致節點有變動,映射關係需要重新進行計算,在服務器個數固定不變時沒有問題,如果需要彈性擴容或故障停機的情況下,原來的取模公式就會發生變化:Hash(key)/3會變成Hash(key) /?。此時地址經過取餘運算的結果將發生很大變化,根據公式獲取的服務器也會變得不可控。 某個redis機器宕機了,由於台數數量變化,會導致hash取餘全部數據重新洗牌。 2. 一致性哈希算法分區 2.1 是什麼 一致性Hash算法背景:一致性哈希算法在1997年由麻省理工學院中提出的,設計目標是為了解決分佈式緩存數據變動和映射問題,某個機器宕機了,分母數量改變了,自然取餘數不OK了。 2.2 能幹啥 提出一致性Hash解決方案。目的是當服務器個數發生變動時,儘量減少影響客户端到服務器的映射關係 2.3 三大步驟 2.3.1 一致性哈希環 一致性哈希算法必然有個hash函數並按照算法產生hash值,這個算法的所有可能哈希值會構成一個全量集,這個集合可以成為一個hash空間[0,2^32-1],這個是一個線性空間,但是在算法中,我們通過適當的邏輯控制將它首尾相連(0 = 2^32),這樣讓它邏輯上形成了一個環形空間。 2.3.2 節點映射 將集羣中各個IP節點映射到環上的某一個位置。將各個服務器使用Hash進行一個哈希,具體可以選擇服務器的IP或主機名作為關鍵字進行哈希,這樣每台機器就能確定其在哈希環上的位置。假如4個節點NodeA、B、C、D,經過IP地址的哈希函數計算(hash(ip)) 2.3.3 key落到服務器的落鍵規則 當我們需要存儲一個kv鍵值對時,首先計算key的hash值,hash(key),將這個key使用相同的函數Hash計算出哈希值並確定此數據在環上的位置,從此位置沿環順時針“行走”,第一台遇到的服務器就是其應該定位到的服務器,並將該鍵值對存儲在該節點上。如我們有Object A、Object B、Object C、Object D四個數據對象,經過哈希計算後,在環空間上的位置如下:根據一致性Hash算法,數據A會被定為到Node A上,B被定為到Node B上,C被定為到Node C上,D被定為到Node D上。 2.4 優點 2.4.1 解決了一致性哈希算法的容錯性 假設Node C宕機,可以看到此時對象A、B、D不會受到影響,只有C對象被重定位到Node D。一般的,在一致性Hash算法中,如果一台服務器不可用,則受影響的數據僅僅是此服務器到其環空間中前一台服務器(即沿着逆時針方向行走遇到的第一台服務器)之間數據,其它不會受到影響。簡單説,就是C掛了,受到影響的只是B、C之間的數據,並且這些數據會轉移到D進行存儲。 2.4.2 解決了一致性哈希算法的擴展性 數據量增加了,需要增加一台節點NodeX,X的位置在A和B之間,那收到影響的也就是A到X之間的數據,重新把A到X的數據錄入到X上即可,不會導致hash取餘全部數據重新洗牌。 2.5 缺點 Hash環的數據傾斜問題 一致性Hash算法在服務節點太少時,容易因為節點分佈不均勻而造成數據傾斜(被緩存的對象大部分集中緩存在某一台服務器上)問題 2.6 總結 為了在節點數目發生改變時儘可能少的遷移數據 將所有的存儲節點排列在收尾相接的Hash環上,每個key在計算Hash後會順時針找到臨近的存儲節點存放。 而當有節點加入或退出時僅影響該節點在Hash環上順時針相鄰的後續節點。 優點: 加入和刪除節點隻影響哈希環中順時針方向的相鄰的節點,對其他節點無影響。 缺點 : 數據的分佈和節點的位置有關,因為這些節點不是均勻的分佈在哈希環上的,所以數據在進行存儲時達不到均勻分佈的效果。 3. 哈希槽分區 3.1 為什麼會出現 解決一致性哈希算法的數據傾斜問題 哈希槽實質就是一個數組,數組[0,2^14 -1]形成hash slot空間。 3.2 能幹什麼 解決均勻分配的問題,在數據和節點之間又加入了一層,把這層稱為哈希槽(slot),用於管理數據和節點之間的關係,現在就相當於節點上放的是槽,槽裏放的是數據。 槽解決的是粒度問題,相當於把粒度變大了,這樣便於數據移動。 哈希解決的是映射問題,使用key的哈希值來計算所在的槽,便於數據分配。 3.3 有多少個hash槽 一個集羣只能有16384個槽,編號0-16383(0-2^14-1)。這些槽會分配給集羣中的所有主節點,分配策略沒有要求。可以指定哪些編號的槽分配給哪個主節點。集羣會記錄節點和槽的對應關係。解決了節點和槽的關係後,接下來就需要對key求哈希值,然後對16384取餘,餘數是幾key就落入對應的槽裏。slot = CRC16(key) % 16384。以槽為單位移動數據,因為槽的數目是固定的,處理起來比較容易,這樣數據移動問題就解決了。 3.4 哈希槽計算 Redis 集羣中內置了 16384 個哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點。當需要在 Redis 集羣中放置一個 key-value時,redis 先對 key 使用 crc16 算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,也就是映射到某個節點上。如下代碼,key之A 、B在Node2, key之C落在Node3上
1.2.2 三主三從集羣配置步驟
1、新建6個docker容器實例
docker run -d #創建並運行docker容器實例
--name redis-node-1 #容器名字
--net host #使用宿主機的ip端口,默認
--privileged=true #獲取宿主機的用户權限
-v /app/redis/share/redis-node-1:/data #容器卷 宿主機地址:docker內部地址
redis #redis鏡像
--cluster-enabled yes #開啓redis集羣
--appendonly yes #開啓持久化
--port 6381 #redis端口
docker run -d --name redis-node-1 --net host --privileged=true -v /app/redis/share/redis-node-1:/data redis --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /app/redis/share/redis-node-2:/data redis --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /app/redis/share/redis-node-3:/data redis --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /app/redis/share/redis-node-4:/data redis --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /app/redis/share/redis-node-5:/data redis --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /app/redis/share/redis-node-6:/data redis --cluster-enabled yes --appendonly yes --port 6386
2、進入容器redis-node-1併為6台機器構建集羣關係
//注意,進入docker容器後才能執行一下命令,且注意自己的真實IP地址
redis-cli --cluster create 192.168.75.100:6381 192.168.75.100:6382 192.168.75.100:6383 192.168.75.100:6384 192.168.75.100:6385 192.168.75.100:6386 --cluster-replicas 1
--cluster-replicas 1 表示為每個master創建一個slave節點[root@centos100 ~]# docker exec -it redis-node-1 /bin/bash
root@centos100:/data# redis-cli --cluster create 192.168.75.100:6381 192.168.75.100:6382 192.168.75.100:6383 192.168.75.100:6384 192.168.75.100:6385 192.168.75.100:6386 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.75.100:6385 to 192.168.75.100:6381
Adding replica 192.168.75.100:6386 to 192.168.75.100:6382
Adding replica 192.168.75.100:6384 to 192.168.75.100:6383
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 08df796c1908646c721bf261d01604cfcde0bdec 192.168.75.100:6381
slots:[0-5460] (5461 slots) master
M: c71627fc6d20b9ca61fca76d1fd7e0adab02ec48 192.168.75.100:6382
slots:[5461-10922] (5462 slots) master
M: 1f37845789f52b4713200bbc4bc89dbad1fdfdf5 192.168.75.100:6383
slots:[10923-16383] (5461 slots) master
S: 16da45b459ba780926566fcda4407cf0798f01ca 192.168.75.100:6384
replicates c71627fc6d20b9ca61fca76d1fd7e0adab02ec48
S: 7ea18ad035fd83d1e6828022832915ffd7c1d89c 192.168.75.100:6385
replicates 1f37845789f52b4713200bbc4bc89dbad1fdfdf5
S: 1240de80a446da678036b886d11beddee60c6ba3 192.168.75.100:6386
replicates 08df796c1908646c721bf261d01604cfcde0bdec
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 192.168.75.100:6381)
M: 08df796c1908646c721bf261d01604cfcde0bdec 192.168.75.100:6381
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 16da45b459ba780926566fcda4407cf0798f01ca 192.168.75.100:6384
slots: (0 slots) slave
replicates c71627fc6d20b9ca61fca76d1fd7e0adab02ec48
M: c71627fc6d20b9ca61fca76d1fd7e0adab02ec48 192.168.75.100:6382
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 1240de80a446da678036b886d11beddee60c6ba3 192.168.75.100:6386
slots: (0 slots) slave
replicates 08df796c1908646c721bf261d01604cfcde0bdec
S: 7ea18ad035fd83d1e6828022832915ffd7c1d89c 192.168.75.100:6385
slots: (0 slots) slave
replicates 1f37845789f52b4713200bbc4bc89dbad1fdfdf5
M: 1f37845789f52b4713200bbc4bc89dbad1fdfdf5 192.168.75.100:6383
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
root@centos100:/data#
3、鏈接進入6381作為切入點,查看集羣狀態
root@centos100:/data# redis-cli -p 6381
127.0.0.1:6381> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6 #6個節點
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:188
cluster_stats_messages_pong_sent:198
cluster_stats_messages_sent:386
cluster_stats_messages_ping_received:193
cluster_stats_messages_pong_received:188
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:386
127.0.0.1:6381> cluster nodes
16da45b459ba780926566fcda4407cf0798f01ca 192.168.75.100:6384@16384 slave c71627fc6d20b9ca61fca76d1fd7e0adab02ec48 0 1653649433792 2 connected
c71627fc6d20b9ca61fca76d1fd7e0adab02ec48 192.168.75.100:6382@16382 master - 0 1653649433000 2 connected 5461-10922
1240de80a446da678036b886d11beddee60c6ba3 192.168.75.100:6386@16386 slave 08df796c1908646c721bf261d01604cfcde0bdec 0 1653649430699 1 connected
7ea18ad035fd83d1e6828022832915ffd7c1d89c 192.168.75.100:6385@16385 slave 1f37845789f52b4713200bbc4bc89dbad1fdfdf5 0 1653649432000 3 connected
1f37845789f52b4713200bbc4bc89dbad1fdfdf5 192.168.75.100:6383@16383 master - 0 1653649432777 3 connected 10923-16383
08df796c1908646c721bf261d01604cfcde0bdec 192.168.75.100:6381@16381 myself,master - 0 1653649431000 1 connected 0-5460
#根據輸出結果來看 1 -> 6 2 -> 4 3 -> 5
127.0.0.1:6381>
1.2.3 主從容錯切換遷移案例
數據讀寫存儲
1、通過exec進入一台redis
[root@centos100 ~]# docker exec -it redis-node-1 /bin/bash root@centos100:/data# redis-cli -p 6381 127.0.0.1:6381> keys * (empty array)
2、對6381新增幾個key
127.0.0.1:6381> set k1 v1 (error) MOVED 12706 192.168.75.100:6383 127.0.0.1:6381> set k2 v2 OK 127.0.0.1:6381> set k3 v3 OK 127.0.0.1:6381> set k4 v4 (error) MOVED 8455 192.168.75.100:6382 127.0.0.1:6381>
3、防止路由器失效,添加參數-c
root@centos100:/data# redis-cli -p 6381 -c 127.0.0.1:6381> flushall OK 127.0.0.1:6381> set vi k1 -> Redirected to slot [8048] located at 192.168.75.100:6382 OK 192.168.75.100:6382> set k2 v2 -> Redirected to slot [449] located at 192.168.75.100:6381 OK 192.168.75.100:6381> set k3 v3 OK 192.168.75.100:6381> set k4 v4 -> Redirected to slot [8455] located at 192.168.75.100:6382 OK
4、查看集羣信息
redis-cli --cluster check 192.168.75.100:6381
1.2.4 主從容錯的切換遷移
1、主6381和從機切換,先停止6381
[root@centos100 ~]# docker stop redis-node-1
redis-node-1
2、再次查看集羣信息
[root@centos100 ~]# docker exec -it redis-node-2 /bin/bash
root@centos100:/data# redis-cli -p 6382 -c
127.0.0.1:6382> cluster nodes
1240de80a446da678036b886d11beddee60c6ba3 192.168.75.100:6386@16386 master - 0 1653652908000 7 connected 0-5460
c71627fc6d20b9ca61fca76d1fd7e0adab02ec48 192.168.75.100:6382@16382 myself,master - 0 1653652904000 2 connected 5461-10922
08df796c1908646c721bf261d01604cfcde0bdec 192.168.75.100:6381@16381 master,fail - 1653652828089 1653652822986 1 disconnected
1f37845789f52b4713200bbc4bc89dbad1fdfdf5 192.168.75.100:6383@16383 master - 0 1653652906922 3 connected 10923-16383
7ea18ad035fd83d1e6828022832915ffd7c1d89c 192.168.75.100:6385@16385 slave 1f37845789f52b4713200bbc4bc89dbad1fdfdf5 0 1653652908000 3 connected
16da45b459ba780926566fcda4407cf0798f01ca 192.168.75.100:6384@16384 slave c71627fc6d20b9ca61fca76d1fd7e0adab02ec48 0 1653652908967 2 connected
3、還原之前的3主3從
[root@centos100 ~]# docker start redis-node-1
redis-node-1
[root@centos100 ~]# docker exec -it redis-node-1 /bin/bash
root@centos100:/data# redis-cli -p 6381 -c
127.0.0.1:6381> cluster nodes
16da45b459ba780926566fcda4407cf0798f01ca 192.168.75.100:6384@16384 slave c71627fc6d20b9ca61fca76d1fd7e0adab02ec48 0 1653653200093 2 connected
7ea18ad035fd83d1e6828022832915ffd7c1d89c 192.168.75.100:6385@16385 slave 1f37845789f52b4713200bbc4bc89dbad1fdfdf5 0 1653653202126 3 connected
1f37845789f52b4713200bbc4bc89dbad1fdfdf5 192.168.75.100:6383@16383 master - 0 1653653203142 3 connected 10923-16383
c71627fc6d20b9ca61fca76d1fd7e0adab02ec48 192.168.75.100:6382@16382 master - 0 1653653201111 2 connected 5461-10922
1240de80a446da678036b886d11beddee60c6ba3 192.168.75.100:6386@16386 master - 0 1653653200000 7 connected 0-5460
08df796c1908646c721bf261d01604cfcde0bdec 192.168.75.100:6381@16381 myself,slave 1240de80a446da678036b886d11beddee60c6ba3 0 1653653201000 7 connected
停止6386
[root@centos100 ~]# docker stop redis-node-6 redis-node-6
再啓動6386
[root@centos100 ~]# docker start redis-node-6 redis-node-6
查看集羣狀態
redis-cli --cluster check 192.168.75.100:6381
1.2.5 主從擴容案例
1、新建6387、6388兩個節點,新建後啓動,檢查是否8個節點
docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis --cluster-enabled yes --appendonly yes --port 6388
2、進入到6387容器內部
3、將新增的6387節點(空槽位)作為master節點加入原集羣
將新增的6387作為master節點加入集羣
redis-cli --cluster add-node 自己實際IP地址:6387 自己實際IP地址:6381
6387 就是將要作為master新增節點
6381 就是原來集羣節點裏面的領路人,相當於6387拜拜6381的碼頭從而找到組織加入集羣
redis-cli --cluster add-node 192.168.75.100:6387 192.168.75.100:6381
4、檢查集羣的情況第一次
root@centos100:/data# redis-cli --cluster check 192.168.75.100:6381
192.168.75.100:6381 (08df796c...) -> 2 keys | 5461 slots | 1 slaves.
192.168.75.100:6387 (987146b1...) -> 0 keys | 0 slots | 0 slaves.
192.168.75.100:6382 (c71627fc...) -> 2 keys | 5462 slots | 1 slaves.
192.168.75.100:6383 (1f378457...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 4 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.75.100:6381)
M: 08df796c1908646c721bf261d01604cfcde0bdec 192.168.75.100:6381
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 987146b1eb2e78155b1885312cc5fd92e4155b79 192.168.75.100:6387
slots: (0 slots) master
S: 7ea18ad035fd83d1e6828022832915ffd7c1d89c 192.168.75.100:6385
slots: (0 slots) slave
replicates 1f37845789f52b4713200bbc4bc89dbad1fdfdf5
S: 1240de80a446da678036b886d11beddee60c6ba3 192.168.75.100:6386
slots: (0 slots) slave
replicates 08df796c1908646c721bf261d01604cfcde0bdec
M: c71627fc6d20b9ca61fca76d1fd7e0adab02ec48 192.168.75.100:6382
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: 1f37845789f52b4713200bbc4bc89dbad1fdfdf5 192.168.75.100:6383
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 16da45b459ba780926566fcda4407cf0798f01ca 192.168.75.100:6384
slots: (0 slots) slave
replicates c71627fc6d20b9ca61fca76d1fd7e0adab02ec48
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
5、重新分配槽位
重新分派槽號命令:redis-cli --cluster reshard IP地址:端口號
6、第二次查看集羣情況
7、為主節點6387分配從節點6388
命令:redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主機節點ID redis-cli --cluster add-node 192.168.111.147:6388 192.168.111.147:6387 --cluster-slave --cluster-master-id e4781f644d4a4e4d4b4d107157b9ba8144631451-------這個是6387的編號,按照自己實際情況 redis-cli --cluster add-node 192.168.75.100:6388 192.168.75.100:6387 --cluster-slave --cluster-master-id 987146b1eb2e78155b1885312cc5fd92e4155b79
8、第三次查看集羣情況
redis-cli --cluster check 192.168.75.100:6381
1.2.6 主從縮容案例
目的:6387、6388下線
1、檢查集羣情況,獲得6387節點ID
aa69bde36b65c2985cadb634ee1616c4e4355717
2、從集羣中將4號從節點6388刪除
命令:redis-cli --cluster del-node ip:從機端口 從機6388節點ID redis-cli --cluster del-node 192.168.75.100:6388 aa69bde36b65c2985cadb634ee1616c4e4355717 檢查一下,可以發現6388已經被刪除 redis-cli --cluster check 192.168.75.100:6387
3、將6387槽位重新分配,本例將所有清出來的槽位都給6381
redis-cli --cluster reshard 192.168.75.100:6381
4、第二次檢查集羣情況
redis-cli --cluster check 192.168.75.100:6381 4096個槽位都指給6381,它變成了8192個槽位,相當於全部都給6381了,不然要輸入3次
5、將6387刪除
命令:redis-cli --cluster del-node ip:端口 6387節點ID redis-cli --cluster del-node 192.168.75.100:6387 987146b1eb2e78155b1885312cc5fd92e4155b79
6、第三次檢查集羣情況
1.3 補充:將容器設置為開機自啓
運行啓動容器時指定
docker run -p 3306:3306 --restart=always -d mysql:5.7
restart具體參數值詳細信息:
no 容器退出時,不重啓容器;
on-failure 只有在非0狀態退出時才從新啓動容器;
always 無論退出狀態是如何,都重啓容器;
創建時未指定
docker update --restart=always xxx
2. DockerFlie解析
2.1 是什麼?
DockerFile是用來構建Docker的文本文件,是由一條條構建鏡像所需的指令和參數構成的腳本
官網:官網地址
構建三步驟
1、編寫Dockerfile文件
2、docker bulid命令構建鏡像
3、docker run依照新鏡像有幸容器實例
2.2 DockerFlie構建過程解析
2.2.1 Dockerfile內容基礎知識
1、每條保留字指令都必須為大寫字母且後面要跟隨至少一個參數
2、指令按照從上到下,順序執行
3、#表示註釋
4、每條指令都會創建一個新的鏡像層並對鏡像進行提交
2.2.2 Docker執行DockerFile大致流程
1、docker從基礎鏡像運行一個容器
2、執行一條指令並對容器作出修改
3、執行類似docker commit的操作提交一個新的鏡像層
4、docker再基於剛提交的鏡像運行一個新容器
5、執行dockerfile中的下一條指令直到所有指令都執行完成
2.2.3 小總結
從應用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別代表軟件的三個不同階段,
* Dockerfile是軟件的原材料
* Docker鏡像是軟件的交付品
* Docker容器則可以認為是軟件鏡像的運行態,也即依照鏡像運行的容器實例
Dockerfile面向開發,Docker鏡像成為交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。
1、Dockerfile,需要定義一個Dockerfile,Dockerfile定義了進程需要的一切東西。Dockerfile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態鏈接庫、操作系統的發行版、服務進程和內核進程(當應用進程需要和系統服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等等;
2、Docker鏡像,在用Dockerfile定義一個文件之後,docker build時會產生一個Docker鏡像,當運行 Docker鏡像時會真正開始提供服務;
3、Docker容器,容器是直接提供服務的。
2.3 DockerFlie常用保留字指令
FROM:基礎鏡像,當前鏡像是基於哪個鏡像的,指定一個已經存在的鏡像作為模板,第一條必須是FROM
MAINTAINER:鏡像維護者的姓名和郵箱地址
RUN:容器在構建時需要運行的命令;有兩種格式:shell格式、exec格式;RUN是在docker build時運行
EXPOSE:當前容器對外暴露的端口
WORKDIR:指定在創建容器後,中斷默認登錄的進來的工作目錄,一個落腳點
USER:指定該鏡像是以什麼樣的用户去執行,如果不指定,默認是root
ENV:用來在構建鏡像的過程中配置環境變量
VOLUME:數據容器卷,用於數據保存和持久化工作
ADD:將宿主機目錄下的文件拷貝進鏡像,且會自動處理url和解壓tar包
COPY:類似ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置
CMD:指定容器啓動後要乾的事
注意:Dockerfile 中可以有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 之後的參數替換
和RUN之間的區別:CMD是在docker run時運行;RUN是在docker build時運行
ENTRYPOINT:也是用來指定一個容器啓動時要運行的命令
ENTRYPOINT可以和CMD一起用,一般是變參才會使用 CMD ,這裏的 CMD 等於是在給 ENTRYPOINT 傳參。
當指定了ENTRYPOINT後,CMD的含義就發生了變化,不再是直接運行其命令而是將CMD的內容作為參數傳遞給ENTRYPOINT指令,他兩個組合會變成“”
2.4 案例
2.4.1 自定義鏡像mycentosjava8
1、要求:Centos具備vim+ifconfig+jdk8
JDK下載的鏡像地址
2、編寫
準備編寫Dockerfile文件(D大寫)
FROM centos
#FROM centos:centos7
#實際操作時,centos最新版有問題,這裏改成centos7就可以執行成功了
MAINTAINER xie<xie@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安裝vim編輯器
RUN yum -y install vim
#安裝ifconfig命令查看網絡IP
RUN yum -y install net-tools
#安裝java8及lib庫
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相對路徑jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安裝包必須要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java環境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
3、構建
docker build -t 新鏡像名字:TAG .
2.4.2 虛懸鏡像
1、是什麼?
倉庫名、標籤都是的鏡像,俗稱dangling image
[root@centos100 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 931a26959578 5 seconds ago 72.8MB
2、寫一個案例
2.1、
vim Dockerfilefrom ubuntu CMD echo 'action is success'
2.2、
docker build .3、查看所有虛懸鏡像
docker image ls -f dangling=true4、刪除
docker image prune
2.4.3 自定義鏡像myUbuntu
1、要求:Ubuntu+vim+ifconfig+jdk8
2、編寫Dockerfile文件
from ubuntu
maintainer xie<xie@163.com>
env MYPATH /usr/local
workdir $MYPATH
run apt-get update
run apt-get install -y vim
run apt-get install -y net-tools
run mkdir /usr/local/java
add jdk-8u171-linux-x64.tar.gz /usr/local/java
env JAVA_HOME /usr/local/java/jdk1.8.0_171
env JRE_HOME $JAVA_HOME/jre
env CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
env PATH $JAVA_HOME/bin:$PATH
expose 80
cmd echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
3、構建
docker build -t myubuntu:1.8 .
3. Docker微服務實戰
3.1 通過IDEA創建一個普通的微服務模塊
yml配置
server:
port: 6001
創建一個簡單的Controller
@RestController
public class OrderController {
@Value("${server.port}")
private String port;
Random random = new Random();
@RequestMapping("/order/docker")
public String helloDocker() {
return "hello docker " + "\t" + port + random.nextInt(1000000);
}
@RequestMapping(value = "/order/index", method = RequestMethod.GET)
public String index() {
return "端口號:" + port + "\t" + random.nextInt(1000000);
}
}
其餘部分都是springboot自動生成的代碼
之後通過maven打包,上傳到centos上
3.2 通過Dockerfile發佈微服務部署到Docker中
1、編寫Dockerfile文件
# 基礎鏡像使用java FROM java:8 # 作者 MAINTAINER xie # VOLUME 指定臨時文件目錄為/tmp,在主機/var/lib/docker目錄下創建了一個臨時文件並鏈接到容器的/tmp VOLUME /tmp # 將jar包添加到容器中並更名為xie_docker.jar # test-0.0.1-SNAPSHOT.jar為打包好的jar文件 ADD test-0.0.1-SNAPSHOT.jar xie_docker.jar # 運行jar包 RUN bash -c 'touch /zzyy_docker.jar' ENTRYPOINT ["java","-jar","/zzyy_docker.jar"] #暴露6001端口作為微服務 EXPOSE 6001
2、構建鏡像
docker build -t xie_docker:1.8 .3、運行容器
docker run -d -p 6001:6001 xie_docker:1.84、訪問測試
使用
curl 127.0.0.1:6001/order/index可以測試連接也能直接使用瀏覽器訪問
4. Docker網絡
4.1 是什麼
Docker不啓動時,默認的網絡情況有
nes33
lo
virbr0
Docker啓動後,會多出來一個docker0
4.2 常用的基本命令
查看網絡
docker network ls查看網絡源數據
docker network inspect xx網絡名字新建網絡
docker network create xx網絡名字刪除網絡
docker network rm xx網絡名
4.3 能幹啥
容器間的互聯和通信以及端口映射
容器IP變動時,可以通過服務名直接網絡通信而不受影響
4.4 網絡模式
1、總體介紹
2、容器實例內默認網絡IP生產規則
docker容器內部的ip是有可能會發生改變的
3、案例説明
3.1 before
Docker 服務默認會創建一個 docker0 網橋(其上有一個 docker0 內部接口),該橋接網絡的名稱為docker0,它在內核層連通了其他的物理或虛擬網卡,這就將所有容器和本地主機都放到同一個物理網絡。Docker 默認指定了 docker0 接口 的 IP 地址和子網掩碼,讓主機和容器之間可以通過網橋相互通信。 # 查看 bridge 網絡的詳細信息,並通過 grep 獲取名稱項 docker network inspect bridge | grep name
説明
1 Docker使用Linux橋接,在宿主機虛擬一個Docker容器網橋(docker0),Docker啓動一個容器時會根據Docker網橋的網段分配給容器一個IP地址,稱為Container-IP,同時Docker網橋是每個容器的默認網關。因為在同一宿主機內的容器都接入同一個網橋,這樣容器之間就能夠通過容器的Container-IP直接通信。 2 docker run 的時候,沒有指定network的話默認使用的網橋模式就是bridge,使用的就是docker0。在宿主機ifconfig,就可以看到docker0和自己create的network(後面講)eth0,eth1,eth2……代表網卡一,網卡二,網卡三……,lo代表127.0.0.1,即localhost,inet addr用來表示網卡的IP地址 3 網橋docker0創建一對對等虛擬設備接口一個叫veth,另一個叫eth0,成對匹配。 3.1 整個宿主機的網橋模式都是docker0,類似一個交換機有一堆接口,每個接口叫veth,在本地主機和容器內分別創建一個虛擬接口,並讓他們彼此聯通(這樣一對接口叫veth pair); 3.2 每個容器實例內部也有一塊網卡,每個接口叫eth0; 3.3 docker0上面的每個veth匹配某個容器實例內部的eth0,兩兩配對,一一匹配。 通過上述,將宿主機上的所有容器都連接到這個內部網絡上,兩個容器在同一個網絡下,會從這個網關下各自拿到分配的ip,此時兩個容器的網絡是互通的。
3.2 host
直接使用宿主機的 IP 地址與外界進行通信,不再需要額外進行NAT 轉換。
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8説明
容器將不會獲得一個獨立的Network Namespace, 而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網卡而是使用宿主機的IP和端口。
3.3 none(一般)
docker run -d --network none --name tomcat84 billygoo/tomcat8-jdk8禁用網絡功能,只有lo標識(就是127.0.0.1表示本地迴環)
3.4 container
新建的容器和已經存在的一個容器共享一個網絡ip配置而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口範圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。
docker run -d -p 8085:8080 --name tomcat85 billygoo/tomcat8-jdk8 docker run -d -p 8086:8080 --network contoiner:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8 會報錯:Error response from daemon: network contoiner:tomcat85 not found 相當於tomcat86和tomcat85公用同一個ip同一個端口,導致端口衝突 本案例用tomcat演示不合適。。。 docker run --name alpine1 -it alpine /bin/sh docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
假如關閉了alpine1,此時alpine2只剩下了lo
3.5 自定義網絡
案例:
使用前
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8 docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8 上述成功啓動後使用exec進入容器內部 此時,使用ip是可以ping通的,但是按照服務名不能ping通
使用後
1、新建自定義網絡
[root@centos100 ~]# docker network create xie_docker 18f2f2b3ccd5807bbcee3e6d9a7f46b94835fe48eb43745826e41ce170424c8b [root@centos100 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE a4f9a806ff66 bridge bridge local c42dec6263e3 host host local 9c9907fd4f93 none null local 18f2f2b3ccd5 xie_docker bridge local
2、新建容器加入到上一步創建的網絡中
docker run -it -p 8081:8080 --network xie_docker --name tomcat81 billygoo/tomcat8-jdk8 /bin/bash docker run -it -p 8082:8080 --network xie_docker --name tomcat82 billygoo/tomcat8-jdk8 /bin/bash
此時,通過互相ping可以ping通
自定義網絡本身就維護好了主機名和ip的對應關係(ip和域名都能通)
5. Docker-compose容器編排
5.1 是什麼
Docker-Compose是Docker官方的開源項目,負責實現Docker容器集羣快速編排
Compose 是 Docker 公司推出的一個工具軟件,可以管理多個 Docker 容器組成一個應用。你需要定義一個 YAML 格式的配置文件docker-compose.yml,寫好多個容器之間的調用關係。然後,只要一個命令,就能同時啓動/關閉這些容器
5.2 能幹啥
docker建議我們每一個容器中只運行一個服務,因為docker容器本身佔用資源極少,所以最好是將每個服務單獨的分割開來但是這樣我們又面臨了一個問題?
如果我需要同時部署好多個服務,難道要每個服務單獨寫Dockerfile然後在構建鏡像,構建容器,這樣累都累死了,所以docker官方給我們提供了docker-compose多服務部署的工具
例如要實現一個Web微服務項目,除了Web服務容器本身,往往還需要再加上後端的數據庫mysql服務容器,redis服務器,註冊中心eureka,甚至還包括負載均衡容器等等。。。。。。
Compose允許用户通過一個單獨的docker-compose.yml模板文件(YAML 格式)來定義一組相關聯的應用容器為一個項目(project)。
可以很容易地用一個配置文件定義一個多容器的應用,然後使用一條指令安裝這個應用的所有依賴,完成構建。Docker-Compose 解決了容器與容器之間如何管理編排的問題。
5.3 去哪下載
官網
官網下載
安裝步驟
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose //查看是否安裝完成 docker-compose --version
卸載步驟
sudo rm /usr/local/lib/docker/cli-plugins/docker-compose
5.4 Compose核心概念
一文件:docker-compose.yml
兩要素:
服務:一個個應用容器實例,比如訂單微服務、庫存微服務、mysql容器、nginx容器或者redis容器
工程:由一組關聯的應用容器組成的一個完整業務單元,在docker-compose.yml 文件中定義。
5.5 Compose使用的三個步驟
1、編寫Dockerfile定義各個微服務,並構建出對應的鏡像文件
2、使用docker-compose.yml定義一個完整的業務單元,安排好整體應用中的容器服務
3、最後,執行
docker-compose up命令來啓動並運行整個應用程序,完成一鍵部署上線
5.6 Compose常用命令
Compose常用命令
docker-compose -h # 查看幫助
docker-compose up # 啓動所有docker-compose服務
docker-compose up -d # 啓動所有docker-compose服務並後台運行
docker-compose down # 停止並刪除容器、網絡、卷、鏡像。
docker-compose exec yml裏面的服務id # 進入容器實例內部 docker-compose exec docker-compose.yml文件中寫的服務id /bin/bash
docker-compose ps # 展示當前docker-compose編排過的運行的所有容器
docker-compose top # 展示當前docker-compose編排過的容器進程
docker-compose logs yml裏面的服務id # 查看容器輸出日誌
docker-compose config # 檢查配置
docker-compose config -q # 檢查配置,有問題才有輸出
docker-compose restart # 重啓服務
docker-compose start # 啓動服務
docker-compose stop # 停止服務
5.7 Compose編排服務
編寫Docker-Compose.yml文件
version: "3"
services:
microService:
image: zzyy_docker:1.6
container_name: ms01
ports:
- "6001:6001"
volumes:
- /app/microService:/data
networks:
- atguigu_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- atguigu_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWRD: 'no'
MYSQL_DATABASE: 'db2021'
MYSQL_USER: 'zzyy'
MYSQL_PASSWORD: 'zzyy123'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- atguigu_net
command: --default-authentication-plugin=mysql_native_password #解決外部無法訪問
networks:
atguigu_net:
執行docker-compose up -d
[root@centos100 testpackage]# docker-compose up -d
Creating testpackage_mysql_1 ... done
Creating testpackage_redis_1 ... done
Creating ms01 ... done
測試
關停docker-compose stop
[root@centos100 testpackage]# docker-compose stop
Stopping ms01 ... done
Stopping testpackage_redis_1 ... done
Stopping testpackage_mysql_1 ... done
6. Docker輕量級可視化工具Portainer
6.1 是什麼
Portainer 是一款輕量級的應用,它提供了圖形化界面,用於方便地管理Docker環境,包括單機環境和集羣環境。
6.2 安裝
官網安裝
1、安裝命令
docker run -d -p 8000:8000 -p 9000:9000 --name portainer \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:2.9.3
2、第一次登錄需創建admin,訪問地址:xxx.xxx.xxx.xxx:9000
3、設置admin用户和密碼後首次登陸
4、選擇local選項卡後本地docker詳細信息展示
7. Docker容器監控之CAdvisor+InfluxDB+Granfana
7.1 原生命令
docker stats問題
通過docker stats命令可以很方便的看到當前宿主機上所有容器的CPU,內存以及網絡流量等數據,一般小公司夠用了。。。。 但是, docker stats統計結果只能是當前宿主機的全部容器,數據資料是實時的,沒有地方存儲、沒有健康指標過線預警等功能
7.2 是什麼
容器監控3劍客
CAdvisor
InfluxDB
Granfana
7.3 使用
1、新建目錄
2、新建三件套的docker-compose.yml
version: '3.1'
volumes:
grafana_data: {}
services:
influxdb:
image: tutum/influxdb:0.9
restart: always
environment:
- PRE_CREATE_DB=cadvisor
ports:
- "8083:8083"
- "8086:8086"
volumes:
- ./data/influxdb:/data
cadvisor:
image: google/cadvisor
links:
- influxdb:influxsrv
command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
restart: always
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
grafana:
user: "104"
image: grafana/grafana
user: "104"
restart: always
links:
- influxdb:influxsrv
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- HTTP_USER=admin
- HTTP_PASS=admin
- INFLUXDB_HOST=influxsrv
- INFLUXDB_PORT=8086
- INFLUXDB_NAME=cadvisor
- INFLUXDB_USER=root
- INFLUXDB_PASS=root
3、啓動docker-compose文件
docker-compose up -d4、查看三個服務容器是否啓動
5、測試
瀏覽cAdvisor收集服務,http://ip:8080/
瀏覽influxdb存儲服務,http://ip:8083/
瀏覽grafana展現服務,http://ip:3000