Docker


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

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://www.docker.com/

文檔地址: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.登錄阿里雲找到

image-20200604151346016

2.找到鏡像加速地址

image-20200604151210550

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流程

image-20200604151811802

Docker運行原理圖:

DockerHub:是一個倉庫

image-20200604153054992

底層原理

Docker是怎么工作的?

Docker是一個Client-Server 結構的系統,Docker的守護進程運行在主機上,通過Socket從客戶端訪問!

DockerServer接收到Docker-Client的指令,就會執行這個命令

Docker 為什么比VM快?

1、Docker有着比虛擬機更少的抽象層

2、docker利用的是宿主機的內核,vm需要的是Guest OS

image-20200604154849904

​ 所以說,新建一個容器的時候,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

image-20200604165112545

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宿主機就能夠檢測到日志

image-20200604235140224

查看鏡像元數據

[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"
}

# 啟動成功之后就可以關閉,增加內存的測試

image-20200606201226503

# 趕緊關閉,增加內存的限制,修改配置文件  -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

這樣就可以發現內存消耗變小了

image-20200606210122855

[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/

通過地址訪問

image-20200608094234885

image-20200608095113410

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上面

https://images.cnblogs.com/cnblogs_com/rzkwz/1782920/o_200608090451Linux.jpg

總結一句話;容器的持久化和同步操作!容器間也是可以數據共享的!

使用數據卷

方式一:直接使用命令來掛載 -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技術

思考一個場景,我們編寫一個微服務,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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM