Docker概述
Docker 為什么出現?
一款產品:開發-上線 兩套環境!應用環境,應用配置!
開發 --- 運維問題:我在我的電腦上可以運行!版本更新,導致服務不可用!對於運維來說,考驗就變大了?
開發即運維!
環境配置是十分的麻煩,每一個機器都要部署環境(Redis、ES、Hadoop) ,費時費力
發布一個項目jar(Redis、MySQL、jdk、ES)項目能不能帶上環境安裝打包!
之前在服務器配置一個環境Redis、MySQL、jdk、ES、Hadoop,配置很麻煩,不能夠跨平台
如果在Windows配置,最后部署發布在Linux的話,是會有天壤之別
傳統:丟一個jar包,運維去做
現在:開發打包部署上線,一套流程做完!
java --- apk(軟件)--- 發布(應用商店) ---- 現在有一個用戶去使用這個軟件 -- 安裝就可以使用
java --- jar(環境都在里面) --- 打包項目帶上環境(鏡像) ---(Docker倉庫:就好比上面的商店)--- 如果現在有人需要用(直接運行即可)
Docker給以上的問題,提出了解決方案
Docker的思想就來自於集裝箱
如果現在java運行環境(JRE) -- 跑了多個應用(端口沖突) --- 原來都是交叉的!
隔離:Docker核心思想!打包裝箱!每個箱子都是互相隔離
Docker的歷史
2010年,有幾個搞IT的年輕人,在美國dotCloud
做一下pass的雲計算服務 ! LXC有關的容器技術
他們將自己的技術(容器化技術)命名就是Docker!
Docker 剛剛誕生,沒有引起行業的注意!dotCloud,就或不下去
開源
開放源代碼!
2013年,Docker開源
Docker越來越多人發現docker的優點火了,Docker每個一個月就更新一個版本
2014年4月9日,Docker1.0發布!
Docker為什么這么火?十分的輕巧!
在容器技術出來之前,我們都是使用虛擬機技術!
虛擬機:在window中裝一個Vmware,通過這個軟件我們可以虛擬出來一台或者多台電腦!笨重!
虛擬機也是屬於虛擬化技術,Docker容器技術,也是一種虛擬化技術
vm, linux centos原生鏡像(一個電腦!) 隔離,需要開啟多個虛擬機
docker 隔離,鏡像(最核心的環境 4m + jdk + mysql) 十分的小巧,運行鏡像就可以!小巧!幾個M kb秒級啟動
到現在,所有開發人員都必須要會Docker!
聊聊Docker
Docker 是基於Go語言開發的!開發項目
文檔地址:https://docs.docker.com/develop/
Docker能干嘛
虛擬機技術缺點:
1.資源占用十分多
2.冗余步驟多
3.啟動很慢
容器化技術
容器化技術不是模擬的一個完整的操作系統
比較Docker 和虛擬機技術的不同:
- 傳統虛擬機,虛擬出一條硬件,運行一個完整的操作系統,然后再這個系統上安裝和運行軟件
- 容器內的應用直接運行在宿主機的內容,容器是沒有自己的內核的,也沒有虛擬我們的硬件,所以就輕便了
- 每個容器間是相互隔離,每個容器內都有一個屬於自己的的文件系統,互不影響
DevOps(開發,運維)
應用更快速的交付和部署
傳統:一堆幫助文檔,安裝程序
Docker:一鍵運行打包鏡像發布測試,一鍵運行
更便捷的升級和擴展和擴縮容
使用Docker之后,我們部署應用和搭積木一樣
項目打包為一個鏡像,擴展 服務器A 服務器B
更簡單的運維
在容器化之后,我們的開發,測試環境都是高度一致
更高效的計算資源利用
Docker是內核級別的虛擬化,可以再一個物理機可以運行很多容器實例!服務器的性能可以被壓榨到極致
Docker安裝
Docker的基本組成 😭
圖片顯示不了就網上找
鏡像(image):
docker鏡像就好比是一個模板,可以通過這個模板來創建容器服務,tomcat鏡像 => run=> tomcat01容器(提供服務器),通過這個鏡像可以創建多個容器,(最終服務運行或者項目運行就是在容器中)
容器(container):
Docker利用容器技術,獨立運行一個或者一個組應用,通過鏡像來創建的
啟動,停止,刪除,基本命令
目前就可以把這個容器理解為就是一個簡易的Linux的系統
倉庫(repository)
倉庫就是存放鏡像的地方!
倉庫分為公有倉庫和私有倉庫!
Docker Hub
安裝Docker
環境准備
1、需要會點linux的基礎
2、CentOS 7
3、我們使用Xshell連接遠程服務器進行操作!
查看環境
# 系統內核是3.10
[root@iZwz94cw1gup8aldclit1qZ ~]# uname -r
3.10.0-1062.18.1.el7.x86_64
[root@iZwz94cw1gup8aldclit1qZ ~]# uname -r
3.10.0-1062.18.1.el7.x86_64
[root@iZwz94cw1gup8aldclit1qZ ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安裝
幫助文檔
# 1.卸載舊的版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2.需要的安裝包
yum install -y yum-utils
# 3.設置鏡像的倉庫
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默認是國外的
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里雲
# 更新yum軟件包索引
yum makecache fast
# 5.安裝docker 相關的內容 docker-ce社區版 ee企業版
yum install docker-ce docker-ce-cli containerd.io
# 6.啟動docker
systemctl start docker
# 注意需要啟動進行以下一系列的操作
# 不然會報 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
# 查看版本
[root@iZwz94cw1gup8aldclit1qZ /]# docker version
Client: Docker Engine - Community
Version: 19.03.11
API version: 1.40
Go version: go1.13.10
Git commit: 42e35e61f3
Built: Mon Jun 1 09:13:48 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.11
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 42e35e61f3
Built: Mon Jun 1 09:12:26 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
# 8、查看一下下載的這個 hello-world 鏡像
[root@iZwz94cw1gup8aldclit1qZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 5 months ago 13.3kB
了解:卸載docker
# 1.卸載依賴
yum remove docker-ce docker-ce-cli containerd.io
# 2.刪除資源
rm -rf /var/lib/docker
# /var/lib/docker docker的默認路徑
阿里鏡像加速
1.登錄阿里雲找到
2.找到鏡像加速地址
3.配置使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://p3jr2wkc.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker # 啟動
回顧HelloWorld流程
Docker運行原理圖:
DockerHub:是一個倉庫
底層原理
Docker是怎么工作的?
Docker是一個Client-Server 結構的系統,Docker的守護進程運行在主機上,通過Socket從客戶端訪問!
DockerServer接收到Docker-Client的指令,就會執行這個命令
Docker 為什么比VM快?
1、Docker有着比虛擬機更少的抽象層
2、docker利用的是宿主機的內核,vm需要的是Guest OS
所以說,新建一個容器的時候,docker不需要像虛擬機一樣重新加載一個操作系統內核,避免引導,虛擬機是加載Guest OS,分鍾級別的,而docker是利用宿主機的操作系統,省略復雜的過程,秒級
Docker的常用命令
幫助命令
docker version # 顯示版本信息
docker info # 顯示docker的系統信息,包括鏡像和容器數量
docker 命令 --help # 幫助命令
幫助文檔的地址:https://docs.docker.com/reference/
鏡像命令
docker images 查看所有本地的主機上的鏡像
[root@iZwz94cw1gup8aldclit1qZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 5 months ago 13.3kB
# 解析
REPOSITORY #鏡像的倉庫源
TAG #鏡像的標簽
IMAGE ID #鏡像的id
CREATED #鏡像的創建時間
SIZE #鏡像的大小
[root@iZwz94cw1gup8aldclit1qZ /]# docker images --help
Options:可選項
-a, --all # 列出所有鏡像
-q, --quiet # 只顯示鏡像的id
移除所有鏡像
[root@iZwz94cw1gup8aldclit1qZ /]# docker rmi -f $(docker ps -aq)
docker search 搜索鏡像
[root@iZwz94cw1gup8aldclit1qZ /]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9582 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3482 [OK]
# 可選項 ,通過收藏來過濾
docker search mysql --filter=STARS=3000 #搜索出來的鏡像就是STARS大與3000的
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9582 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3482 [OK]
[root@iZwz94cw1gup8aldclit1qZ /]# docker search mysql --filter=STARS=5000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9582 [OK]
docker pull 下載鏡像
# 下載鏡像docker pull 鏡像名
[root@iZwz94cw1gup8aldclit1qZ /]# docker pull mysql
Using default tag: latest # 如果不寫tag 默認既是最新版
latest: Pulling from library/mysql
afb6ec6fdc1c: Pull complete # 分層下載,docker iamge的核心,聯合文件系統
0bdc5971ba40: Pull complete
97ae94a2c729: Pull complete
f777521d340e: Pull complete
1393ff7fc871: Pull complete
a499b89994d9: Pull complete
7ebe8eefbafe: Pull complete
597069368ef1: Pull complete
ce39a5501878: Pull complete
7d545bca14bf: Pull complete
211e5bb2ae7b: Pull complete
5914e537c077: Pull complete
Digest: sha256:a31a277d8d39450220c722c1302a345c84206e7fd4cdb619e7face046e89031d #簽名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真實地址
# 等價於它
docker pull mysql == docker.io/library/mysql:latest
#指定版本下載
[root@iZwz94cw1gup8aldclit1qZ /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
afb6ec6fdc1c: Already exists
0bdc5971ba40: Already exists
97ae94a2c729: Already exists
f777521d340e: Already exists
1393ff7fc871: Already exists
a499b89994d9: Already exists
7ebe8eefbafe: Already exists
4eec965ae405: Pull complete
a531a782d709: Pull complete
270aeddb45e3: Pull complete
b25569b61008: Pull complete
Digest: sha256:d16d9ef7a4ecb29efcd1ba46d5a82bda3c28bd18c0f1e3b86ba54816211e1ac4
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker rmi 刪除鏡像
[root@iZwz94cw1gup8aldclit1qZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 a4fdfd462add 2 weeks ago 448MB
mysql latest 30f937e841c8 2 weeks ago 541MB
hello-world latest bf756fb1ae65 5 months ago 13.3kB
[root@iZwz94cw1gup8aldclit1qZ /]# docker rmi -f bf756fb1ae65 #刪除指定的容器
Untagged: hello-world:latest
Untagged: hello-world@sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
[root@iZwz94cw1gup8aldclit1qZ /]# docker rmi -f a4fdfd462add
Untagged: mysql:5.7
Untagged: mysql@sha256:d16d9ef7a4ecb29efcd1ba46d5a82bda3c28bd18c0f1e3b86ba54816211e1ac4
Deleted: sha256:a4fdfd462add8e63749aa08ff0044b13d342a042965f1ec6744586cda10dfce9
Deleted: sha256:637f0ff7e591e53fe997c634cf10e63ab810dd1d6cb587ce46a57f753c36bdbf
Deleted: sha256:65ba4d5ac7eb5218cfb4be1e7807584425c19f47606bc1e6d53e050d480d9581
Deleted: sha256:7d0236d50948d993a686c69889c6f016a8da89b8557c5e0eaf6af145ea5877cb
Deleted: sha256:a6219b1270405f43892a7a12895ae1e0ccff307d162cf0025df3ed87f511754b
[root@iZwz94cw1gup8aldclit1qZ /]# docker rmi -f $(docker images -aq) # 刪除全部的容器
Untagged: mysql:latest
Untagged: mysql@sha256:a31a277d8d39450220c722c1302a345c84206e7fd4cdb619e7face046e89031d
Deleted: sha256:30f937e841c82981a9a6363f7f6f35ed6b9d5e3f16df50a72207e4a2a389983f
Deleted: sha256:8a5e032615340d8936e0e3707a39ce3da51dc952368176818f879e2f868b535b
Deleted: sha256:c74673a735ca31b9b5162808ab451a8b20876a15e16a7899f2101f3c9b82df60
Deleted: sha256:430365c8e22a9207dca4638c523dc82163bca3ab8a335a71147af41d1551561f
Deleted: sha256:1ede41b1dbec1a5e4385200b62283ffb25c425275530ea9e9cc36b921186cd08
Deleted: sha256:2f6badb9fd9965261d3463591f8af4afddf5f141456de83dc994690ae64b34eb
Deleted: sha256:37803884320881cd931c77dea2ee4d8a7231dfed5a02dc595e6046ffacfa6e1b
Deleted: sha256:cefc9066dc1aa84f6cddead1bb5a8c590e8368d56fb65694e8783d70791bec20
Deleted: sha256:3bfbd2dd4507386ce56fd731b3c97d10bc058e6aa478f901466da69108db50e1
Deleted: sha256:9652363dd4c1146b3f9a519800a9f379adf0b6c4f9aece1ffe965dce5f52a8ca
Deleted: sha256:0ed190016efa0f19bcc5f1d66ffffc7b09716f3c57bcc5de74a4ce217af92278
Deleted: sha256:8399fb13d72603fdc8781075672ee25fedf8384f6721639a70dd3533250ed9e4
Deleted: sha256:ffc9b21953f4cd7956cdf532a5db04ff0a2daa7475ad796f1bad58cfbaf77a07
# docker rmi -f 鏡像id #刪除指定的容器
# docker rmi -f 鏡像id,鏡像id,鏡像id #刪除多個容器
# docker rmi -f $(docker images -aq) # 刪除全部的容器
容器命令
說明:我們有了鏡像才可以創建容器,linux,下載一個centos 鏡像來測試學習
docker pull centos
新建容器並啟動
docker run [可選參數] image
# 參數說明
--name=“Name" 容器名字 tomcat01 tomcat02 用來區分容器
-d 后台方式運行
-it 使用交互方式運行,進入容器查看內容
-p 指定容器的端口 -p 8080
-p ip:主機段端口:容器端口
-p 主機端口:容器端口(常用)
-p 容器端口
容器端口
-P 隨機指定端口
# 啟動並進入到容器
[root@iZwz94cw1gup8aldclit1qZ /]# docker run -it centos /bin/bash
[root@d3757d18a8e7 /]#
列出所有的運行的容器
# docker ps 命令
#列出當前正在運行的容器
-a #列出當前正在運行的容器,帶出歷史運行過的容器
-n=? #顯示最近創建的容器
-q #只顯示容器編號
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3757d18a8e7 centos "/bin/bash" 3 minutes ago Exited (0) About a minute ago heuristic_wilson
01c7eef64c15 bf756fb1ae65 "/hello" 2 hours ago Exited (0) 2 hours ago
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps -a -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3757d18a8e7 centos "/bin/bash" 7 minutes ago Exited(0) 5 minutes ago heuristic_wilson
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps -aq
d3757d18a8e7
01c7eef64c15
退出容器
exit #直接退出容器
Ctrl + p + q # 容器不停止直接退出
# 查看
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORT NAMES
27f5afcc55c2 centos "/bin/bash" 34 seconds ago Up 33 seconds hopeful_banach
刪除容器
docker rm 容器id #刪除指定的容器 不能刪除正在運行的容器,如果要強制刪除rm -f
docker rm -f $(docker ps -aq) #刪除所有的容器
docker ps -aq | xargs docker rm -f #刪除所有的容器
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps -aq | xargs docker rm -f
27f5afcc55c2
啟動和停止容器的操作
docker start 容器id # 啟動容器
docker restart 容器id # 重啟容器
docker stop 容器id # 停止當前正在運行的容器
docker kill 容器id # 強制停止當前容器
常用其他命令
后台啟動容器
# 命令 docker run -d 鏡像名
[root@iZwz94cw1gup8aldclit1qZ /]# docker run -d centos
# 問題docker ps 發現centos 停止了
# 常見的坑:docker 容器使用后台運行,就必須要有一個前台進程,docker發現沒有應用,就會自動停止
# nginx,容器啟動后,發現自己沒有提供服務,就會立即停止,沒有程序就會停止
查看日志命令
# docker logs -f -t --tail 100 79b8c8f83b8f 查看前100條的日志
# 如果沒有日志的話,自己寫一個Shell腳本
# 通過docker寫一個shell腳本
[root@2fae659c4a46 tmp]# vi hello.sh
#! /bin/bash
while
true
do
echo 'hello shell'
sleep 1;
done
# 顯示日志
-tf # 顯示日志
--tail number #要顯示日志條數
# 這里需要服務器宿主機進行訪問
docker logs -tf --tail 10 2fae659c4a46
如下可以看到一監控,運行hell.sh宿主機就能夠檢測到日志
查看鏡像元數據
[root@iZwz94cw1gup8aldclit1qZ tmp]# docker inspect 22fa19932db2
[
{
"Id": "22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b",
"Created": "2020-06-04T15:31:42.802413935Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 8240,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-06-04T15:31:43.103749077Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:470671670cac686c7cf0081e0b37da2e9f4f768ddc5f6a26102ccd1c6954c1ee",
"ResolvConfPath": "/var/lib/docker/containers/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b/hostname",
"HostsPath": "/var/lib/docker/containers/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b/hosts",
"LogPath": "/var/lib/docker/containers/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b-json.log",
"Name": "/sad_euclid",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Capabilities": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/577a554570a3b45302c3991c84d0ab78bbbf10ac559e23d688d8c88b84b64b28-init/diff:/var/lib/docker/overlay2/8da4cd669d4ba75e5aae59a0b99b386b7b54dd58da758a3eb56f91da3e3b460f/diff",
"MergedDir": "/var/lib/docker/overlay2/577a554570a3b45302c3991c84d0ab78bbbf10ac559e23d688d8c88b84b64b28/merged",
"UpperDir": "/var/lib/docker/overlay2/577a554570a3b45302c3991c84d0ab78bbbf10ac559e23d688d8c88b84b64b28/diff",
"WorkDir": "/var/lib/docker/overlay2/577a554570a3b45302c3991c84d0ab78bbbf10ac559e23d688d8c88b84b64b28/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "22fa19932db2",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200114",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS",
"org.opencontainers.image.created": "2020-01-14 00:00:00-08:00",
"org.opencontainers.image.licenses": "GPL-2.0-only",
"org.opencontainers.image.title": "CentOS Base Image",
"org.opencontainers.image.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "d4b50f9c15899a2ca59357d0d9c3effd8e42bc020c3a2ef63781b1a4f7f3d959",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/d4b50f9c1589",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "fb48cf4c42e91609af0ecb640797381368bb1f6df389426b4ffcb1b553803b29",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.8",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:08",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "97e9416f43bc7aedbbbf68e8397b5ea42431efb6a002f26187e2729c7de00ae5",
"EndpointID": "fb48cf4c42e91609af0ecb640797381368bb1f6df389426b4ffcb1b553803b29",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.8",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:08",
"DriverOpts": null
}
}
}
}
]
進入當前正在運行的容器
# 我們通常容器都是使用后台方式運行的,需要進入容器,修改一些配置
# 命令
docker exec -it 容器
# 第一種
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
713f94102873 centos "/bin/bash" 18 minutes ago Up 18 minutes elated_dhawan
22fa19932db2 centos "/bin/bash" 35 minutes ago Up 35 minutes sad_euclid
2fae659c4a46 centos "/bin/bash" 44 minutes ago Up 44 minutes zealous_stonebraker
c0d60da80c75 centos "/bin/bash" 2 hours ago Up 2 hours xenodochial_northcutt
8cbeb2158afc centos "/bin/bash" 3 hours ago Up 3 hours unruffled_swirles
51184e1e6ec3 centos "/bin/bash" 3 hours ago Up 3 hours jovial_roentgen
5bb81e29582d centos "/bin/bash" 3 hours ago Up 3 hours nice_mayer
79b8c8f83b8f centos "/bin/bash" 6 hours ago Up 6 hours elegant_lalande
[root@iZwz94cw1gup8aldclit1qZ /]# docker exec -it 5bb81e29582d /bin/bash
[root@5bb81e29582d /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@5bb81e29582d /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:06 pts/0 00:00:00 /bin/bash
root 19 0 0 16:08 pts/1 00:00:00 /bin/bash
root 33 19 0 16:08 pts/1 00:00:00 ps -ef
[root@5bb81e29582d /]#
#第二種
[root@iZwz94cw1gup8aldclit1qZ /]# docker attach 22fa19932db2
[root@22fa19932db2 tmp]# ls
ks-script-_srt3u3c ks-script-gpqu_kuo
[root@22fa19932db2 tmp]# cd ..
[root@22fa19932db2 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@22fa19932db2 /]# cd tmp
# docker exec -it 容器id # 進入容器后開啟一個新的終端,可以在里面操作(常用)
# docker attach 容器id # 進入容器正在執行的終端,不會啟動新的進程
從容器內拷貝文件到主機上
# 進入到容器中
docker exec -it 51184e1e6ec3 /bin/bash
# 在容器中新建一個文件
[root@51184e1e6ec3 home]# touch rzk.java
[root@51184e1e6ec3 home]# ls
rzk.java
[root@51184e1e6ec3 home]# exit
exit
# 把這個文件拷貝出來到我們主機上
[root@iZwz94cw1gup8aldclit1qZ /]# ls
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@iZwz94cw1gup8aldclit1qZ /]# docker cp 51184e1e6ec3:/home/rzk.java /tmp
[root@iZwz94cw1gup8aldclit1qZ tmp]# ls
hello.sh hsperfdata_root rzk.java
#拷貝是一個手動的過程,未來我們使用的是 -v卷的技術可以實現
Docker 安裝Nginx
1.搜索 nginx
# docker search nginx
2.下載 nginx
# docker pull nginx
3.運行測試
這里的 # -p 3344:80
# -p 暴露防火牆端口 通過3344 去訪問 內部80端口
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d --name nginx02 -p 3344:80 nginx
02b2f941a66da088d4d0d814aaedb39c62f6e724cee8fbb98e272641645bd486
[root@iZwz94cw1gup8aldclit1qZ ~]# dicker ps
-bash: dicker: command not found
[root@iZwz94cw1gup8aldclit1qZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
02b2f941a66d nginx "/docker-entrypoint.…" 14 seconds ago Up 13 seconds 0.0.0.0:3344->80/tcp nginx02
c0d60da80c75 centos "/bin/bash" 3 hours ago Up 3 hours xenodochial_northcutt
51184e1e6ec3 centos "/bin/bash" 4 hours ago Up 4 hours jovial_roentgen
5bb81e29582d centos "/bin/bash" 4 hours ago Up 4 hours nice_mayer
79b8c8f83b8f centos "/bin/bash" 7 hours ago Up 7 hours elegant_lalande
[root@iZwz94cw1gup8aldclit1qZ ~]# curl localhost:3344
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@iZwz94cw1gup8aldclit1qZ ~]#
# 進入容器
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it nginx02 /bin/bash
root@02b2f941a66d:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@02b2f941a66d:/# cd /etc/nginx
root@02b2f941a66d:/etc/nginx# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
root@02b2f941a66d:/etc/nginx#
Docker 安裝Tomcat
# 官方使用
docker run -it --rm tomcat:9.0
# 之前使用的啟動都是后台,停止了容器之后,容器還是可以查詢得到,docker run -it --rm一般用來測試,用完就可以刪除
# 下載啟動
docker pull tomcat9.0
# 啟動運行
docker run -d -p 3355:8080 --name tomcat01 tomcat
# 進入容器
docker exec -it tomcat01 /bin/bash
# 發現問題,1.linux 命令少了,2.沒有webapps,阿里雲鏡像的原因導致的,它把不必要的都踢除了
# 保證最小運行的環境
思考問題:以后要部署項目的話,如果每次都要進入容器是不是很麻煩?我要是可以 在容器外部提供一個映射路徑,webapps,我們在外部放置項目,就自動同步到內部就好了
Docker 安裝Elasticsearch
# es 暴露的端口多
# es 十分的耗內存
# es 的數據一般需要放置到安全目錄,掛載
# --net somenetwork 網絡配置
# 啟動elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 查看運行的狀態 docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
1afed8e13fa8 elasticsearch 0.31% 1.236GiB / 3.7GiB 33.40% 0B / 0B 0B / 0B 43
8febdf517af1 toncat01 0.18% 87.5MiB / 3.7GiB 2.31% 928kB / 50.4kB 0B / 0B 36
02b2f941a66d nginx02 0.00% 1.875MiB / 3.7GiB 0.05% 9.16kB / 11.9kB 0B / 0B 3
79b8c8f83b8f elegant_lalande 0.00% 544KiB / 3.7GiB 0.01% 972B / 0B 0B / 0B 1
# 測試一下ES是否啟動成功
[root@iZwz94cw1gup8aldclit1qZ /]# curl localhost:9200
{
"name" : "1afed8e13fa8",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "El2Y1JA-TSW_ER82xWektA",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
# 啟動成功之后就可以關閉,增加內存的測試
# 趕緊關閉,增加內存的限制,修改配置文件 -e 配置修改
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
這樣就可以發現內存消耗變小了
[root@iZwz94cw1gup8aldclit1qZ ~]# curl localhost:9200
{
"name" : "5c97790a32e8",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "3xE4EY7kTFGE0q4bxXlCmQ",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
使用 kibana連接es
需要加Linux內網Ip
可視化😄
- portainer (先用這個)
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
- Rancher (CI/CD再用)
什么portainer?
Docker 圖形化界面管理工具!提供一個后台面板供我們操作
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
訪問測試:外網:8088
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -p 8088:9000 \
> --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
d1e017099d17: Pull complete
b8084bf83dcf: Pull complete
Digest: sha256:55c7614b1ad61eabc27214299c42d41bb49e5ef78238c0e5783031f041499284
Status: Downloaded newer image for portainer/portainer:latest
b0fbdea34c7faf0017c4e9f33c22f78d9274cb62691ff00856c1c1bb384afe84
訪問測試:http://ip:8088/
通過地址訪問
Container:運行有幾個,停止有幾個
Images:當前倉庫有幾個鏡像
Volume:數據卷掛載
Docker鏡像講解
特點
Docker 鏡像都是只讀的,當容器啟動是,一個新的可寫層被加載到鏡像的頂部!
這一層就是我們通常說的容器層,容器之下的都叫鏡像層
如何提交一個自己的鏡像
commit鏡像
docker commit 提交容器成為一 個新的副本
#命令和git原理類似
docker comit -m="提交的描述信息" -a=“作者” 容器id 目標鏡像名,[TAG]
實戰測試
# 啟動一個默認的tomcat
# 發現這個默認的tomcat,webapps是沒有文件的,把webapps.dist 下的拷到webapps下
cp -r webapps.dist/* webapps
# 拷完就直接
[root@iZwz94cw1gup8aldclit1qZ ~]# docker commit -a="rzk" -m="add webapps app" 5d487edfdbb4 tomcat02:1.0
sha256:4e478467565c893a0e2260eb6f34018120444576e7238cac4d5e7293d4d6b511
[root@iZwz94cw1gup8aldclit1qZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 4e478467565c 4 seconds ago 647MB
nginx latest 4392e5dad77d 5 days ago 132MB
portainer/portainer latest cd645f5a4769 6 days ago 79.1MB
redis latest 36304d3b4540 10 days ago 104MB
tomcat 9.0 1b6b1fe7261e 3 weeks ago 647MB
tomcat latest 1b6b1fe7261e 3 weeks ago 647MB
elasticsearch 7.6.2 f29a1ee41030 2 months ago 791MB
centos latest 470671670cac 4 months ago 237MB
容器數據卷
什么事容器數據卷
docker的理念回顧
將應用和環境打包成一個鏡像!
數據?如果數據都在容器中,那么我吧容器刪除,數據就會丟失! 需求:數據可以持久化
那要是把MySQL容器刪了,就可以刪庫跑路了, 需求:MySQL數據可以存儲在本地!
容器之間可以有一個數據共享的技術!Docker容器中產生的數據,同步到本地!
這就是卷技術!目錄的掛載,將我們容器內的目錄,掛載到Linux上面
總結一句話;容器的持久化和同步操作!容器間也是可以數據共享的!
使用數據卷
方式一:直接使用命令來掛載 -v
docker inspect bc4baa086e3e
Destination: 目的地 docker容器內的地址
Source:掛載區 主機內地址
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
測試文件同步
第一步在主機編寫一個hello.java:
[root@iZwz94cw1gup8aldclit1qZ ceshi]# vi hello.java
[root@iZwz94cw1gup8aldclit1qZ ceshi]# ls
hello.java
[root@iZwz94cw1gup8aldclit1qZ ceshi]# cat hello.java
!# /bin/bash
echo '你好'
查看docker容器:
[root@bc4baa086e3e home]# ls
hello.java
[root@bc4baa086e3e home]# cat -n hello.java
1 !# /bin/bash
2
3 echo '你好'
會發現容器里面會出現一個和主機一樣的文件
如果把容器停了,主機新建一個文件,容器會不會同步主機的文件呢
# 停止容器 在宿主機編寫
[root@iZwz94cw1gup8aldclit1qZ ceshi]# docker stop bc4baa086e3e
bc4baa086e3e
[root@iZwz94cw1gup8aldclit1qZ ceshi]# docker stop bc4baa086e3e
bc4baa086e3e
# 在宿主機修改文件
[root@iZwz94cw1gup8aldclit1qZ ceshi]# vi hello.java
[root@iZwz94cw1gup8aldclit1qZ ceshi]# cat hello.java
!# /bin/bash
echo '你好,我把容器停了,宿主機編寫這段文字'
echo '哈哈哈,我又來了'
# 啟動容器
[root@iZwz94cw1gup8aldclit1qZ ceshi]# docker start bc4baa086e3e
bc4baa086e3e
# 進入容器
[root@iZwz94cw1gup8aldclit1qZ ceshi]# docker attach bc4baa086e3e
[root@bc4baa086e3e home]# cat hello.java
!# /bin/bash
echo '你好,我把容器停了,宿主機編寫這段文字'
echo '哈哈哈,我又來了'
以上可以得出,只要容器不刪除,把容器停了,編寫文件也會被同步到里面
實戰:MySQL的數據持久化的問題!
思考數據持久化
獲取鏡像
# docker pull mysql:5.7
# 運行容器,需要做數據掛載
# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 啟動
-d 后台運行
-p 端口映射
-v 卷掛載
-e 環境配置
--name 容器名字
# -v /home/mysql/data:/var/lib/mysql 把mysql里面的東西掛載到data里面
[root@iZwz94cw1gup8aldclit1qZ home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
be3e92f2f41715d7ce90c8b8af2a3506bacb6c50740d29ae88c4ec320b973279
# 啟動成功之后,我們本地使用sqlyog來連接測試一下
# sqlyog -連接到服務器的3310 --- 331- 和容器內的3306映射,這個時候我們可以連接上了
# 在本地測試一個數據庫,查看一下我們映射的路徑是否ok!
# 步驟在SQLyog 新建一個test數據庫,然后去終端mysql/data查看會不會出現一個test名字的文件
[root@iZwz94cw1gup8aldclit1qZ home]# ls
ceshi mysql nginx-1.14.0 nginx-1.14.0.tar.gz rzk
[root@iZwz94cw1gup8aldclit1qZ home]# cd mysql
[root@iZwz94cw1gup8aldclit1qZ mysql]# ls
conf data
[root@iZwz94cw1gup8aldclit1qZ mysql]# cd data
[root@iZwz94cw1gup8aldclit1qZ data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem
[root@iZwz94cw1gup8aldclit1qZ data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem test
[root@iZwz94cw1gup8aldclit1qZ data]#
假設把容器刪除
# 刪除容器
root@iZwz94cw1gup8aldclit1qZ data]# docker rm -f mysql01
[root@iZwz94cw1gup8aldclit1qZ data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 查看mysql已經不在了
[root@iZwz94cw1gup8aldclit1qZ data]# docker ps -a
bc4baa086e3e centos "/bin/bash" 19 hours ago Up 16 hours xenodochial_goldstine
數據卷還是在的
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem test
可以發現,我們掛載到本地的數據卷依舊沒有丟失,這就實現了容器數據持久化功能
具名和匿名掛載
# 匿名掛載
-v 容器內路徑
-d 后台運行
-p 端口映射
-v 卷掛載
-e 環境配置
--name 容器名字
docker run -d -P --name nginx01 -v /etc/nginx naginx
[root@iZwz94cw1gup8aldclit1qZ test]# docker volume ls
DRIVER VOLUME NAME
local 427983870a2bffc00778cc5d1dc9d1dc9e91aae5a161fcaf6965e46b5d7b99b3
# 這里發現 ,這種就是匿名掛載,我們在 -v 只寫了容器內的路徑,沒有寫容器外的路徑
# 具名掛載 通過 -v 卷名:容器內路徑
-v 容器內路徑
-d 后台運行
-p 端口映射
-v 卷掛載
-e 環境配置
--name 容器名字
[root@iZwz94cw1gup8aldclit1qZ test]# docker run -d -P --name naginx02 -v juming-nginx:/etc/nginx nginx
50e60ad6712300264eb4acf707eac20d76a7dbc9597f08f0c9613a7877caadc3
[root@iZwz94cw1gup8aldclit1qZ test]# docker volume ls
DRIVER VOLUME NAME
local 427983870a2bffc00778cc5d1dc9d1dc9e91aae5a161fcaf6965e46b5d7b99b3
local b4e09d34098f10f10921f3a9b7960bb1c033b57c982d380272780c41d426857d
local juming-nginx
# 通過 -v 卷名:容器內路徑
# 查看一下這個卷
[root@iZwz94cw1gup8aldclit1qZ data]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-06-09T16:36:01+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker容器內的卷,沒有指定目錄的情況下都是在 /var/lib/docker/volumes/***/data
我們通過具名掛載可以方便的找到我們的一個卷,大多數情況在使用 具名掛載
區分具名和匿名掛載,還是指定路徑掛載
# 如何確定是具名掛載還是匿名掛載,還是指定路徑掛載
-v 容器內路徑 # 匿名掛載
-v 卷名:容器內路徑 # 具名掛載
-v /宿主機路徑:容器內路徑 # 指定路徑掛載
拓展
# 通過 -v 容器內路徑 ro rw 改變讀寫權限
ro readonly # 只讀
rw readwrite # 可讀可寫
# 一旦這個設置了容器權限,容器對我們掛載出來的內容就有限定了
# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就說明這個路徑只能通過宿主機來操作,容器內部是無法操作
初始Dockerfile
Dockerfile就是用來構建docker鏡像的構建文件!命令腳本!先體驗一下!
通過這個腳本可以生成鏡像,鏡像是一層一層的,腳本一個個的命名,每個命令都是一層!
# 創建一個dockerfile文件,名字可以隨意
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# pwd
/home/docker-test-volume
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# vim dockerfile1
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]#
# 文件內容
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# cat dockerfile1
FORM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
# 創建一個自己的鏡像
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t rzk/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 470671670cac
Step 2/4 : VOLUME ["volume01","volume02"]
---> Using cache
---> 9305bf5771fa
Step 3/4 : CMD echo "----end----"
---> Using cache
---> 95ffd2f99bd0
Step 4/4 : CMD /bin/bash
---> Using cache
---> 2b667e117705
Successfully built 2b667e117705
Successfully tagged rzk/centos:1.0
# 查看鏡像
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rzk/centos 1.0 2b667e117705 About an hour ago 237MB
rzk/centos latest 2b667e117705 About an hour ago 237MB
tomcat02 1.0 4e478467565c 31 hours ago 647MB
nginx latest 4392e5dad77d 6 days ago 132MB
portainer/portainer latest cd645f5a4769 7 days ago 79.1MB
redis latest 36304d3b4540 11 days ago 104MB
mysql 5.7 a4fdfd462add 2 weeks ago 448MB
tomcat 9.0 1b6b1fe7261e 3 weeks ago 647MB
tomcat latest 1b6b1fe7261e 3 weeks ago 647MB
elasticsearch 7.6.2 f29a1ee41030 2 months ago 791MB
centos latest 470671670cac 4 months ago 237MB
# 運行剛剛創建的鏡像
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run -it 2b667e117705 /bin/bash
[root@2dbfa8697ecf /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
# 可以看到最后兩行有我們掛載的數據卷目錄
[root@2dbfa8697ecf /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 360 Jun 9 11:03 dev
drwxr-xr-x 1 root root 4096 Jun 9 11:03 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 4096 Jan 13 21:48 lost+found
drwxr-xr-x 2 root root 4096 May 11 2019 media
drwxr-xr-x 2 root root 4096 May 11 2019 mnt
drwxr-xr-x 2 root root 4096 May 11 2019 opt
dr-xr-xr-x 128 root root 0 Jun 9 11:03 proc
dr-xr-x--- 2 root root 4096 Jan 13 21:49 root
drwxr-xr-x 11 root root 4096 Jan 13 21:49 run
lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 May 11 2019 srv
dr-xr-xr-x 13 root root 0 Jun 9 10:54 sys
drwxrwxrwt 7 root root 4096 Jan 13 21:49 tmp
drwxr-xr-x 12 root root 4096 Jan 13 21:49 usr
drwxr-xr-x 20 root root 4096 Jan 13 21:49 var
drwxr-xr-x 2 root root 4096 Jun 9 11:03 volume01
drwxr-xr-x 2 root root 4096 Jun 9 11:03 volume02
可以看到最后兩行有我們掛載的數據卷目錄
volume01和volume02有掛載肯定和外部有一個同步的目錄
接下來就去查找掛載目錄
# 創建一個文件
[root@2dbfa8697ecf /]# touch centainer.txt
# 在主機上查看運行的鏡像id
[root@iZwz94cw1gup8aldclit1qZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2dbfa8697ecf 2b667e117705 "/bin/bash" 5 minutes ago Up 5 minutes
# 查看當前容器的信息 會看到一個Mounts
[root@iZwz94cw1gup8aldclit1qZ ~]# docker inspect 2dbfa8697ecf
# 找到
"Source": "/var/lib/docker/volumes/2bc86f85ca5cb0284857c7563ae5e3ed3fed075d88c2ccb29b9616a5896a07b4/_data"
進入到目錄里面ls 查看是否同步文件
數據卷容器
centos02 ---實現數據同步---> centos01
-- volumes - from 數據卷容器
兩個或者多個容器之間實現數據共享
把01容器變成數據卷容器,然后別的容器來連接
啟動3個容器,通過我們剛才自己寫鏡像啟動
#第一個
[root@iZwz94cw1gup8aldclit1qZ /]# docker run -it --name docker10 rzk/centos:1.0
[root@9a956c283b13 /]#
#第二個
# --volumes-from 進行掛載
# 通過后面的docker10 進行綁定
# 通過rzk/centos:1.0 啟動
[root@iZwz94cw1gup8aldclit1qZ _data]# docker run -it --name docker20 --volumes-from docker10 rzk/centos:1.0
[root@5444e01431e3 /]#
進行綁定后10 和20 的數據卷就同步掛載一起
只有數據卷會同步掛載,別的文件目錄同步掛載不了
# 如果退出就進入正在運行的容器
docker attach 容器id
# 如果在搞第三個容器綁定的是docker10數據卷會同步嗎
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -it --name docker30 --volumes-from docker10 rzk/centos:1.0
[root@9bedcf663ac0 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@9bedcf663ac0 /]# cd volume01
[root@9bedcf663ac0 volume01]# ls
file filedocker20
注意
進行綁定后10 和20 的數據卷就同步掛載一起
只有數據卷會同步掛載,別的文件目錄同步掛載不了
測試:如果把docker10刪了,查看一下20和30容器的數據卷里面的內容會不會沒了
答案:不會
多個mysql實現共享
[root@iZwz94cw1gup8aldclit1qZ home]# docker run -d -p 3310:3306 -v
/home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e
MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@iZwz94cw1gup8aldclit1qZ home]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
# 就可以實現兩個容器數據同步
結論:
容器之間配置信息的傳遞,數據卷容器的生命周期一直持續到沒有容器使用為止 。
一旦你持久化到本地,這個時候回,本地的數據是不會刪除
DockerFile
DockerFile介紹
dockerfile是用來構建docker鏡像的文件!命令參數腳本!
構建:
1.編寫一個dockerfile文件
2.docker build構建成為一個鏡像
3.docker run運行鏡像
4.docker push 發布鏡像(DockerHub,阿里雲鏡像倉庫)
DockerFile構建過程
基礎知識:
1.每個保留字(指令)都必須是大寫字母
2.執行從上到下順序執行
3.# 表示注釋
4.每個指令都會創建提交一個新的鏡像層,並提交!
dockerfile是面向開發的,以后發布項目,做鏡像,就需要編寫dockerfile文件,這個文件十分簡單!
Docker鏡像逐漸成為企業交付的標准,必須掌握
DockerFile:構建文件,定義一切的步驟,源代碼
Dockerimages:通過DockerFIle構成生成的鏡像,最終發布和運行產品
Docker:容器就是鏡像運行起來提供服務器
DockerFile的指令
FROM # 基礎鏡像,一切從這里開始構建
MAINTAINER # 鏡像是誰寫的,姓名+郵箱
RUN # 鏡像構建的時候需要運行命令
ADD # 步驟,Tomcat鏡像,這個tomcat壓縮包,添加內容
WORKDIR # 鏡像的工作目錄
VOLUME # 掛載的目錄
EXPOST # 保留端口配置
CMD # 指定這個容器啟動的時候要運行的命令,只有最后一個會生效,可被替代
ENTRYPOINT # 指定這個容器啟動的時候要運行的命令,可以追加命令
COPY # 類似ADD,將我們文件拷貝到鏡像中
ENV # 構建的時候設置環境變量
實戰測試
Docker Hub中99%鏡像都會從這個基礎鏡像過來的 FROM scratch,然后配置需要的軟件和配置來進行構建的
創建一個Centos
# 編寫Dockerfile的文件
[root@iZwz94cw1gup8aldclit1qZ home]# cat dockerfile
FROM centos
MAINTAINER rzk<176907@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPAH
CME echo "---end---"
CMD /bin/bash
# 2.通過這個文件構成鏡像
# 命令:docker build -f dockerfile文件路徑 -t 鏡像名:[tag]
Successfully built efbcb7388645
Successfully tagged mycentos:0.1
# 3.測試運行
# 查看有沒有創建好鏡像
[root@iZwz94cw1gup8aldclit1qZ mydockerfile-centos]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 efbcb7388645 About a minute ago 321MB
rzk/centos 1.0 7b22da40bcbd 2 hours ago 237MB
tomcat02 1.0 4e478467565c 47 hours ago 647MB
nginx latest 4392e5dad77d 7 days ago 132MB
portainer/portainer latest cd645f5a4769 8 days ago 79.1MB
redis latest 36304d3b4540 12 days ago 104MB
mysql 5.7 a4fdfd462add 2 weeks ago 448MB
tomcat 9.0 1b6b1fe7261e 3 weeks ago 647MB
tomcat latest 1b6b1fe7261e 3 weeks ago 647MB
elasticsearch 7.6.2 f29a1ee41030 2 months ago 791MB
centos latest 470671670cac 4 months ago 237MB
# 啟動鏡像
[root@iZwz94cw1gup8aldclit1qZ mydockerfile-centos]# docker run -it efbcb7388645
# 這個是在配置中設定好的,直接進入到local目錄
[root@c8d7cf9a1600 local]# pwd
/usr/local
官方的centos是純凈的,連pwd都沒有
自己配的centos
[root@c8d7cf9a1600 local]# pwd
/usr/local
查看鏡像構建歷史
[root@iZwz94cw1gup8aldclit1qZ ~]# docker history efbcb7388645
IMAGE CREATED CREATED BY SIZE COMMENT
efbcb7388645 5 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
f1810e7f530a 5 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
a648efc67641 5 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
125e5fb2eb41 5 hours ago /bin/sh -c #(nop) EXPOSE 80 0B
19a643e8cb4f 5 hours ago /bin/sh -c yum -y install net-tools 24.1MB
7cf165e5ab89 5 hours ago /bin/sh -c yum -y install vim 59.8MB
2adc83de3c37 5 hours ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
6d1fe1a19a57 5 hours ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
554a6e0ceb18 5 hours ago /bin/sh -c #(nop) MAINTAINER rzk<176907@qq.… 0B
470671670cac 4 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 4 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 4 months ago /bin/sh -c #(nop) ADD file:aa54047c80ba30064… 237MB
CMD和ENTRYPOINT 區別
#CMD # 指定這個容器啟動的時候要運行的命令,只有最后一個會生效,可被替代
#ENTRYPOINT # 指定這個容器啟動的時候要運行的命令,可以追加命令
測試cmd
# 編寫 dockerfile2
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# cat dockerfile2
FROM centos
CMD ["ls","-a"]
# 構建鏡像
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker build -f dockerfile2 -t cmdcentos .
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cmdcentos latest 2df214355824 12 seconds ago 237MB
mycentos 0.1 efbcb7388645 5 hours ago 321MB
rzk/centos 1.0 7b22da40bcbd 7 hours ago 237MB
tomcat02 1.0 4e478467565c 2 days ago 647MB
nginx latest 4392e5dad77d 7 days ago 132MB
portainer/portainer latest cd645f5a4769 8 days ago 79.1MB
redis latest 36304d3b4540 12 days ago 104MB
mysql 5.7 a4fdfd462add 2 weeks ago 448MB
tomcat 9.0 1b6b1fe7261e 3 weeks ago 647MB
tomcat latest 1b6b1fe7261e 3 weeks ago 647MB
elasticsearch 7.6.2 f29a1ee41030 2 months ago 791MB
centos latest 470671670cac 4 months ago 237MB
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run -it 2df214355824
. .dockerenv dev home lib64 media opt root sbin sys usr
.. bin etc lib lost+found mnt proc run srv tmp var
# 運行會發現ls啟動
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run 2df214355824
測試ENTRYPOINT
# 編寫ENTRYPOINT
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# vi entrypoint
FROM centos
entrypoint ["ls","-a"]
# 構建
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker build -f entrypoint -t entrypoint-test .
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run d16c0b89b79f
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# entrypoint加 -l
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run d16c0b89b79f -l
total 56
drwxr-xr-x 1 root root 4096 Jun 10 08:37 .
drwxr-xr-x 1 root root 4096 Jun 10 08:37 ..
-rwxr-xr-x 1 root root 0 Jun 10 08:37 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 Jun 10 08:37 dev
drwxr-xr-x 1 root root 4096 Jun 10 08:37 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 4096 Jan 13 21:48 lost+found
drwxr-xr-x 2 root root 4096 May 11 2019 media
drwxr-xr-x 2 root root 4096 May 11 2019 mnt
drwxr-xr-x 2 root root 4096 May 11 2019 opt
dr-xr-xr-x 150 root root 0 Jun 10 08:37 proc
dr-xr-x--- 2 root root 4096 Jan 13 21:49 root
drwxr-xr-x 11 root root 4096 Jan 13 21:49 run
lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 May 11 2019 srv
dr-xr-xr-x 13 root root 0 Jun 9 10:54 sys
drwxrwxrwt 7 root root 4096 Jan 13 21:49 tmp
drwxr-xr-x 12 root root 4096 Jan 13 21:49 usr
drwxr-xr-x 20 root root 4096 Jan 13 21:49 var
實戰:Tomcat
1.准備鏡像文件 tomcat壓縮包,JDK的壓縮包
2.編寫dockerfile文件,官方命名 Dockerfile
,build 會自動尋找這個文件,就不需要-f指定了
FROM centos
MAINTAINER rzk(176@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u241-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.31.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_241
ENV ClASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.31
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.31
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.31/bin/startup.sh && tail -F
/url/local/apache-tomcat-9.0.31/bin/logs/catalina.out
3.構建鏡像
#如果有正在運行容器的端口先暫停
或者刪除
# 刪除容器 docker ps -a找到運行的容器id
docker rm 容器id
# 1.docker build -t diytomcat .
[root@iZwz94cw1gup8aldclit1qZ tomcat]# docker run -d -p 9889:8080 --name Tomcat -v /home/tomcat/test:/url/local/apache-tomcat-9.0.31/webapps/test -v /home/tomcat/tomcatlogs/:/url/local/apache-tomcat-9.0.31/logs diytomcat
ef08847039525522b70c461d2784c8f6bfe943d9381383a97a5affd33c5f3b7f
# 2.如果出現端口
docker: Error response from daemon: driver failed programming external connectivity on endpoint Tomcat (814bfe3ff4ce8f2e069f8199a5de21a846151ce82c810d2881c2302ea20b55cf): Error starting userland proxy: listen tcp 0.0.0.0:9090: bind: address already in use.
# 解決重啟docker服務后再啟動容器
systemctl restart docker
# 3.構建鏡像
[root@iZwz94cw1gup8aldclit1qZ tomcat]# ls
apache-tomcat-9.0.31.tar.gz Dockerfile jdk-8u241-linux-x64.tar.gz readme.txt test tomcatlogs
# 4.運行容器
[root@iZwz94cw1gup8aldclit1qZ tomcat]# docker run -d -p 9889:8080 --name Tomcat -v /home/tomcat/test:/url/local/apache-tomcat-9.0.31/webapps/test -v /home/tomcat/tomcatlogs/:/url/local/apache-tomcat-9.0.31/logs diytomcat
0377387f992a388d046817e652f8a80ece7f04fb9dee0c00f44055f9f32458a1
# 5.進入正在運行的容器
[root@iZwz94cw1gup8aldclit1qZ tomcat]# docker exec -it 0377387f992a /bin/bash
[root@0377387f992a local]# ls
apache-tomcat-9.0.31 bin etc games include jdk1.8.0_241 lib lib64 libexec readme.txt sbin share src
[root@0377387f992a local]# ls -l
total 52
drwxr-xr-x 1 root root 4096 Jun 10 09:43 apache-tomcat-9.0.31
drwxr-xr-x 2 root root 4096 May 11 2019 bin
drwxr-xr-x 2 root root 4096 May 11 2019 etc
drwxr-xr-x 2 root root 4096 May 11 2019 games
drwxr-xr-x 2 root root 4096 May 11 2019 include
drwxr-xr-x 7 10143 10143 4096 Dec 11 10:39 jdk1.8.0_241
drwxr-xr-x 2 root root 4096 May 11 2019 lib
drwxr-xr-x 2 root root 4096 May 11 2019 lib64
drwxr-xr-x 2 root root 4096 May 11 2019 libexec
-rw-r--r-- 1 root root 0 Jun 10 09:42 readme.txt
drwxr-xr-x 2 root root 4096 May 11 2019 sbin
drwxr-xr-x 5 root root 4096 Jan 13 21:49 share
drwxr-xr-x 2 root root 4096 May 11 2019 src
# 測試能否訪問端口
root@iZwz94cw1gup8aldclit1qZ tomcat]# curl localhost:9090
# 6.發布項目
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
如果退出容器想要進入容器的話
[root@0377387f992a local]# exit
exit
[root@iZwz94cw1gup8aldclit1qZ tomcat]# docker exec -it 0377387f992a /bin/bash
[root@0377387f992a local]# ls -l
total 52
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Rzk</title>
</head>
<body>
RzkBlog<br/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>
發布自己的鏡像
DockerHub
1.地址 https://hub.docker.com/ 注冊自己的賬號
2.確定這個賬號可以登錄
3.在我們的服務器上提交自己的鏡像
[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker login -u ruizhukai
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
4.登錄完畢后就可以提交鏡像,就剩一步docker push
# push自己的鏡像到服務器上
# push鏡像的問題
[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker push ruizhukai/tomcat:2.0
The push refers to repository [docker.io/ruizhukai/tomcat]
An image does not exist locally with the tag: ruizhukai/tomcat
# 解決,增加一個tag
[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker tag 0faea1dfca19 ruizhukai/tomcat:1.0
# docker push 上去即可!自己發布的鏡像盡量帶上版本號
[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker push ruizhukai/tomcat:1.0
The push refers to repository [docker.io/ruizhukai/tomcat]
f858ba4c4cbc: Pushed
a7f0f23a00d2: Pushed
3ec21c6199b9: Pushing [=======> ] 62.48MB/403.7MB
7fe7e9ffcc98: Pushed
0683de282177: Mounted from library/centos
發布到阿里雲鏡像上
1.登錄阿里雲
2.找到容器鏡像服務
3.創建命名空間
在鏡像倉庫里面新建一個
4.創建容器鏡像
Docker網絡
理解Docker網絡
清空所有的鏡像
# docker rm -f $(docker ps -aq) 刪除運行中的容器
# docker rmi -f $(docker images -aq) 刪除全部鏡像
查看網絡
[root@iZwz94cw1gup8aldclit1qZ /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo <----- #對應的是本機回環地址
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:0e:e0:36 brd ff:ff:ff:ff:ff:ff
inet 172.18.233.211/20 brd 172.18.239.255 scope global dynamic eth0 # 阿里雲內網地址
valid_lft 310864134sec preferred_lft 310864134sec
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:91:dd:12:c7 brd ff:ff:ff:ff:ff:ff # docker0地址
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
# 問題docker 是如何處理容器網絡訪問的?
# [root@iZwz94cw1gup8aldclit1qZ /]# docker run -d -P --name tomcat01 tomcat
# 查看容器的內部網絡地址 ip addr 發現容器啟動的時候會得到一個 eth0@if367 ip地址,docker分配的
# [root@iZwz94cw1gup8aldclit1qZ /]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
366: eth0@if367: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# 思考 , linux能不能ping 通容器
[root@iZwz94cw1gup8aldclit1qZ /]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.060 ms
# linux 可以ping 通 docker 容器內部
運行tomcat02
# [root@iZwz94cw1gup8aldclit1qZ /]# docker run -d -P --name tomcat02 tomcat
0c8a2fecd529531c92ffbe14d091823828d58e1e9f05ed69f96a41bf1a807d59
# [root@iZwz94cw1gup8aldclit1qZ /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:0e:e0:36 brd ff:ff:ff:ff:ff:ff
inet 172.18.233.211/20 brd 172.18.239.255 scope global dynamic eth0
valid_lft 310863367sec preferred_lft 310863367sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:91:dd:12:c7 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
367: vethe189624@if366: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 16:2b:5d:d8:35:41 brd ff:ff:ff:ff:ff:ff link-netnsid 0
369: vetha836941@if368: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether fa:ff:8c:d0:93:a3 brd ff:ff:ff:ff:ff:ff link-netnsid 1
# [root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat02 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
368: eth0@if369: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# 我們發現這個容器帶來網卡,都是一對一對的
# evth-pair 就是一堆的虛擬設備接口,他們就是成對出現的,一段連着協議,一段彼此相連
# 正因為這個特性, evth-pair充當一個橋梁
原理
1.我們每啟動一個docker容器,docker就會給docker容器分配一個ip,我們只要安裝docker,就會有一個網卡 docker0,橋接模式,使用的技術是evth-pair技術
-- link
思考一個場景,我們編寫一個微服務,database url = ip ,項目不重啟,數據庫ip換掉了 ,我們希望可以處理這個問題,可以名字來進行訪問容器?
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known
# [root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat01 tomcat
c9e51b6f5c164a946fe39601115d89e4692044e6dc0cfa8845051a5000a1e380
# [root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat02 tomcat
67d9ac053fd0b841ac48127238708bcd9b9a5f677588c00a69385f887a09bdec
# [root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
22eabed874351db1066828f0a1b2e26f04f3fb44c74bba3062e7410c10fbff0b
# 通過 --link 就可以連通網絡
# [root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.100 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.075 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.077 ms
# 反向可以ping通嗎?
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
如果要想訪問容器具體的網絡信息
[root@iZwz94cw1gup8aldclit1qZ ~]# docker newwork ls
docker: 'newwork' is not a docker command.
See 'docker --help'
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
85f4d9d63b38 bridge bridge local
b4bf70c72308 host host local
b12914554bcc none null local
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network inspect 85f4d9d63b38
探究:inspect
"Containers": {
"22eabed874351db1066828f0a1b2e26f04f3fb44c74bba3062e7410c10fbff0b": {
"Name": "tomcat03",
"EndpointID": "a2550318c36526ade484de76ffced2f52a35aee7f0b4250e6c3961f38694af5b",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
},
"67d9ac053fd0b841ac48127238708bcd9b9a5f677588c00a69385f887a09bdec": {
"Name": "tomcat02",
"EndpointID": "c8e0526801518058d9688c9f691ec9c913fd97aaf671195e2b0c83c426cf5067",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"c9e51b6f5c164a946fe39601115d89e4692044e6dc0cfa8845051a5000a1e380": {
"Name": "tomcat01",
"EndpointID": "b8a5ffddd521169ece2eb27ece96f370925d1f946876dfc48a3ab122246a456a",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
自定義網絡
查看所有網絡
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
85f4d9d63b38 bridge bridge local
b4bf70c72308 host host local
b12914554bcc none null local
bridge:橋接 docker(默認)
host:和宿主機共享網絡
none:不配置網絡
[root@iZwz94cw1gup8aldclit1qZ ~]# docker rm -f $(docker ps -aq) 清空所有的網絡
# 創建tomcat默認是這樣指定網絡
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P tomcat01 --net brige tomcat
#docker0特點,默認,域名不能訪問 --link可以打通連接
# 可以自定義一個網絡
# --driver bridge
# --subnet 192.168.0.0/16 192.168.0.2 192.168.255.255
# --gateway 192.168.0.1
#
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
bb8036aff34ef2fba3815f8c9ec2041a71cafad5136517bcae57319e451d301a
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
85f4d9d63b38 bridge bridge local
b4bf70c72308 host host local
bb8036aff34e mynet bridge local
b12914554bcc none null local
查看自己創建的網絡
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "bb8036aff34ef2fba3815f8c9ec2041a71cafad5136517bcae57319e451d301a",
"Created": "2020-06-11T09:43:15.975142029+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
0b8455084d24ef5b9671ef001a70b024c6b90d58f4987757d056b4464f8851a2
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
2795089168bead0bf351c0a7c3ef9a3c696d03a1837c77d40c69d4833d6dfe9f
[root@iZwz94cw1gup8aldclit1qZ ~]# docker inspect mynet
[
{
"Name": "mynet",
"Id": "bb8036aff34ef2fba3815f8c9ec2041a71cafad5136517bcae57319e451d301a",
"Created": "2020-06-11T09:43:15.975142029+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0b8455084d24ef5b9671ef001a70b024c6b90d58f4987757d056b4464f8851a2": {
"Name": "tomcat-net-01",
"EndpointID": "4bc1e155dbd756746f089aeffc2accca845f8f9f6906c14e05e747405a24b690",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"2795089168bead0bf351c0a7c3ef9a3c696d03a1837c77d40c69d4833d6dfe9f": {
"Name": "tomcat-net-02",
"EndpointID": "4060a7613ae92954d76ad3a8bc6b82e37b1d688a525a2de00bbbe91c05fd3072",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
測試ping連接
# 再次ping網絡
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.124 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.068 ms
# 不是用--link也可以ping的通名字了
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.059 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.070 ms
自定義網絡docker都已經幫我們維護好了對應的關系,推薦我們這樣使用
好處:
redis:
mysql:
網絡連通
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat01 tomcat
7b9181aa0d39f2ed823db2d1f7cd2bed0cf7a069f9d8c6ac9704d2b63794f901
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat02 tomcat
f983c91ee178d820603545e2554d4263f24193b1aa949cfecef594944a544a4a
[root@iZwz94cw1gup8aldclit1qZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f983c91ee178 tomcat "catalina.sh run" 3 seconds ago Up 2 seconds 0.0.0.0:32778->8080/tcp tomcat02
7b9181aa0d39 tomcat "catalina.sh run" 6 seconds ago Up 6 seconds 0.0.0.0:32777->8080/tcp tomcat01
2795089168be tomcat "catalina.sh run" 16 minutes ago Up 16 minutes 0.0.0.0:32776->8080/tcp tomcat-net-02
0b8455084d24 tomcat "catalina.sh run" 17 minutes ago Up 17 minutes 0.0.0.0:32775->8080/tcp tomcat-net-01
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
# 查看怎么使用
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
--alias strings Add network-scoped alias for the container
--driver-opt strings driver options for the network
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--link list Add link to another container
--link-local-ip strings Add a link-local address for the container
# 測試打通
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network connect mynet tomcat01
[root@iZwz94cw1gup8aldclit1qZ ~]# docker inspect mynet
[
{
"Name": "mynet",
"Id": "bb8036aff34ef2fba3815f8c9ec2041a71cafad5136517bcae57319e451d301a",
"Created": "2020-06-11T09:43:15.975142029+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0b8455084d24ef5b9671ef001a70b024c6b90d58f4987757d056b4464f8851a2": {
"Name": "tomcat-net-01",
"EndpointID": "4bc1e155dbd756746f089aeffc2accca845f8f9f6906c14e05e747405a24b690",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"2795089168bead0bf351c0a7c3ef9a3c696d03a1837c77d40c69d4833d6dfe9f": {
"Name": "tomcat-net-02",
"EndpointID": "4060a7613ae92954d76ad3a8bc6b82e37b1d688a525a2de00bbbe91c05fd3072",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"7b9181aa0d39f2ed823db2d1f7cd2bed0cf7a069f9d8c6ac9704d2b63794f901": {
"Name": "tomcat01",
"EndpointID": "c9970b3fd3abdb0631c356fe795b517bd39a29dd6f2c8ec14bbb242d57796f9f",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
# 測試tomcat01能否ping通 tomcat-net-01
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.089 ms
# 02依舊ping不通
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.089 ms
實戰Redis
# 1.創建一個redis服務
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network create redis --subnet 172.38.0.0/16
# 2.通過腳本創建六個redis配置
for port in $(seq 1 6);\
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat <<EOF>>/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
docker run -p 6379${port}:6379 -p 1637${port}:1637 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \
# 3.創建六個redis配置
docker run -p 6371:6379 -p16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6372:6379 -p16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6373:6379 -p16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6374:6379 -p16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6375:6379 -p16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6376:6379 -p16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 4.進入redis
# docker exec -it redis-1 /bin/sh
# 5.進入data
/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.1
5:6379 172.38.0.16:6379 --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 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 07b02dc06880ab596c94e00f124ed6ee85f4bf35 172.38.0.11:6379
slots:[0-5460] (5461 slots) master
M: 3961bedfc0ba9fafc856048182240b6dc82c2c88 172.38.0.12:6379
slots:[5461-10922] (5462 slots) master
M: 749eb4729d1a7c699677bcfd59f2d3fa48a8809e 172.38.0.13:6379
slots:[10923-16383] (5461 slots) master
S: 46583dea294055b779db7f1e53d79bbe2501e418 172.38.0.14:6379
replicates 749eb4729d1a7c699677bcfd59f2d3fa48a8809e
S: b18057c30f4bcb69ad9c3add993e225d5c8d23fa 172.38.0.15:6379
replicates 07b02dc06880ab596c94e00f124ed6ee85f4bf35
S: 9220ceed708855941493691cd15c5524389aa2fb 172.38.0.16:6379
replicates 3961bedfc0ba9fafc856048182240b6dc82c2c88
Can I set the above configuration? (type 'yes' to accept): y
/data #
# 7 連接
# 加 -c 是集群的意思
#/data # redis-cli -c
127.0.0.1:6379> 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
cluster_size:3 # 主從復制
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:19447
cluster_stats_messages_pong_sent:19363
cluster_stats_messages_sent:38810
cluster_stats_messages_ping_received:19358
cluster_stats_messages_pong_received:19447
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:38810
# 8 查看主機和從機
#127.0.0.1:6379> cluster nodes
46583dea294055b779db7f1e53d79bbe2501e418 172.38.0.14:6379@16379 slave 749eb4729d1a7c699677bcfd59f2d3fa48a8809e 0 1591860270594 4 connected
9220ceed708855941493691cd15c5524389aa2fb 172.38.0.16:6379@16379 slave 3961bedfc0ba9fafc856048182240b6dc82c2c88 0 1591860269000 6 connected
749eb4729d1a7c699677bcfd59f2d3fa48a8809e 172.38.0.13:6379@16379 master - 0 1591860269591 3 connected 10923-16383
3961bedfc0ba9fafc856048182240b6dc82c2c88 172.38.0.12:6379@16379 master - 0 1591860270000 2 connected 5461-10922
b18057c30f4bcb69ad9c3add993e225d5c8d23fa 172.38.0.15:6379@16379 slave 07b02dc06880ab596c94e00f124ed6ee85f4bf35 0 1591860270092 5 connected
07b02dc06880ab596c94e00f124ed6ee85f4bf35 172.38.0.11:6379@16379 myself,master - 0 1591860268000 1 connected 0-5460
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK
# 9 設置鍵值對
# set a b
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.14:6379 # 可以擴大是放在4號機
OK
# 查看機器運行的狀態
# 172.38.0.13:6379> cluster nodes
9220ceed708855941493691cd15c5524389aa2fb 172.38.0.16:6379@16379 slave 3961bedfc0ba9fafc856048182240b6dc82c2c88 0 1591860886546 6 connected
46583dea294055b779db7f1e53d79bbe2501e418 172.38.0.14:6379@16379 master,fail - 1591860650075 1591860647867 7 connected
3961bedfc0ba9fafc856048182240b6dc82c2c88 172.38.0.12:6379@16379 master - 0 1591860885544 2 connected 5461-10922
b18057c30f4bcb69ad9c3add993e225d5c8d23fa 172.38.0.15:6379@16379 slave 07b02dc06880ab596c94e00f124ed6ee85f4bf35 0 1591860885000 5 connected
07b02dc06880ab596c94e00f124ed6ee85f4bf35 172.38.0.11:6379@16379 master - 0 1591860885544 1 connected 0-5460
749eb4729d1a7c699677bcfd59f2d3fa48a8809e 172.38.0.13:6379@16379 myself,master - 0 1591860884000 8 connected 10923-16383
# 把對應的機器停掉,這里是4號機
-> Redirected to slot [15495] located at 172.38.0.14:6379
# docker stop redis-6
# 設置鍵值對完可能需要退出再進入
127.0.0.1:6379> set E G
-> Redirected to slot [6241] located at 172.38.0.16:6379
OK
#進入
# /data # redis-cli -c
Docker運行redis
docker run -d --name myredis -p 6379:6379 -v data:/data redis:latest
--requirepass "你的密碼(數字字母)" --appendonly yes
命令說明:
-p 6379:6379 : 將容器的6379端口映射到主機的6379端口
-v $PWD/data:/data : 將主機中當前目錄下的data掛載到容器的/data
redis-server --appendonly yes : 在容器執行redis-server啟動命令,並打開redis持久化配置
docker run -d --name oosredis -p 6379:6379 -v /home/redis/data:/home/redis/data redis:latest --requirepass "rzkruizhukai123." --appendonly yes
Docker運行redis
[root@rzk ~]# docker exec -it 90 redis-cli -- 進入redis
127.0.0.1:6379>
如果有密碼需要輸入密碼才能set值
127.0.0.1:6379> auth rzkruizhukai123.
OK
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> set a 2
OK
127.0.0.1:6379> get a
"2"
SringBoot 微服務打包Docker鏡像
1.構架springbook項目
2.打包應用
點擊右欄的maven里面有Lifecycle找到packaage點擊打包
3.在springboot項目里面編寫dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
上面兩部運行完之后,把這兩個東西移動到linux的home/idea(idea項目名字隨便)
4.構建鏡像
#構建一個自己的鏡像
# [root@iZwz94cw1gup8aldclit1qZ idea]# docker build -t rzk .
Sending build context to Docker daemon 16.47MB
Step 1/5 : FROM java:8
---> d23bdf5b1b1b
Step 2/5 : COPY *.jar /app.jar
---> ded6026c2e68
Step 3/5 : CMD ["--server.port=8080"]
---> Running in 88b3b92214ec
Removing intermediate container 88b3b92214ec
---> 9126a566d003
Step 4/5 : EXPOSE 8080
---> Running in 1a05e78ff468
Removing intermediate container 1a05e78ff468
---> 89e88b9ea304
Step 5/5 : ENTRYPOINT ["java","-jar","/app.jar"]
---> Running in 8471db1bb9cc
Removing intermediate container 8471db1bb9cc
---> cc6206f47451
Successfully built cc6206f47451
Successfully tagged rzk:latest
5.發布運行
docker run -d --restart=always --name oos -v /usr/local/logs:/home/jar-logs -p 8890:8089 oos
docker run -d --restart=always --name wxsever -v /usr/local/logs:/home/jar-logs -p 80:80 wxsever