文章目錄
- Docker鏡像加載原理
- Docker常用的命令
- 關于容器命令
- 其他常用命令
- 進入當前正在運行的容器
- docker容器檔案移動復制
- docker 安裝測驗命令
- commit鏡像
- 安裝可視化工具Portainer和Rancher
- 容器資料卷
- 具名和匿名掛載
- 如何判斷是具名掛載還是指定路徑掛載
- 案例一:多個mysql實作資料共享
- DockerFile
- 什么是 Dockerfile?
- Dockerfile檔案說明
- 使用 Dockerfile 定制鏡像
- 例1:創建dockerfile1腳本
- 例2:創建dockerfile2腳本
- 發布鏡像
- 案例二:使用dockerfile構建Tomcat
- 階段小結
- Docker網路
- 了解docker網路
- 自定義網路
- 使用--link進行網路連接
- 自定義`網路連接`(推薦使用)
- 案例三: Redis 集群部署
- 驗證集群的高可用性
- 案例四:Springboot微服務專案部署
docker本質就是宿主機的一個行程,docker是通過namespace實作資源隔離,通過cgroup實作資源限制,通過寫時復制技術(copy-on-write)實作了高效的檔案操作(類似虛擬機的磁盤比如分配500g并不是實際占用物理磁盤500g)
博主的Docker安裝教程
Docker鏡像加載原理
docker 的鏡像實際上由一層一層的檔案系統組成,這種層級的檔案系統UnionFS,bootfs(boot file system) 主要包含bootloader和kernel,bootloader;主要是引導加載kernel,Linux剛啟動時會加載bootfs檔案系統,在Docker鏡像的最底層是bootfs,這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和內核,當boot加載完成之后整個內核就存在記憶體中了,此時記憶體的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs,
UnionFS聯合檔案系統一次同時加載多個檔案系統,但從外面看起來,只能看到一個檔案系統你那個,聯合加載會把各層檔案系統疊加起來,這樣最終的檔案系統會包含所有底層檔案和目錄,
docker鏡像分層:
以我們的pull為例,在下載的程序中我們可以看到docker的鏡像好像是在一層一層的在下載;
采用這種分層結構最大的一個好處就是共享資源,比如有多個鏡像都從相同的base鏡像構建而來,那么宿主機只需要在磁盤上保存一份base鏡像,同時記憶體中也只需要加載一份base鏡像,就可以為所有容器服務了,而且鏡像的每一層都可以被共享,docker
鏡像都是只讀的,當容器啟動時,一個新的可寫層被加載到鏡像的頂部,這一層通常被稱作 “容器層” ,“容器層” 之下的都叫鏡像層,
Docker鏡像都是只讀的,所以無法對鏡像進行操作,所以操作都是基于容器層的,當容器啟動時,一個新的可寫層被加載到鏡像的頂部,
Docker常用的命令
docker鏡像是docker容器運行時的只讀模板,鏡像可以用來創建docker容器
docker version #版本資訊
docker info #docker系統資訊和鏡像(詳細)
docker --help #幫助命令
docker images #查看鏡像
docker search #搜索鏡像
docker pull 鏡像名 [:tag]版本 docker pull mysql:5.7 #下載鏡像
docker rmi -f c8562eaf9d81(鏡像id) #洗掉鏡像
docker rmi -f $(docker images -aq) #洗掉全部的鏡像
關于容器命令
Docker 利用容器來運行應用,一個Docker容器包含了所有的某個應用運行所需要的環境,每一個 Docker 容器都是從 Docker
鏡像創建的,Docker 容器可以運行、開始、停止、移動和洗掉,每一個 Docker 容器都是獨立和安全的應用平臺,
鏡像是只讀的,容器在啟動的時候,創建一層可寫層作為最上層
- 使用下載centos測驗
docker pull centos
- 新建容器啟動
docker run [可選引數] image
#可選引數
--name="Name" #容器名字
-d #后臺運行方式
-it #使用互動式方式運行
-p 指定容器埠 // -p 主機埠:容器埠 // -p 隨機指定埠
-v #卷掛載
- 啟動成功
[root@jf-server02 ~]# docker run -it centos /bin/bash
[root@2f919ced6f44 /]#
exit //退出(停止容器)
Ctrl+P+Q (不停止退出)
- 當前運行容器
docker ps
docker ps -a #最近運行容器
- 洗掉容器
docker rm 容器id #洗掉容器
docker rm -f $(docker ps-aq) #洗掉所有容器
- 停止重啟容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id #強制停止
docker中容器的關系

