主頁 >  其他 > 看菜鳥如何用一篇文章學Docker(超詳細)

看菜鳥如何用一篇文章學Docker(超詳細)

2021-03-01 10:45:03 其他

文章目錄

      • 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檔案中使用RUNCMDFROMEXPOSEENV等指令,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
  1. 注冊一個賬號:https://hub.docker.com
  2. 在服務器提交鏡像
[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
  1. 推送
docker push mycentos:01 #盡量帶上版本號 tag
  • 阿里云
  1. 注冊阿里云賬號,找到容器鏡像服務
    在這里插入圖片描述
  2. 登錄阿里云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> 

驗證集群的高可用性

  1. 進入集群
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK
  1. 步驟一存在redis a的值在 172.38.0.13中,關閉172.38.0.13容器,驗證高可用性
[root@jf-server02 ~]# docker stop 8c69e882b4a1
8c69e882b4a1
  1. 然后在進入集群 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微服務專案部署

  1. 構建springboot專案,打包應用,得到demo-0.0.0-SNAPSHOT.jar檔案

在這里插入圖片描述

  1. 撰寫dockerfile

在這里插入圖片描述

  1. 遠程上傳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之氣泡圖圖例

下一篇:藍綠部署與滾動部署

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more