其他常用命令
docker run -d centos #不進入容器啟動,后臺運行
# 但是,docker容器后臺運行,就應該有前臺行程;docker發現容器沒有被應用就會停止運行
- 查看日志
docker logs -f -t --tail 10 鏡像id or 鏡像名
docker inspect centos #容器詳細資訊
進入當前正在運行的容器
docker exec -it 容器id /bin/bash #進入正在運行的容器,開啟新的終端
docker attach 容器id #進入容器,查看正在執行的任務
docker容器檔案移動復制
docker cp 容器id 容器目錄 目的目錄 #拷貝容器檔案
docker 安裝測驗命令
一般用來測驗,用完后就docker就自動洗掉容器了,docker ps查詢無此容器
docker run -it --rm tomcat:9.0
一般安裝使用命令(安裝運行nginx)
docker run -d --name nginx02 -p 3345:80 nginx
commit鏡像
源鏡像是只讀的,可以向docker提交自己更改過的鏡像,以便下次使用
docker commit -a="demo" -m="備注做了修改" 容器id 版本資訊
安裝可視化工具Portainer和Rancher
Docker圖形化界面管理工具
- Portainer安裝
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
- 訪問地址:ip地址+:8088,選擇local身份注冊登錄

- Rancher安裝(CI/CD再用)
docker run -d --restart**=**unless-stopped -p 8080:8080 rancher/server
容器資料卷
命名的容器掛載資料卷,其他的容器通過掛載這個父容器實作資料共享,掛載資料卷的容器,我們稱為資料卷容器,
docker容器資料卷可以看成使我們生活中常用的u盤,它存在于一個或多個的容器中,由docker掛載到容器,但不屬于聯合檔案系統,Docker不會在容器洗掉時洗掉其掛載的資料卷,
通過命令列掛載的方式,命令如下:
docker run -it -v /宿主機絕對路徑目錄: /容器內目錄 鏡像名
這個命令會在宿主機和容器內分別建立兩個目錄,兩個目錄是對接的,里面的資料可以共享,如果我們不知道資料卷是否掛載成功時,可以通過以下方式來檢查資料卷的掛載結果,
docker inspect 容器id #查看容器詳細資訊
在容器內創建test.java檔案,宿主機同步

比較常見到的,將組態檔等掛載到宿主機,就可以在本地修改,容器內會自動同步;
具名和匿名掛載
- 匿名掛載
[root@jf-server02 ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx
[root@jf-server02 ~]# docker volume ls #查看所有卷
DRIVER VOLUME NAME
local 4d82b139aaa331f9cc700a3bbc8f43a66172d975617cd92764d2f5ab6994104d
local 81234b75f198a59bb1a7e55d2d6ffcd0533c3b83724f14f5bda463c05a1c19e5
local fe5eb5aef188abd2e2a80827fbd03b1b4e10bfc97588b2d8151a808d16ba4010
- 具名掛載
[root@jf-server02 etc]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
1e334ae2e7aa1b9853f37b04ace7310871762e2a10987f786f977e3361cac5c2
[root@jf-server02 etc]# docker volume ls
DRIVER VOLUME NAME
local 4d82b139aaa331f9cc700a3bbc8f43a66172d975617cd92764d2f5ab6994104d
local 81234b75f198a59bb1a7e55d2d6ffcd0533c3b83724f14f5bda463c05a1c19e5
local fe5eb5aef188abd2e2a80827fbd03b1b4e10bfc97588b2d8151a808d16ba4010
local juming-nginx #具名掛載定義的別名
進入docker目錄
[root@jf-server02 /]# cd /var/lib/docker/
[root@jf-server02 docker]# ls
builder containers network plugins swarm trust
buildkit image overlay2 runtimes tmp volumes
[root@jf-server02 docker]# cd volumes/
[root@jf-server02 volumes]# ls
4d82b139aaa331f9cc700a3bbc8f43a66172d975617cd92764d2f5ab6994104d
81234b75f198a59bb1a7e55d2d6ffcd0533c3b83724f14f5bda463c05a1c19e5
backingFsBlockDev
fe5eb5aef188abd2e2a80827fbd03b1b4e10bfc97588b2d8151a808d16ba4010
juming-nginx
metadata.db
如何判斷是具名掛載還是指定路徑掛載
-v 容器內路徑 #匿名掛載
-v 卷名:容器內路徑 #具名掛載
-v /宿主機路徑::容器內路徑 #指定路徑掛載
對掛載資料卷設定權限
ro#只讀 只能通過宿主機操作,容器只有讀權限,操作限制
rw#可讀可寫
docker run -d -p --name nginx01 -v juming-nginx:/etc/nginx:ro(設定只讀權限) nginx
案例一:多個mysql實作資料共享
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
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02
--volumes-from mysql01 mysql:5.7 #掛載到 mysql01
這兩個容器可以實作資料同步
DockerFile
什么是 Dockerfile?
Dockerfile 是一個用來構建鏡像的文本檔案,文本內容包含了一條條構建鏡像所需的指令和說明,可以使用在命令列中呼叫任何命令, Docker通過讀取DockerFile`中的指令自動生成映像,
Dockerfile檔案說明
Docker以從上到下的順序運行Dockerfile的指令,為了指定基本映像,第一條指令必須是FROM,一個宣告以#字符開頭則被視為注釋,可以在Docker檔案中使用RUN,CMD,FROM,EXPOSE,ENV等指令,Dockerfile 一般分為四部分:基礎鏡像資訊、維護者資訊、鏡像操作指令和容器啟動時執行指令
#補充說明
CMD #容器啟動時運行命令 !可被替代
ENTRYPOINT #容器啟動運行命令 !可被追加命令
VOLUME #掛載目錄
ONBUILD # 構建一個被繼承dockerfile時就會運行,觸發命令
使用 Dockerfile 定制鏡像
docker build命令用于從Dockerfile構建映像,可以在docker build命令中使用-f標志指向檔案系統中任何位置的Dockerfile,
例1:創建dockerfile1腳本
[root@jf-server02 docker-test-volume]# touch dockerfile1
[root@jf-server02 docker-test-volume]# vim dockerfile1
[root@jf-server02 docker-test-volume]# cat dockerfile1
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end-----"
CMD /bin/bash
[root@jf-server02 docker-test-volume]# pwd
/home/docker-test-volume
docker build -f /home/docker-test-volume/dockerfile1 -t centos:1.0 . # .代表當前目錄
# -f dockerfile檔案地址 -t 鏡像名和版本
- 運行新鏡像,發現dockerfile腳本匿名掛載的資料卷出現在新鏡像中
[root@jf-server02 docker-test-volume]# docker run -it cabee6a5c87e /bin/bash
[root@8f271ab96163 /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01
例2:創建dockerfile2腳本
[root@jf-server02 dockerfile]# vim dockerfile2
[root@jf-server02 dockerfile]# cat dockerfile2
FROM centos
MAINTAINER jfcoder
ENV MYPATH /usr/local #默認作業目錄
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo "---end---"
CMD /bin/bash
- 運行dockerfile2 構建新鏡像
[root@jf-server02 dockerfile]# docker build -f dockerfile2 -t mycentos:01 .
[root@jf-server02 dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 01 8a53e2358d6a About a minute ago 282MB
[root@jf-server02 dockerfile]# docker run -it 8a53e2358d6a #鏡像創建成功
[root@501ab4c93eed local]#
- 使用查看鏡像構建程序 docker history 鏡像ID
[root@jf-server02 dockerfile]# docker history 8a53e2358d6a
IMAGE CREATED CREATED BY SIZE COMMENT
8a53e2358d6a 23 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
f55702227aa1 23 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
74277d42893f 23 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
15bf8701f7d9 23 minutes ago /bin/sh -c yum -y install net-tools 14.3MB
ae0cd1e7da79 23 minutes ago /bin/sh -c yum -y install vim 58MB
3c61665ba81e 23 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
6e792da7eb66 23 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
96f5bf7a8914 23 minutes ago /bin/sh -c #(nop) MAINTAINER jfcoder 0B
300e315adb2f 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
發布鏡像
- DockerHub
- 注冊一個賬號:https://hub.docker.com
- 在服務器提交鏡像
[root@jf-server02 /]# docker login -u ??? #登錄
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
- 推送
docker push mycentos:01 #盡量帶上版本號 tag
- 阿里云
- 注冊阿里云賬號,找到容器鏡像服務

-
登錄阿里云Docker Registry
$ sudo docker login --username=用戶名 registry.cn-shenzhen.aliyuncs.com #地址用于登錄的用戶名為阿里云賬號全名,密碼為開通服務時設定的密碼,
用于登錄的用戶名為阿里云賬號全名,密碼為開通服務時設定的密碼,
您可以在訪問憑證頁面修改憑證密碼,
- 從Registry中拉取鏡像
$ sudo docker pull registry.cn-shenzhen.aliyuncs.com/docker-jfcoder/docker-demo:[鏡像版本號]- 將鏡像推送到Registry
$ sudo docker login --username=username 容器地址 $ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/???/docker-demo:[鏡像版本號] $ sudo docker push registry.cn-shenzhen.aliyuncs.com/???/docker-demo:[鏡像版本號]
案例二:使用dockerfile構建Tomcat
- 準備tomcat和JDK1.8壓縮包
[root@jf-server02 /]# cat dockerfile
FROM centos
MAINTAINER jfcoder
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
#JDK環境
ENV JAVA_HOME /usr/local/jdk1.8
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#Tomcat環境
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#暴露埠
EXPOSE 8080
#啟動Tomcat
CMD /usr/local/apache-tomcat-9.0/bin/startup.sh && tail -f /usr/local/apach-tomcat-9.0/bin/logs/catalina.out
-
構建鏡像
撰寫dockerfile檔案,build會自動尋找這個檔案,不需要
-f指定
docker build -t tomcatdemo .
- 啟動鏡像
docker run -d -p 9090:8080 --name tomcatdemo -v +需要掛載的目錄
階段小結
Docker網路
了解docker網路
- 查看本機ip資訊,docker0網卡,使用橋接模式
[root@jf-server02 /]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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 qlen 1000
link/ether 00:16:3e:0a:9a:d4 brd ff:ff:ff:ff:ff:ff
inet 172.21.148.110/20 brd 172.21.159.255 scope global dynamic eth0
valid_lft 315169625sec preferred_lft 315169625sec
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:a0:80:9b:df 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
看到三個網路資訊,docker如何處理容器網路訪問?使用tomcat鏡像做測驗!
-
看到容器啟動時,docker分配給tomcat01 一個docker內部eth0@if27 ip地址
[root@jf-server02 /]# docker run -d --name tomcat01 tomcat [root@jf-server02 /]# docker exec -it tomcat01 ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 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 26: eth0@if27: <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通docker容器內部,再次查看發現,docker為新容器生成新的IP網卡
[root@jf-server02 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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 qlen 1000
link/ether 00:16:3e:0a:9a:d4 brd ff:ff:ff:ff:ff:ff
inet 172.21.148.110/20 brd 172.21.159.255 scope global dynamic eth0
valid_lft 315168091sec preferred_lft 315168091sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:a0:80:9b:df 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
27: veth0b3c0b2@if26: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 62:f3:1c:7e:65:aa brd ff:ff:ff:ff:ff:ff link-netnsid 0
所以容器在不指定網路的情況下,都是docker0網卡路由的,docker會給容器分配一個默認的可用IP地址;容器洗掉后,對應網橋就被洗掉了;
自定義網路
使用–link進行網路連接
要是容器重啟,IP變化了,如何訪問容器?
docker提供了
--link命令
測驗--link命令,反向無法ping通
[root@jf-server02 /]# docker run -d -P --name tomcat01 tomcat
81b9e49e91595390dfc315cc2dc874094abeae06381d749474741fd0edab4efb
[root@jf-server02 /]# docker run -d -P --name tomcat02 --link tomcat01 tomcat
eac718df71d9720a15d62f8511136b5b70303d7ea4ec0f9375dacbaf204f55d0
[root@jf-server02 /]# docker exec -it tomcat01 ping tomcat02
ping: tomcat02: Name or service not known
[root@jf-server02 /]# docker exec -it tomcat02 ping tomcat01
PING tomcat01 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.129 ms
查看tomcat02 hosts組態檔,看到添加了tomcat01映射
[root@jf-server02 /]# docker exec -it tomcat02 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 tomcat01 81b9e49e9159
172.17.0.3 eac718df71d9
自定義網路連接(推薦使用)
[root@jf-server02 /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3c4dcc9da21b bridge bridge local
891756e520f9 host host local
6b70477c3d00 none null local
網路模式
bridge 橋接模式(docker默認)
none 不配置網路
**host ** 和宿主機共享網路
docker0特點,默認的橋接網路,域名無法訪問,使用–link可以進行容器間的連接;
- 自定義網路demonet
[root@jf-server02 /]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 demonet
[root@jf-server02 /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3c4dcc9da21b bridge bridge local
082cd5acc532 demonet bridge local #創建成功
891756e520f9 host host local
6b70477c3d00 none null local
使用tomcat鏡像測驗效果
[root@jf-server02 /]# docker run -d -P --name tomcat01 --net demonet tomcat
8811a3366fddd90e465c6f46bdc87ca4ff2e726a8b587761841ca50308fdcf53
[root@jf-server02 /]# docker run -d -P --name tomcat02 --net demonet tomcat
d11cfec2e82dd40d63a31787ddf021f028c20961ff76154f2293001d29960bc8
tomcat01 ping tomcat02 可以ping通,無需使用–link,并且更完善
[root@jf-server02 /]# docker exec -it tomcat01 ping tomcat02
PING tomcat02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat02.demonet (192.168.0.3): icmp_seq=1 ttl=64 time=0.077 ms
假設要跨網路操作容器,就需要使用docker network connect 連通,將此容器加到自定義網路(demonet)中;
案例三: Redis 集群部署
-
創建自定義網路
docker network create redis --subnet 172.38.0.0/16 -
通過腳本創建6個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
[root@jf-server02 ~]# cd /mydata/
[root@jf-server02 mydata]# ls
redis
[root@jf-server02 mydata]# cd redis/
[root@jf-server02 redis]# ls
node-1 node-2 node-3 node-4 node-5 node-6 #創建成功
[root@jf-server02 redis]#
- 啟動redis容器(啟動六個redis,通過更改埠號,容器名,ip地址,掛載目錄)
docker run -p 6371:6379 -p 16371: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
#六個redis容器
[root@jf-server02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c1514ddc977 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6376->6379/tcp, 0.0.0.0:16376->16379/tcp redis-6
135efe1e44dc redis:5.0.9-alpine3.11 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6375->6379/tcp, 0.0.0.0:16375->16379/tcp redis-5
278695f5b036 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:6374->6379/tcp, 0.0.0.0:16374->16379/tcp redis-4
8c69e882b4a1 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 8 minutes ago Up 8 minutes 0.0.0.0:6373->6379/tcp, 0.0.0.0:16373->16379/tcp redis-3
4c3f9da0bfa0 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 0.0.0.0:6372->6379/tcp, 0.0.0.0:16372->16379/tcp redis-2
dfedc0fd6ab8 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:6371->6379/tcp, 0.0.0.0:16371->16379/tcp redis-1
- 進去redis-1容器,創建集群
[root@jf-server02 redis]# docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof nodes.conf
/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.15:6379 172.38.0.16:6379 --cluster-replicas 1
#最后按照提示選擇yes創建集群
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
- 驗證是否創建成功
/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:331
cluster_stats_messages_pong_sent:307
cluster_stats_messages_sent:638
cluster_stats_messages_ping_received:302
cluster_stats_messages_pong_received:331
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:638
127.0.0.1:6379>
驗證集群的高可用性
- 進入集群
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK
- 步驟一存在redis a的值在 172.38.0.13中,關閉172.38.0.13容器,驗證高可用性
[root@jf-server02 ~]# docker stop 8c69e882b4a1
8c69e882b4a1
- 然后在進入集群 get a 的值,發現172.38.0.14中存在a的值b;
/data # redis-cli -c
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.38.0.14:6379
"b"
案例四:Springboot微服務專案部署
- 構建springboot專案,打包應用,得到demo-0.0.0-SNAPSHOT.jar檔案
- 撰寫dockerfile
- 遠程上傳jar包和Dockerfile檔案,構建鏡像,發布運行
[root@jf-server02 demodocker]# ls
demo-0.0.1-SNAPSHOT.jar Dockerfile
[root@jf-server02 demodocker]# docker build -t hello .
Sending build context to Docker daemon 17.05MB
Step 1/5 : FROM java:8
8: Pulling from library/java
5040bd298390: Pull complete
fce5728aad85: Pull complete
76610ec20bf5: Pull complete
60170fec2151: Pull complete
e98f73de8f0d: Pull complete
11f7af24ed9c: Pull complete
49e2d6393f32: Pull complete
bb9cdec9c7f3: Pull complete
#運行鏡像
[root@jf-server02 demodocker]# docker run -d -P --name hello-spring hello
后續:Docker Compose
Docker Swarm
CI/CD之Jenkins
推薦B站狂神說docker教程,熱衷開源分享
? 收藏起來,謹防迷路
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/264811.html
標籤:其他
上一篇:Echarts之氣泡圖圖例
下一篇:藍綠部署與滾動部署








