日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Docker学习笔记 (狂神说)

發(fā)布時(shí)間:2023/12/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Docker学习笔记 (狂神说) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

狂神視頻地址:https://www.bilibili.com/video/BV1og4y1q7M4
已經(jīng)有人寫過此視頻的學(xué)習(xí)文檔了,
地址:https://blog.csdn.net/weixin_44517301/article/details/121486489
但由于時(shí)間原因,部分命令已經(jīng)不能使用,因此發(fā)布此篇

Docker概述

Docker為什么出現(xiàn)

一款產(chǎn)品: 開發(fā)–上線 兩套環(huán)境!應(yīng)用環(huán)境,應(yīng)用配置!

開發(fā) — 運(yùn)維。 問題:我在我的電腦上可以運(yùn)行!版本更新,導(dǎo)致服務(wù)不可用!對于運(yùn)維來說考驗(yàn)十分大!

環(huán)境配置是十分的麻煩,每一個(gè)機(jī)器都要部署環(huán)境(Redis、ES、Hadoop…) !費(fèi)事費(fèi)力。

發(fā)布一個(gè)項(xiàng)目( jar + (Redis+MySQL+jdk+ES) ),項(xiàng)目能不能帶上環(huán)境安裝打包

之前在服務(wù)器配置一個(gè)應(yīng)用的環(huán)境 Redis MySQL JDK ES Hadoop 配置超麻煩了,不能夠跨平臺(tái)。

開發(fā)環(huán)境Windows,最后發(fā)布到Linux!

傳統(tǒng):開發(fā)做成jar包,運(yùn)維來做部署!

現(xiàn)在:開發(fā)打包部署上線,一套流程做完!

安卓流程:java — apk —發(fā)布(應(yīng)用商店) 張三使用apk 一 安裝即可用!

docker流程: java-jar(環(huán)境) — 打包項(xiàng)目帯上環(huán)境(鏡像)— 發(fā)布( Docker倉庫:商店)----- 下載我們發(fā)布的鏡像—直接運(yùn)行即可

Docker給以上的問題,提出了解決方案!

Docker的思想就來自于集裝箱!

jre 中多個(gè)應(yīng)用(可能端口沖突) – 因?yàn)槎际墙徊娴?#xff01;
隔離:Docker核心思想!打包裝箱!每個(gè)箱子是互相隔離的。

Docker通過隔離機(jī)制,可以將服務(wù)器利用到極致!

Docker歷史

2010年,幾個(gè)年輕人,在美國成立了一家公司 dotcloud

做一些pass的云計(jì)算服務(wù)!LXC(Linux Container容器)有關(guān)的容器技術(shù)!

Linux Container容器是一種內(nèi)核虛擬化技術(shù),可以提供輕量級(jí)的虛擬化,以便隔離進(jìn)程和資源。

他們將自己的技術(shù)(容器化技術(shù))命名就是 Docker

Docker剛剛延生的時(shí)候,沒有引起行業(yè)的注意!

2013年,Docker開源!

越來越多的人發(fā)現(xiàn)docker的優(yōu)點(diǎn)!火了。Docker每個(gè)月都會(huì)更新一個(gè)版本!

2014年4月9日,Docker1.0發(fā)布!

docker為什么這么火?十分的輕巧!

在容器技術(shù)出來之前,我們都是使用虛擬機(jī)技術(shù)!

虛擬機(jī):在window中裝一個(gè)VMware,通過這個(gè)軟件我們可以虛擬出來一臺(tái)或者多臺(tái)電腦!笨重!

虛擬機(jī)也屬于虛擬化技術(shù),Docker容器技術(shù),也是一種虛擬化技術(shù)!

VMware : linux centos 原生鏡像(一個(gè)電腦!) 隔離、需要開啟多個(gè)虛擬機(jī)! 幾個(gè)G,幾分鐘 docker: 隔離,鏡像(最核心的環(huán)境 4m + jdk + mysql)十分的小巧,運(yùn)行鏡像就可以了!小巧! 幾個(gè)M,秒級(jí)啟動(dòng)!

Docker基于Go語言開發(fā)的!開源項(xiàng)目!

docker官網(wǎng):https://www.docker.com/

文檔:https://docs.docker.com/ Docker的文檔是超級(jí)詳細(xì)的!

倉庫:https://hub.docker.com/

Docker能做什么

之前的虛擬機(jī)技術(shù)

虛擬機(jī)技術(shù)缺點(diǎn)

1、 資源占用十分多

2、 冗余步驟多

3、 啟動(dòng)很慢!

容器化技術(shù)

容器化技術(shù)不是模擬一個(gè)完整的操作系統(tǒng)!!!

比較Docker和虛擬機(jī)技術(shù)的不同:

  • 傳統(tǒng)虛擬機(jī),虛擬出一套硬件,運(yùn)行一個(gè)完整的操作系統(tǒng),然后在這個(gè)系統(tǒng)上安裝和運(yùn)行軟件
  • 容器內(nèi)的應(yīng)用直接運(yùn)行在宿主機(jī)的內(nèi)容,容器是沒有自己的內(nèi)核的,也沒有虛擬我們的硬件,所以就輕便了
  • 每個(gè)容器間是互相隔離,每個(gè)容器內(nèi)都有一個(gè)屬于自己的文件系統(tǒng),互不影響

應(yīng)用更快速的交付和部署

傳統(tǒng):一對幫助文檔,安裝程序。

Docker:打包鏡像發(fā)布測試一鍵運(yùn)行。

更便捷的升級(jí)和擴(kuò)縮容

使用了 Docker之后,我們部署應(yīng)用就和搭積木一樣
項(xiàng)目打包為一個(gè)鏡像,擴(kuò)展服務(wù)器A!服務(wù)器B

更簡單的系統(tǒng)運(yùn)維
在容器化之后,我們的開發(fā),測試環(huán)境都是高度一致的

更高效的計(jì)算資源利用

Docker是內(nèi)核級(jí)別的虛擬化,可以在一個(gè)物理機(jī)上可以運(yùn)行很多的容器實(shí)例!服務(wù)器的性能可以被壓榨到極致。

Docker安裝

Docker的基本組成

鏡像(image):

docker鏡像就好比是一個(gè)模板,可以通過這個(gè)目標(biāo)來創(chuàng)建容器服務(wù),tomcat鏡像==>run(運(yùn)行)==>容器(提供服務(wù)器),通過這個(gè)鏡像可以創(chuàng)建多個(gè)容器(最終服務(wù)運(yùn)行或者項(xiàng)目運(yùn)行就是在容器中的)。

容器(container):

Docker利用容器技術(shù),獨(dú)立運(yùn)行一個(gè)或者一組應(yīng)用,通過鏡像來創(chuàng)建的.
啟動(dòng),停止,刪除,基本命令
目前就可以把這個(gè)容器理解為就是一個(gè)簡易的 Linux系統(tǒng)。

倉庫(repository):

倉庫就是存放鏡像的地方!
倉庫分為公有倉庫和私有倉庫。(類似git)
Docker Hub是國外的。
阿里云、騰訊云都有容器服務(wù)器(配置鏡像加速!)

Docker安裝(CentOS 7)

環(huán)境準(zhǔn)備

  • Linux要求內(nèi)核3.0以上

  • CentOS 7

  • # 系統(tǒng)內(nèi)核要求3.0以上 [root@VM-4-17-centos ~]# uname -r 3.10.0-1160.66.1.el7.x86_64[root@VM-4-17-centos ~]# 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"

    安裝

    幫助文檔:https://docs.docker.com/engine/install/

    卸載與安裝

    #1.卸載舊版本 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.設(shè)置鏡像的倉庫 yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo #上述方法默認(rèn)是從國外的,不推薦#推薦使用國內(nèi)的 yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#更新yum軟件包索引 yum makecache fast#4.安裝docker相關(guān)的 docker-ce 社區(qū)版 而ee是企業(yè)版 yum install docker-ce docker-ce-cli containerd.io # 這里我們使用社區(qū)版即可#5.啟動(dòng)docker systemctl start docker#6. 使用docker version查看是否按照成功 docker version#7. 測試 docker run hello-world#8.查看已經(jīng)下載的鏡像(從這里可以查看已有鏡像的id) [root@iz2zeak7sgj6i7hrb2g862z ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 12 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的默認(rèn)工作路徑!

    回顧HelloWorld流程

    docker run 流程圖

    底層原理

    Docker是怎么工作的

    Docker是一個(gè)Client-Server結(jié)構(gòu)的系統(tǒng),Docker的守護(hù)進(jìn)程運(yùn)行在主機(jī)上。通過Socket從客戶端訪問!

    Docker-Server接收到Docker-Client的指令,就會(huì)執(zhí)行這個(gè)命令!


    為什么Docker比Vm快

    1、docker有著比虛擬機(jī)更少的抽象層。

    ? 由于docker不需要Hypervisor實(shí)現(xiàn)硬件資源虛擬化,運(yùn)行在docker容器上的程序直接使用的都是實(shí)際物理機(jī)的硬件資源。因此在CPU、內(nèi)存利用率上docker將會(huì)在效率上有明顯優(yōu)勢。
    2、docker利用的是宿主機(jī)的內(nèi)核,而不需要Guest OS。

    GuestOS: VM(虛擬機(jī))里的的系統(tǒng)(OS)HostOS:物理機(jī)里的系統(tǒng)(OS)

    因此,當(dāng)新建一個(gè) 容器時(shí),docker不需要和虛擬機(jī)一樣重新加載一個(gè)操作系統(tǒng)內(nèi)核。

    當(dāng)新建一個(gè)虛擬機(jī)時(shí),虛擬機(jī)軟件需要加載GuestOS,這個(gè)新建過程是分鐘級(jí)別的。

    而docker由于直接利用宿主機(jī)的操作系統(tǒng),則省略了這個(gè)復(fù)雜的過程,因此新建一個(gè)docker容器只需要幾秒鐘。

    Docker的常用命令

    1、幫助命令

    docker version #顯示docker的版本信息。 docker info #顯示docker的系統(tǒng)信息,包括鏡像和容器的數(shù)量 docker 命令 --help #幫助命令

    幫助文檔的地址:https://docs.docker.com/engine/reference/commandline/build/

    2、鏡像命令

    docker images查看所有本地的主機(jī)上的鏡像

    [root@VM-4-17-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 12 months ago 13.3kB# 解釋 #REPOSITORY # 鏡像的倉庫源 #TAG # 鏡像的標(biāo)簽(版本) ---lastest 表示最新版本 #IMAGE ID # 鏡像的id #CREATED # 鏡像的創(chuàng)建時(shí)間 #SIZE # 鏡像的大小# 可選項(xiàng) Options:-a, --all Show all images (default hides intermediate images) #列出所有鏡像-q, --quiet Only show numeric IDs # 只顯示鏡像的id[root@VM-4-17-centos ~]# docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 12 months ago 13.3kB [root@VM-4-17-centos ~]# docker images -aq feb5d9fea6a5

    docker search 搜索鏡像

    [root@VM-4-17-centos ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 13234 [OK] mariadb MariaDB Server is a high performing open sou… 5062 [OK] phpmyadmin phpMyAdmin - A web interface for MySQL and M… 640 [OK] percona Percona Server is a fork of the MySQL relati… 588 [OK] bitnami/mysql Bitnami MySQL Docker Image 77 [OK] databack/mysql-backup Back up mysql databases to... anywhere! 70 linuxserver/mysql-workbench 44 linuxserver/mysql A Mysql container, brought to you by LinuxSe… 37 ubuntu/mysql MySQL open source fast, stable, multi-thread… 36 circleci/mysql MySQL is a widely used, open-source relation… 27 google/mysql MySQL server for Google Compute Engine 21 [OK] rapidfort/mysql RapidFort optimized, hardened image for MySQL 13 bitnami/mysqld-exporter 3 ibmcom/mysql-s390x Docker image for mysql-s390x 2 newrelic/mysql-plugin New Relic Plugin for monitoring MySQL databa… 1 [OK] vitess/mysqlctld vitess/mysqlctld 1 [OK] hashicorp/mysql-portworx-demo 0 docksal/mysql MySQL service images for Docksal - https://d… 0 mirantis/mysql 0 cimg/mysql 0 drud/mysql 0 silintl/mysql-backup-restore Simple docker image to perform mysql backups… 0 [OK] corpusops/mysql https://github.com/corpusops/docker-images/ 0 drud/mysql-local-57 ddev mysql local container 0 drud/mysql-docker-local-57 This repo has been deprecated, new tags are … 0 # --filter=STARS=3000 #過濾,搜索出來的鏡像收藏STARS數(shù)量大于3000的 Options:-f, --filter filter Filter output based on conditions provided--format string Pretty-print search using a Go template--limit int Max number of search results (default 25)--no-trunc Don't truncate output[root@VM-4-17-centos ~]# docker search mysql --filter=STARS=3000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 13234 [OK] mariadb MariaDB Server is a high performing open sou… 5062 [OK]

    docker pull 下載鏡像

    # 下載鏡像 docker pull 鏡像名[:tag] [root@VM-4-17-centos ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql #如果不寫tag,默認(rèn)就是latest 051f419db9dd: Pull complete #分層下載: docker image 的核心 聯(lián)合文件系統(tǒng) 7627573fa82a: Pull complete a44b358d7796: Pull complete 95753aff4b95: Pull complete a1fa3bee53f4: Pull complete f5227e0d612c: Pull complete b4b4368b1983: Pull complete f26212810c32: Pull complete d803d4215f95: Pull complete d5358a7f7d07: Pull complete 435e8908cd69: Pull complete Digest: sha256:b9532b1edea72b6cee12d9f5a78547bd3812ea5db842566e17f8b33291ed2921 #簽名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #真實(shí)地址#以下兩條命令等價(jià) docker pull mysql docker pull docker.io/library/mysql:latest[root@VM-4-17-centos ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql 90fe46dd8199: Already exists #分層下載: docker image 的核心 聯(lián)合文件系統(tǒng) 35a4f1977689: Already exists bbc37f14aded: Already exists 74e27dc593d4: Already exists 93a01fbfad7f: Already exists 3c9ea9927039: Pull complete dfb1b236c7fc: Pull complete e2ad62bd72a7: Pull complete Digest: sha256:94fe67a04001e9841f68f114c8e9b5231c1d012e6b00d3b8ade42c0c5e239a0f Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7

    docker rmi 刪除鏡像

    docker rmi -f 鏡像id #刪除指定id的鏡像 docker rmi -f 鏡像id1 鏡像id2 鏡像id3 #刪除多個(gè)鏡像[root@VM-4-17-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7 aa803eda0f25 11 days ago 433MB mysql latest 43fcfca0776d 2 weeks ago 449MB hello-world latest feb5d9fea6a5 12 months ago 13.3kB [root@VM-4-17-centos ~]# docker rmi aa803eda0f25 Untagged: mysql:5.7docker rmi -f $(docker images -aq) #刪除全部的鏡像

    3、容器命令

    說明:我們有了鏡像才可以創(chuàng)建容器,Linux,下載一個(gè)centos鏡像來學(xué)習(xí)

    docker pull centos[root@VM-4-17-centos ~]# docker pull centos Using default tag: latest latest: Pulling from library/centos a1d0c7532777: Pull complete Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 Status: Downloaded newer image for centos:latest docker.io/library/centos:latest

    新建容器并啟動(dòng)

    docker run [可選參數(shù)] image | docker container run [可選參數(shù)] image #參書說明 --name="Name" #容器名字 tomcat01 tomcat02 用來區(qū)分容器 -d #后臺(tái)方式運(yùn)行 -it #使用交互方式運(yùn)行,進(jìn)入容器查看內(nèi)容 -p #指定容器的端口 -p 8080(宿主機(jī)):8080(容器)-p ip:主機(jī)端口:容器端口-p 主機(jī)端口:容器端口(常用)-p 容器端口容器端口 -P(大寫) 隨機(jī)指定端口# 測試、啟動(dòng)并進(jìn)入容器 [root@VM-4-17-centos ~]# docker run -it centos /bin/bash [root@fca965a8d399 /]# ls #查看內(nèi)部的centos bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@fca965a8d399 /]# exit #退回主機(jī) exit

    列出所有運(yùn)行的容器

    docker ps 命令 #列出當(dāng)前正在運(yùn)行的容器-a, --all #列出當(dāng)前正在運(yùn)行的容器 + 帶出歷史運(yùn)行過的容器-n=?, --last int #列出最近創(chuàng)建的?個(gè)容器 ?為1則只列出最近創(chuàng)建的一個(gè)容器,為2則列出2個(gè)-q, --quiet #只列出容器的編號(hào)[root@VM-4-17-centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@VM-4-17-centos ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fca965a8d399 centos "/bin/bash" 5 minutes ago Exited (0) 5 minutes ago peaceful_matsumoto 75e65c92b2b8 feb5d9fea6a5 "/hello" 52 minutes ago Exited (0) 52 minutes ago eager_johnson de2f71289142 feb5d9fea6a5 "/hello" 12 days ago Exited (0) 12 days ago frosty_murdock [root@VM-4-17-centos ~]# docker ps -a -n=1 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fca965a8d399 centos "/bin/bash" 6 minutes ago Exited (0) 6 minutes ago peaceful_matsumoto [root@VM-4-17-centos ~]# docker ps -aq fca965a8d399 75e65c92b2b8 de2f71289142 [root@VM-4-17-centos ~]# docker ps -aq -n=2 fca965a8d399 75e65c92b2b8

    退出容器

    exit #容器直接退出 ctrl +P +Q #容器不停止退出 ---注意:這個(gè)很有用的操作[root@VM-4-17-centos ~]# docker run -it centos /bin/bash [root@a7cb8cdd3d32 /]# [root@VM-4-17-centos ~]#

    刪除容器

    docker rm 容器id #刪除指定的容器,不能刪除正在運(yùn)行的容器,如果要強(qiáng)制刪除 rm -rf docker rm -f $(docker ps -aq) #刪除所有的容器 docker ps -a -q|xargs docker rm #刪除所有的容器

    啟動(dòng)和停止容器的操作

    docker start 容器id #啟動(dòng)容器 docker restart 容器id #重啟容器 docker stop 容器id #停止當(dāng)前正在運(yùn)行的容器 docker kill 容器id #強(qiáng)制停止當(dāng)前容器

    4、常用其他命令

    后臺(tái)啟動(dòng)命令

    # 命令 docker run -d 鏡像名 [root@VM-4-17-centos ~]# docker run -d centos c0c4edabe27667fe1834c86c40338680a3efc333c356f03e253c262e613a4a2f[root@VM-4-17-centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES# 問題docker ps. 發(fā)現(xiàn)centos停止了 # 常見的坑,docker容器使用后臺(tái)運(yùn)行,就必須要有要一個(gè)前臺(tái)進(jìn)程,docker發(fā)現(xiàn)沒有對外提供的應(yīng)用,就會(huì)自動(dòng)停止 # 例如nginx,容器啟動(dòng)后,發(fā)現(xiàn)自己沒有提供服務(wù),就會(huì)立刻停止,就是沒有程序了

    查看日志命令

    docker logs --help Options:--details Show extra details provided to logs * -f, --follow Follow log output--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes) * --tail string Number of lines to show from the end of the logs (default "all") * -t, --timestamps Show timestamps--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes) ? ~ docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #模擬日志 #顯示日志 -tf #顯示日志信息(一直更新) --tail number #需要顯示number條日志 docker logs -t --tail n 容器id #查看n行日志 docker logs -ft 容器id #跟著日志

    查看容器中的進(jìn)程信息

    docker top 容器id [root@VM-4-17-centos ~]# docker top 1f457dc49d6d UID PID PPID C STIME TTY root 11901 11882 0 14:35 ? root 13165 11901 0 14:39 ?

    查看鏡像的元數(shù)據(jù)

    docker inspect 容器id [root@VM-4-17-centos ~]# docker inspect 1f457dc49d6d [{"Id": "1f457dc49d6d9e4227284a1617b944b5307e7678aaa47e5a488425bcd056faf0","Created": "2022-10-07T06:35:17.033786362Z","Path": "/bin/sh","Args": ["-c","while true;do echo 6666;sleep 1; done"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 11901,"ExitCode": 0,"Error": "","StartedAt": "2022-10-07T06:35:17.412877686Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6","ResolvConfPath": "/var/lib/docker/containers/1f457dc49d6d9e4227284a1617b944b5307e7678aaa47e5a488425bcd056faf0/resolv.conf","HostnamePath": "/var/lib/docker/containers/1f457dc49d6d9e4227284a1617b944b5307e7678aaa47e5a488425bcd056faf0/hostname","HostsPath": "/var/lib/docker/containers/1f457dc49d6d9e4227284a1617b944b5307e7678aaa47e5a488425bcd056faf0/hosts","LogPath": "/var/lib/docker/containers/1f457dc49d6d9e4227284a1617b944b5307e7678aaa47e5a488425bcd056faf0/1f457dc49d6d9e4227284a1617b944b5307e7678aaa47e5a488425bcd056faf0-json.log","Name": "/suspicious_chaplygin","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,"CgroupnsMode": "host","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/ec3bcfe72237d908d25f24516dc5eae6c0728b7d7d7705fbffe5e49afe4eec1a-init/diff:/var/lib/docker/overlay2/4a6bb38ec524d5bda0d06ff72ded55ce46b3cefc7546432c840b6661779e8dbb/diff","MergedDir": "/var/lib/docker/overlay2/ec3bcfe72237d908d25f24516dc5eae6c0728b7d7d7705fbffe5e49afe4eec1a/merged","UpperDir": "/var/lib/docker/overlay2/ec3bcfe72237d908d25f24516dc5eae6c0728b7d7d7705fbffe5e49afe4eec1a/diff","WorkDir": "/var/lib/docker/overlay2/ec3bcfe72237d908d25f24516dc5eae6c0728b7d7d7705fbffe5e49afe4eec1a/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "1f457dc49d6d","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/sh","-c","while true;do echo 6666;sleep 1; done"],"Image": "centos","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20210915","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"NetworkSettings": {"Bridge": "","SandboxID": "1acaa5ed1212a950da1ffcedf9ed5f755c6402543606e339ca8b3200f97948b2","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/1acaa5ed1212","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "ab0a229e69e2c663cd3e898c685b124caed317686c61ca78f0015c7e1fae19a3","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:03","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "cc96daeb0587caacad93f2db01f3ae4024ba2ceb442d801eb1769bfade90c6c9","EndpointID": "ab0a229e69e2c663cd3e898c685b124caed317686c61ca78f0015c7e1fae19a3","Gateway": "172.17.0.1","IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:03","DriverOpts": null}}}} ]

    進(jìn)入當(dāng)前正在運(yùn)行的容器

    # 我們通常容器都是使用后臺(tái)方式運(yùn)行的,需要進(jìn)入容器,修改一些配置# 方式一 docker exec -it 容器id bashShell # 測試 [root@VM-4-17-centos ~]# docker exec -it 1f457dc49d6d /bin/bash [root@1f457dc49d6d /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@1f457dc49d6d /]# # 方式二 docker attach 容器id # 測試 [root@VM-4-17-centos ~]# docker attach 1f457dc49d6d區(qū)別 #docker exec #進(jìn)入當(dāng)前容器后開啟一個(gè)新的終端,可以在里面操作。(常用) #docker attach # 進(jìn)入容器正在執(zhí)行的終端

    從容器內(nèi)拷貝文件到主機(jī)

    docker cp 容器id:容器內(nèi)路徑 目的主機(jī)路徑 # 查看容器 [root@VM-4-17-centos home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2b19b6c989ee centos "/bin/bash" 47 seconds ago Up 46 seconds nice_sanderson # 進(jìn)入容器 [root@VM-4-17-centos home]# docker attach 2b19b6c989ee [root@2b19b6c989ee /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@2b19b6c989ee /]# cd home [root@2b19b6c989ee home]# ls [root@2b19b6c989ee home]# touch zwj.java [root@2b19b6c989ee home]# ls zwj.java # 拷貝 [root@2b19b6c989ee home]# touch zwj.javaread escape sequence [root@VM-4-17-centos home]# docker cp 2b19b6c989ee:/home/zwj.java /home/www # 查看驗(yàn)證 [root@VM-4-17-centos home]# cd www [root@VM-4-17-centos www]# ls zwj.java

    小結(jié)

    5、命令大全

    attach Attach local standard input, output, and error streams to a running container#當(dāng)前shell下 attach連接指定運(yùn)行的鏡像build Build an image from a Dockerfile # 通過Dockerfile定制鏡像commit Create a new image from a container's changes #提交當(dāng)前容器為新的鏡像cp Copy files/folders between a container and the local filesystem #拷貝文件create Create a new container #創(chuàng)建一個(gè)新的容器diff Inspect changes to files or directories on a container's filesystem #查看docker容器的變化events Get real time events from the server # 從服務(wù)獲取容器實(shí)時(shí)時(shí)間exec Run a command in a running container # 在運(yùn)行中的容器上運(yùn)行命令export Export a container's filesystem as a tar archive #導(dǎo)出容器文件系統(tǒng)作為一個(gè)tar歸檔文件[對應(yīng)import]history Show the history of an image # 展示一個(gè)鏡像形成歷史images List images #列出系統(tǒng)當(dāng)前的鏡像import Import the contents from a tarball to create a filesystem image #從tar包中導(dǎo)入內(nèi)容創(chuàng)建一個(gè)文件系統(tǒng)鏡像info Display system-wide information # 顯示全系統(tǒng)信息inspect Return low-level information on Docker objects #查看容器詳細(xì)信息kill Kill one or more running containers # kill指定docker容器load Load an image from a tar archive or STDIN #從一個(gè)tar包或標(biāo)準(zhǔn)輸入中加載一個(gè)鏡像[對應(yīng)save]login Log in to a Docker registry #logout Log out from a Docker registrylogs Fetch the logs of a containerpause Pause all processes within one or more containersport List port mappings or a specific mapping for the containerps List containerspull Pull an image or a repository from a registrypush Push an image or a repository to a registryrename Rename a containerrestart Restart one or more containersrm Remove one or more containersrmi Remove one or more imagesrun Run a command in a new containersave Save one or more images to a tar archive (streamed to STDOUT by default)search Search the Docker Hub for imagesstart Start one or more stopped containersstats Display a live stream of container(s) resource usage statisticsstop Stop one or more running containerstag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGEtop Display the running processes of a containerunpause Unpause all processes within one or more containersupdate Update configuration of one or more containersversion Show the Docker version informationwait Block until one or more containers stop, then print their exit codes

    練習(xí)

    Docker安裝Nginx

    #1. 搜索鏡像 search 建議大家去docker搜索,可以看到幫助文檔 [root@VM-4-17-centos www]# docker search nginx NAME DESCRIPTION STARS nginx Official build of Nginx. 17448 #2. 拉取下載鏡像 pull [root@VM-4-17-centos www]# docker pull nginx#3. 查看是否下載成功鏡像 [root@VM-4-17-centos /]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 51086ed63d8c 43 hours ago 142MB centos latest 5d0da3dc9764 12 months ago 231MB#3. 運(yùn)行測試 # -d 后臺(tái)運(yùn)行 # --name 給容器命名 # -p 宿主機(jī)端口:容器內(nèi)部端口 [root@VM-4-17-centos /]# docker run -d --name nginx1 -p 3344:80 nginx 1f58c7605ac762d29991dbccf5cf710dc98c0ff1df7b652f36891e4b337e0ea0#4. 查看正在啟動(dòng)的鏡像 [root@VM-4-17-centos /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1f58c7605ac7 nginx "/docker-entrypoint.…" 19 seconds ago Up 18 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx1 2b19b6c989ee centos "/bin/bash" 21 minutes ago Up 21 minutes #5. 進(jìn)入容器 [root@VM-4-17-centos /]# docker exec -it nginx1 /bin/bash root@1f58c7605ac7:/# whereis nginx #找到nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx#6. 停止容器 root@1f58c7605ac7:/# exit exit#7. 停止容器 [root@VM-4-17-centos /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1f58c7605ac7 nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx1 2b19b6c989ee centos "/bin/bash" 28 minutes ago Up 28 minutes nice_sanderson [root@VM-4-17-centos /]# docker stop 1f58c7605ac7 1f58c7605ac7#8. 刪除容器 [root@VM-4-17-centos /]# docker rm -f 1f58c7605ac7 1f58c7605ac7

    宿主機(jī)端口容器內(nèi)部端口 以及端口暴露:

    如果想要訪問,一定要在阿里云或者騰訊云服務(wù)器里開啟安全組!

    **問題:**每次改動(dòng)nginx配置文件,都需要進(jìn)入容器內(nèi)部?十分麻煩,我要是可以在容器外部提供一個(gè)映射路徑,達(dá)到在容器外部修改文件名,容器內(nèi)部就可以自動(dòng)修改? 這就是 數(shù)據(jù)卷 技術(shù)!

    部署elasticsearch+kibana

    # es 暴露的端口很多! # es 十分耗內(nèi)存 # es 的數(shù)據(jù)一般需要放置到安全目錄!掛載 # --net somenetwork ? 網(wǎng)絡(luò)配置# 啟動(dòng)elasticsearch [root@iz2zeak7sgj6i7hrb2g862z ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2# 測試一下es是否成功啟動(dòng) [root@VM-4-17-centos /]# curl localhost:9200 {"name" : "d1fdd23df7b5","cluster_name" : "docker-cluster","cluster_uuid" : "iDjRqpmqQoqV_LOlr9fm2w","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" }[root@iz2zeak7sgj6i7hrb2g862z ~]# docker stats # 查看docker容器使用內(nèi)存情況

    Portainer 可視化面板安裝

    • portainer(先用這個(gè))
    docker run -d -p 8088:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
    • Rancher(CI/CD再用)

    下載成功,訪問測試:

    [root@VM-4-17-centos /]# 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 b890dbc4eb27: Pull complete 81378af8dad0: Pull complete Digest: sha256:958a8e5c814e2610fb1946179a3db598f9b5c15ed90d92b42d94aa99f039f30b Status: Downloaded newer image for portainer/portainer:latest 9d90ec7ffb1b30909635ee1cb5206c79a5491efba3b6a59cc5358796d7444fb1

    訪問成功!

    這里可以管理我們的images和containers

    Docker鏡像詳解

    鏡像是什么

    鏡像是一種輕量級(jí)、可執(zhí)行的獨(dú)立軟件保,用來打包軟件運(yùn)行環(huán)境和基于運(yùn)行環(huán)境開發(fā)的軟件,他包含運(yùn)行某個(gè)軟件所需的所有內(nèi)容,包括代碼、運(yùn)行時(shí)庫、環(huán)境變量和配置文件。

    所有應(yīng)用,直接打包docker鏡像,就可以直接跑起來!

    如何得到鏡像:

    • 從遠(yuǎn)程倉庫下載
    • 拷貝
    • 自己制作 DockerFile

    Docker鏡像加載原理

    UnionFs (聯(lián)合文件系統(tǒng))

    UnionFs(聯(lián)合文件系統(tǒng)):Union文件系統(tǒng)(UnionFs)是一種分層、輕量級(jí)并且高性能的文件系統(tǒng),他支持對文件系統(tǒng)的修改作為一次提交來一層層的疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下( unite several directories into a single virtual filesystem)。Union文件系統(tǒng)是 Docker鏡像的基礎(chǔ)。鏡像可以通過分層來進(jìn)行繼承,基于基礎(chǔ)鏡像(沒有父鏡像),可以制作各種具體的應(yīng)用鏡像
    特性:一次同時(shí)加載多個(gè)文件系統(tǒng),但從外面看起來,只能看到一個(gè)文件系統(tǒng),聯(lián)合加載會(huì)把各層文件系統(tǒng)疊加起來,這樣最終的文件系統(tǒng)會(huì)包含所有底層的文件和目錄。
    Docker鏡像加載
    docker的鏡像實(shí)際上由一層一層的文件系統(tǒng)組成,這種層級(jí)的文件系統(tǒng)UnionFS。
    boots(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引導(dǎo)加 kernel, Linux剛啟動(dòng)時(shí)會(huì)加bootfs文件系統(tǒng),在 Docker鏡像的最底層是 boots。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的,包含boot加載器和內(nèi)核。當(dāng)boot加載完成之后整個(gè)內(nèi)核就都在內(nèi)存中了,此時(shí)內(nèi)存的使用權(quán)已由 bootfs轉(zhuǎn)交給內(nèi)核,此時(shí)系統(tǒng)也會(huì)卸載bootfs。
    rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系統(tǒng)中的/dev,/proc,/bin,/etc等標(biāo)準(zhǔn)目錄和文件。 rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如 Ubuntu, Centos等等。

    平時(shí)我們安裝進(jìn)虛擬機(jī)的CentOS都是好幾個(gè)G,為什么Docker這里才200M?

    對于個(gè)精簡的OS,rootfs可以很小,只需要包合最基本的命令,工具和程序庫就可以了,因?yàn)榈讓又苯佑肏ost的kernel,自己只需要提供rootfs就可以了。由此可見對于不同的Linux發(fā)行版, boots基本是一致的, rootfs會(huì)有差別,因此不同的發(fā)行版可以公用bootfs.

    虛擬機(jī)是分鐘級(jí)別,容器是秒級(jí)!

    分層理解

    我們可以去下載一個(gè)鏡像,注意觀察下載的日志輸出,可以看到是一層層的在下載


    最大的好處,我覺得莫過于資源共享了!比如有多個(gè)鏡像都從相同的Base鏡像構(gòu)建而來,那么宿主機(jī)只需在磁盤上保留一份base鏡像,同時(shí)內(nèi)存中也只需要加載一份base鏡像,這樣就可以為所有的容器服務(wù)了,而且鏡像的每一層都可以被共享。

    查看鏡像分層的方式可以通過docker image inspect 命令

    [root@VM-4-17-centos ~]# docker image inspect redis [{"Id": "sha256:f8528f17261c4a2c94ef702ff483ba7e4b998aa734cba60fa689ca5ecc14705f","RepoTags": ["redis:latest"],"RepoDigests": ["redis@sha256:c95835a74c37b3a784fb55f7b2c211bd20c650d5e55dae422c3caa9c01eb39fa"],"Parent": "","Comment": "","Created": "2022-10-05T09:33:31.067909521Z","Container": "d9be0debfd6dfafd2c63e12be9eb66f4ee73d7c4f9b30ca48cca7ccbc2a40d52","ContainerConfig": {"Hostname": "d9be0debfd6d","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"6379/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","GOSU_VERSION=1.14","REDIS_VERSION=7.0.5","REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-7.0.5.tar.gz","REDIS_DOWNLOAD_SHA=67054cc37b58c125df93bd78000261ec0ef4436a26b40f38262c780e56315cc3"],"Cmd": ["/bin/sh","-c","#(nop) ","CMD [\"redis-server\"]"],"Image": "sha256:5e8566053ad429467d4a956f3254970c357a8a5844825c62f68a146161ec1269","Volumes": {"/data": {}},"WorkingDir": "/data","Entrypoint": ["docker-entrypoint.sh"],"OnBuild": null,"Labels": {}},"DockerVersion": "20.10.12","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"6379/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","GOSU_VERSION=1.14","REDIS_VERSION=7.0.5","REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-7.0.5.tar.gz","REDIS_DOWNLOAD_SHA=67054cc37b58c125df93bd78000261ec0ef4436a26b40f38262c780e56315cc3"],"Cmd": ["redis-server"],"Image": "sha256:5e8566053ad429467d4a956f3254970c357a8a5844825c62f68a146161ec1269","Volumes": {"/data": {}},"WorkingDir": "/data","Entrypoint": ["docker-entrypoint.sh"],"OnBuild": null,"Labels": null},"Architecture": "amd64","Os": "linux","Size": 116951526,"VirtualSize": 116951526,"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/4513227a515eb72cb310d4b566d37c212b1a7c9e109220098db7ffbef89ef865/diff:/var/lib/docker/overlay2/fad8a771ef0591e2f820d63daf14a578593eb73c2570b6f9e99a3c1a5c3e6f27/diff:/var/lib/docker/overlay2/171d780cbb7ee56034ac2119d764a3087db2205e080617030acbf9929445672c/diff:/var/lib/docker/overlay2/107906d828174d9d10ec3a4c736a12093a73555b8f313767a34000d55e9f202e/diff:/var/lib/docker/overlay2/1f429286b38dfe93d4169b3d89aaeee79fbf748edb7eee2f16de329b1ba47dbd/diff","MergedDir": "/var/lib/docker/overlay2/3de98d28b2953e97e7115c90a7060cff99d9135d6f38ab09d0fe03e84cf172af/merged","UpperDir": "/var/lib/docker/overlay2/3de98d28b2953e97e7115c90a7060cff99d9135d6f38ab09d0fe03e84cf172af/diff","WorkDir": "/var/lib/docker/overlay2/3de98d28b2953e97e7115c90a7060cff99d9135d6f38ab09d0fe03e84cf172af/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:fe7b1e9bf7922fbc22281bcc6b4f5ac8f1a7b4278929880940978c42fc9d0229","sha256:291011b5d90b8e8f3af6cbc4534aba89cb4f1f67ef9df3e2a9a2a9f14b981281","sha256:0162880997e885d9d6a4ae697f93fc07ec17ca107f92948107651ec0f8cc3f8e","sha256:41faab27f2f5bc614adeac79e3bb2718af02106f74706a3544430c2e19667411","sha256:83c9cebc99756a1667f75b5400dd4ca115bb0bd8b3ea8c0a203cc0ef8250bada","sha256:5b654ae80690cab5da76607f4a04368c100765c8c66ce2c12e370129445a27b2"]},"Metadata": {"LastTagTime": "0001-01-01T00:00:00Z"}} ]

    理解

    所有的 Docker鏡像都起始于一個(gè)基礎(chǔ)鏡像層,當(dāng)進(jìn)行修改或培加新的內(nèi)容時(shí),就會(huì)在當(dāng)前鏡像層之上,創(chuàng)建新的鏡像層。

    舉一個(gè)簡單的例子,假如基于 Ubuntu Linux16.04創(chuàng)建一個(gè)新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加 Python包,
    就會(huì)在基礎(chǔ)鏡像層之上創(chuàng)建第二個(gè)鏡像層;如果繼續(xù)添加一個(gè)安全補(bǔ)丁,就會(huì)創(chuàng)健第三個(gè)鏡像層該像當(dāng)前已經(jīng)包含3個(gè)鏡像層,如下圖所示(這只是一個(gè)用于演示的很簡單的例子)。

    在添加額外的鏡像層的同時(shí),鏡像始終保持是當(dāng)前所有鏡像的組合,理解這一點(diǎn).

    在添加額外的鏡像層的同時(shí),鏡像始終保持是當(dāng)前所有鏡像的組合,理解這一點(diǎn)非常重要。下圖中舉了一個(gè)簡單的例子,每個(gè)鏡像層包含3個(gè)文件,而鏡像包含了來自兩個(gè)鏡像層的6個(gè)文件。

    這種情況下,上層鏡像層中的文件覆蓋了底層鏡像層中的文件。這樣就使得文件的更新版本作為一個(gè)新鏡像層添加到鏡像當(dāng)中

    Docker通過存儲(chǔ)引擎(新版本采用快照機(jī)制)的方式來實(shí)現(xiàn)鏡像層堆棧,并保證多鏡像層對外展示為統(tǒng)一的文件系統(tǒng)

    Linux上可用的存儲(chǔ)引撃有AUFS、 Overlay2、 Device Mapper、Btrfs以及ZFS。顧名思義,每種存儲(chǔ)引擎都基于 Linux中對應(yīng)的
    件系統(tǒng)或者塊設(shè)備技術(shù),井且每種存儲(chǔ)引擎都有其獨(dú)有的性能特點(diǎn)。

    Docker在 Windows上僅支持 windowsfilter 一種存儲(chǔ)引擎,該引擎基于NTFS文件系統(tǒng)之上實(shí)現(xiàn)了分層和CoW [1]。

    下圖展示了與系統(tǒng)顯示相同的三層鏡像。所有鏡像層堆并合井,對外提供統(tǒng)一的視圖。

    對外視圖:(7是5的更新版)

    特點(diǎn)

    Docker 鏡像都是只讀的,當(dāng)容器啟動(dòng)時(shí),一個(gè)新的可寫層加載到鏡像的頂部!

    這一層就是我們通常說的容器層,容器之下的都叫鏡像層!

    commit鏡像

    docker commit 提交容器成為一個(gè)新的副本# 命令和git原理類似 docker commit -m="描述信息" -a="作者" 容器id 目標(biāo)鏡像名:[版本TAG]

    實(shí)戰(zhàn)測試

    # 1、啟動(dòng)一個(gè)默認(rèn)的tomcat [root@VM-4-17-centos ~]# docker run -it -p 8085:8080 tomcat de57d0ace5716d27d0e3a7341503d07ed4695ffc266aef78e0a855b270c4064e# 2、發(fā)現(xiàn)這個(gè)默認(rèn)的tomcat 是沒有webapps應(yīng)用,官方的鏡像默認(rèn)webapps下面是沒有文件的! #docker exec -it 容器id /bin/bash [root@VM-4-17-centos ~]# docker exec -it 40b63bf59d24 /bin/bash root@40b63bf59d24:/usr/local/tomcat# cd webapps# 3、從webapps.dist拷貝文件進(jìn)去webapp root@40b63bf59d24:/usr/local/tomcat# cp -r webapps.dist/* webapps root@40b63bf59d24:/usr/local/tomcat# cd webapps root@40b63bf59d24:/usr/local/tomcat/webapps# ls docs examples host-manager manager ROOT# 4、將操作過的容器通過commit提交為一個(gè)鏡像!我們以后就使用我們修改過的鏡像即可,而不需要每次都重新拷貝webapps.dist下的文件到webapps了,這就是我們自己的一個(gè)修改的鏡像。 docker commit -m="描述信息" -a="作者" 容器id 目標(biāo)鏡像名:[TAG] docker commit -a="zwj" -m="add webapps app" 容器id tomcat:1.0[root@VM-4-17-centos ~]# docker commit -a="zwj" -m="add webapps appliaction" 40b63bf59d24 tomcat:1.0 sha256:ecd5844b77b3b69a086ac98e533957103a0c0dda46d48502c095390a5b285d14[root@VM-4-17-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat 1.0 ecd5844b77b3 6 seconds ago 478MB tomcat 9.0 5aa9fb87fe03 2 days ago 475MB tomcat latest aabbe5aca89b 2 days ago 473MB

    第三步執(zhí)行完成后可以去公網(wǎng)ip:8085測試

    如果你想要保存當(dāng)前容器的狀態(tài),就可以通過commit來提交,獲得一個(gè)鏡像

    就好比我們我們使用虛擬機(jī)的快照功能

    到這里僅僅是入門!

    弱小和無知不是生存的障礙,傲慢才是!

    容器數(shù)據(jù)卷

    什么是容器數(shù)據(jù)卷

    Docker的理解與回顧

    將應(yīng)用和環(huán)境打包成一個(gè)鏡像!

    程序需要保存數(shù)據(jù)!如果數(shù)據(jù)都在容器中,那么我們?nèi)萜鲃h除,數(shù)據(jù)就會(huì)丟失!需求:數(shù)據(jù)可以持久化

    MySQL,容器刪了,刪庫跑路!需求:MySQL數(shù)據(jù)可以存儲(chǔ)在本地!

    容器之間可以有一個(gè)數(shù)據(jù)共享技術(shù)!Docker容器中產(chǎn)生的數(shù)據(jù),同步到本地!

    這就是卷技術(shù)!其實(shí)就是目錄的掛載,將我們?nèi)萜鲀?nèi)的目錄掛載到linux目錄上面!

    **總結(jié): **容器的持久化和同步操作!容器間數(shù)據(jù)也是可以共享的!

    使用數(shù)據(jù)卷

    方式一:直接使用命令來掛載

    docker run -it -v 主機(jī)目錄:容器目錄[root@VM-4-17-centos home]# docker run -it -v /home/ceshi:/home centos /bin/bash docker inspect ...


    測試文件同步

    再來測試

    再來測試(測試通過)

  • 停止容器
  • 主機(jī)上修改文件
  • 啟動(dòng)容器
  • 容器內(nèi)的數(shù)據(jù)依舊是同步的!
  • 實(shí)戰(zhàn):安裝Mysql

    思考:MySQL的數(shù)據(jù)持久化的問題!

    # 獲取鏡像 [root@VM-4-17-centos home]# docker pull mysql:5.7# 運(yùn)行容器, 需要做數(shù)據(jù)掛載! # 安裝啟動(dòng)mysql,需要配置密碼(注意) # 官方測試, docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag# 啟動(dòng)我們的 -d # 后臺(tái)運(yùn)行 -p # 端口映射 -v # 卷掛載 -e # 環(huán)境配置 --name # 容器的名字 [root@VM-4-17-centos home]# docker run -d -p 8085:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql1 mysql:5.7 eda724b2eeb9c7307155104ec269b9c8bd2aa5a4bc4ef0788de4f034610a6f37# 啟動(dòng)成功之后,我們在本地使用navicat鏈接測試一下 # navicat鏈接到服務(wù)器的8085 --- 8085 和 容器的3306映射,這個(gè)時(shí)候我們就可以連接上mysql嘍!# 在本地測試創(chuàng)建一個(gè)數(shù)據(jù)庫,查看下我們的路徑是否ok! 刪除 docker rm -f mysql01

    連接mysql成功

    在本地新建一個(gè)數(shù)據(jù)庫

    在服務(wù)器查看

    假設(shè)我們把容器刪除了,但掛載到本地的數(shù)據(jù)卷依然不會(huì)丟失,這就實(shí)現(xiàn)了容器的持久化功能!

    匿名和具名掛載

    # 匿名掛載 -v 容器內(nèi)路徑 docker run -d -P --name nginx01 -v /etc/nginx nginx # -P 隨機(jī)指定端口# 查看所有volume的情況 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls DRIVER VOLUME NAME local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096 local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882# 這里發(fā)現(xiàn),這種情況就是匿名掛載,我們在-v 后面只寫了容器內(nèi)的路徑,沒有寫容器外的路徑!# 具名掛載 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx 26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 26da1ec7d499 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:32769->80/tcp nginx02 486de1da03cb nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp nginx01 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls DRIVER VOLUME NAME local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096 local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882 local juming-nginx# 通過-v 卷名:容器內(nèi)的路徑 # 查看一下這個(gè)卷 # docker volume inspect juming-nginx[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume inspect juming-nginx [{"CreatedAt": "2020-08-12T18:15:21+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data","Name": "juming-nginx","Options": null,"Scope": "local"} ]

    所有docker容器內(nèi)的卷,沒有指定目錄的情況下都是在/var/lib/docker/volumes/xxxxx/_data

    我們通過具名掛載可以方便的找到我們的一個(gè)卷,大多數(shù)情況下使用的是具名掛載

    # 如何確定是具名掛載還是匿名掛載,還是指定路徑掛載! -v 容器內(nèi)路徑 # 匿名掛載 -v 卷名:容器內(nèi)路徑 # 具名掛載 -v /主機(jī)路徑:容器內(nèi)路徑 # 指定路徑掛載

    拓展

    # 通過 -v 容器內(nèi)容路徑 ro rw 改變讀寫權(quán)限 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就說明這個(gè)路徑只能通過宿主機(jī)來操作,容器內(nèi)容無法操作

    DockerFile

    初始DockerFile

    DockerFile就是用來構(gòu)建 docker鏡像的構(gòu)建文件!命令腳本!先體驗(yàn)一下!

    通過這個(gè)腳本可以生成鏡像,鏡像是一層一層的,腳本一個(gè)個(gè)的命令,每個(gè)命令都是一層!

    # 創(chuàng)建一個(gè)dockerfile文件, 名字可以隨意 # 文件的內(nèi)容 指定(大寫) 參數(shù) FROM centosVOLUME ["volume1","volume2"]CMD echo"---end---"CMD /bin/bash # 這里的每一個(gè)命令都是鏡像的一層!

    通過命令創(chuàng)建自己的鏡像!

    #docker build -f(file 文件) dockerfile1 -t(target 生成) zwj/centos(鏡像名) :1.0(版本) [root@VM-4-17-centos docker-test-volume]# docker build -f dockerfile1 -t zwj/centos:1.0 . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos---> 5d0da3dc9764 Step 2/4 : VOLUME ["volume1","volume2"]---> Running in 364679e111ef Removing intermediate container 364679e111ef---> 415c2a69cbad Step 3/4 : CMD echo"---end---"---> Running in 670a9ec22b96 Removing intermediate container 670a9ec22b96---> 35a4317e8199 Step 4/4 : CMD /bin/bash---> Running in 4de171e231bb Removing intermediate container 4de171e231bb---> f365dbf54b57 Successfully built f365dbf54b57 Successfully tagged zwj/centos:1.0[root@VM-4-17-centos docker-test-volume]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE zwj/centos 1.0 f365dbf54b57 About a minute ago 231MB

    啟動(dòng)一下我們自己創(chuàng)建的鏡像

    這個(gè)卷和外部一定有一個(gè)同步的目錄!

    docker inspect 容器id


    進(jìn)入目錄進(jìn)行驗(yàn)證

    [root@VM-4-17-centos ~]# cd /var/lib/docker/volumes/dc96cc21885d079c33673f1e384799a51310fa8e1c14cc268241d8873a920933/_data [root@VM-4-17-centos _data]# ls container.txt

    掛載成功!

    這種方式我們未來使用的十分多, 因?yàn)槲覀兺ǔ?huì)構(gòu)建自己的鏡像!

    假設(shè)構(gòu)建鏡像時(shí)候沒有掛載卷,要手動(dòng)鏡像掛載 -v 卷名:容器內(nèi)路徑!

    數(shù)據(jù)卷容器

    mysql同步數(shù)據(jù)

    通過我們剛才自己寫的鏡像啟動(dòng)三個(gè)容器

    啟動(dòng)docker2容器

    我們在docker1 /volume1下創(chuàng)建一個(gè)docker1.txt

    #進(jìn)入容器1創(chuàng)建文件 [root@VM-4-17-centos docker-test-volume]# docker attach 771221b3ea22 [root@771221b3ea22 /]# cd volume1 [root@771221b3ea22 volume1]# ls [root@771221b3ea22 volume1]# touch docker1.txt#進(jìn)入容器2驗(yàn)證 [root@VM-4-17-centos /]# docker attach d4b161d036dd [root@d4b161d036dd /]# cd volume1 [root@d4b161d036dd volume1]# ls docker1.txt

    刪除docker1容器后docker2中依舊存在docker1.txt

    同理,我們就可以實(shí)現(xiàn)多個(gè)mysql或多個(gè)redis數(shù)據(jù)同步

    [root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3345:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql02 --volumes-from mysql01 mysql:5.7#這個(gè)時(shí)候就可以實(shí)現(xiàn)兩個(gè)容器數(shù)據(jù)同步

    結(jié)論

    容器之間配置信息的傳遞, 數(shù)據(jù)卷容器的聲明周期一直持續(xù)到?jīng)]有容器使用為止。

    但是一旦你持久化到了本地,這個(gè)時(shí)候,本地的數(shù)據(jù)是不會(huì)刪除的!

    DockerFile

    dockerFile是用來構(gòu)建docker鏡像的文件!命令參數(shù)腳本!

    構(gòu)建步驟 1. 編寫一個(gè)dockerFile文件 2.docker build 構(gòu)建成為一個(gè)鏡像 3. docker run 運(yùn)行鏡像 4. docker push 發(fā)布鏡像(DockerHub、阿里云鏡像)

    查看官方是怎么做的

    很多官方鏡像都像是基礎(chǔ)包,很多功能都不具備,我們通常會(huì)自己搭建自己的鏡像!

    官方既然可以制作鏡像,那我們一樣可以!

    DockerFile的構(gòu)建過程

    基礎(chǔ)知識(shí):

    • 每個(gè)保留關(guān)鍵字(指令)都是必須大寫字母
    • 執(zhí)行從上到下順序執(zhí)行
    • #表示注釋
    • 每個(gè)指令都會(huì)創(chuàng)建提交一個(gè)新的鏡像層,并提交!

    dockerFile是面向開發(fā)的, 我們以后要發(fā)布項(xiàng)目, 做鏡像, 就需要編寫dockefile文件, 這個(gè)文件十分簡單!

    Docker鏡像逐漸成為企業(yè)的交互標(biāo)準(zhǔn),必須要掌握!

    步驟:開發(fā),部署, 運(yùn)維… 缺一不可!

    DockerFile: 構(gòu)建文件, 定義了一切的步驟,源代碼

    DockerImages: 通過DockerFile構(gòu)建生成的鏡像, 最終發(fā)布和運(yùn)行的產(chǎn)品!

    Docker容器:容器就是鏡像運(yùn)行起來提供服務(wù)的

    DockerFile指令說明

    FROM # 基礎(chǔ)鏡像,一切從這里開始構(gòu)建 MAINTAINER # 鏡像是誰寫的, 姓名+郵箱 RUN # 鏡像構(gòu)建的時(shí)候需要運(yùn)行的命令 ADD # 步驟, tomcat鏡像, 這個(gè)tomcat壓縮包!添加內(nèi)容 WORKDIR # 鏡像的工作目錄 VOLUME # 掛載的目錄 EXPOSE # 暴露端口配置 CMD # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令,只有最后一個(gè)會(huì)生效,可被替代 ENTRYPOINT # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令, 可以追加命令 ONBUILD # 當(dāng)構(gòu)建一個(gè)被繼承DockerFile 這個(gè)時(shí)候就會(huì)運(yùn)行 ONBUILD 的指令,觸發(fā)指令 COPY # 類似ADD, 將我們文件拷貝到鏡像中 ENV # 構(gòu)建的時(shí)候設(shè)置環(huán)境變量!

    實(shí)戰(zhàn):創(chuàng)建一個(gè)自己的centos!

    我們首先創(chuàng)建一個(gè)默認(rèn)的centos

    [root@VM-4-17-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 7 eeb6ee3f44bd 12 months ago 204MB[root@VM-4-17-centos ~]# docker run -it --name centos-1 centos /bin/bash [root@c023f7df5bfc /]# vim bash: vim: command not found [root@c023f7df5bfc /]# ifconfig bash: ifconfig: command not found

    發(fā)現(xiàn)其中連vim和ifconfig這樣的基礎(chǔ)命令都沒有

    接下來創(chuàng)建自己的centos

    # 1.編寫dockerfile配置文件 [root@VM-4-17-centos dockerfile]# vim mydockerfile-centos [root@VM-4-17-centos dockerfile]# cat mydockerfile-centos FROM centos:7 #最新的centos是8,這里一定要寫7版本MAINTAINER zwj<2718458328@qq.com>ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vim RUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATH CMD echo "---end---" CMD /bin/bash# 2.通過文件構(gòu)建鏡像 # 命令 docker build -f dockerfile文件路徑 -t 鏡像名:[tag] . docker build -f mydockerfile-centos -t mycentos:0.1 . *** Successfully built 7fc5734753d4 Successfully tagged mycentos:0.1# 3.啟動(dòng)鏡像 [root@VM-4-17-centos dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos 0.1 7fc5734753d4 3 minutes ago 625MB centos 7 eeb6ee3f44bd 12 months ago 204MB[root@VM-4-17-centos dockerfile]# docker run -it mycentos:0.1 [root@21caeba328a5 local]# pwd #發(fā)現(xiàn)當(dāng)前直接進(jìn)入了我們創(chuàng)建鏡像時(shí)候的工作路徑 /usr/local

    發(fā)現(xiàn)vim和ifconfig命令也都可以用了

    我們可以列出本地鏡像的變更歷史

    [root@VM-4-17-centos dockerfile]# docker history 7fc5734753d4 IMAGE CREATED CREATED BY SIZE COMMENT 7fc5734753d4 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B bec1ca033a4d 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 4294061d2866 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 4486b80f3540 12 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B af18e95c742d 12 minutes ago /bin/sh -c yum -y install net-tools 183MB 06c30e699c42 12 minutes ago /bin/sh -c yum -y install vim 238MB a511a9e7ab57 13 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B 44d1c3b42140 13 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B efde73fdf021 13 minutes ago /bin/sh -c #(nop) MAINTAINER zwj<2718458328… 0B eeb6ee3f44bd 12 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 12 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 12 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB

    發(fā)現(xiàn)我們的鏡像其實(shí)就是這樣一步一步構(gòu)建出來的

    CMD和ENTRYPOINT區(qū)別

    CMD # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令,只有最后一個(gè)會(huì)生效可被替代 ENTRYPOINT # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令, 可以追加命令 # CMD # 1. 編寫dockerfile文件 [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-cmd FROM centos:7 CMD ["ls", "-a"]# 2. 構(gòu)建鏡像 [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-cmd -t cmdtest .# 3. run運(yùn)行, 發(fā)現(xiàn)我們的ls -a 命令生效 [root@VM-4-17-centos dockerfile]# docker run 846f1f878b89 . .. .dockerenv bin dev etc home lib lib64# 想追加一個(gè)命令 -l 變成 ls -al [root@VM-4-17-centos dockerfile]# docker run 846f1f878b89 -l docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.# cmd的情況下 -l替換了CMD["ls", "-a"]命令, -l不是命令,所以報(bào)錯(cuò)了,實(shí)際執(zhí)行的是下面這行 [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 ls -l # ENTRYPOINT # 1. 編寫dockerfile文件 [root@VM-4-17-centos dockerfile]# vim dockerfile-entrypoint FROM centos ENTRYPOINT ["ls", "-a"]# 2.構(gòu)建鏡像 [root@VM-4-17-centos dockerfile]# docker build -f dockerfile-entrypoint -t entrypointtest .# 3. 創(chuàng)建容器 [root@VM-4-17-centos dockerfile]# docker run fc5e427dcacd . .. .dockerenv bin dev etc home lib lib64# 想追加一個(gè)命令 -l 變成 ls -al # 我們的追加命令, 是直接拼接到ENTRYPOINT命令的后面的! [root@VM-4-17-centos dockerfile]# docker run fc5e427dcacd -l drwxr-xr-x 1 root root 4096 Oct 10 08:20 . drwxr-xr-x 1 root root 4096 Oct 10 08:20 .. -rwxr-xr-x 1 root root 0 Oct 10 08:20 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 340 Oct 10 08:20 dev drwxr-xr-x 1 root root 4096 Oct 10 08:20 etc drwxr-xr-x 2 root root 4096 Nov 3 2020 home lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64

    實(shí)戰(zhàn):Tomcat鏡像

    1.準(zhǔn)備鏡像文件 tomcat壓縮包,jdk的壓縮包!

    tomcat: Apache Tomcat? - Apache Tomcat 8 Software Downloads

    jdk: Java Archive Downloads - Java SE 8 (oracle.com)

    我個(gè)人在使用tomcat9的時(shí)候出現(xiàn)了錯(cuò)誤,看個(gè)人情況吧

    [root@VM-4-17-centos tomcat]# ls apache-tomcat-8.5.82.tar.gz jdk-8u65-linux-x64.tar.gz

    2.編寫Dockerfile文件,官方命名Dockerfile,build會(huì)自動(dòng)尋找這個(gè)文件,不需要-f 指定了

    # vim Dockerfile 編寫Dockerfile FROM centos:7 MAINTAINER zwj<2718458328@qq.com>COPY readme.txt /usr/local/readme.txtENV MYPATH /usr/localWORKDIR $MYPATHADD jdk-8u65-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-8.5.82.tar.gz /usr/local/RUN yum -y install vimENV JAVA_HOME /usr/local/jdk1.8.0_65 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.82 ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.82 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /usr/local/apache-tomcat-8.5.82/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.82/bin/logs/catalina.out# 創(chuàng)建鏡像 [root@VM-4-17-centos tomcat]# docker build -t diycentos:1.0 .# 啟動(dòng)容器 [root@VM-4-17-centos tomcat]# docker run -it -p 3344:8080 -v /home/docker-mapping/centos/centos1:/usr/local/apache-tomcat-8.5.82/webapps/examples -v /home/docker-mapping/centos/logs/:/usr/local/apache-tomcat-8.5.82/logs diycentos:1.0 # 訪問測試 [root@VM-4-17-centos tomcat]# curl localhost:3344# 項(xiàng)目發(fā)布(由于做了卷掛載,我們在本機(jī)即可進(jìn)行)

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"> </web-app> <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>hello. xiaofan</title> </head> <body> Hello World!<br/> <% System.out.println("-----my test web logs------"); %> </body> </html>

    去瀏覽器訪問

    發(fā)現(xiàn):項(xiàng)目部署成功, 可以直接訪問!

    我們以后開發(fā)的步驟:需要掌握Dockerfile的編寫! 我們之后的一切都是使用docker進(jìn)行來發(fā)布運(yùn)行的!

    發(fā)布自己的容器到DockerHub!

    1.注冊賬號(hào):Docker Hub Container Image Library | App Containerization

    2.確定這個(gè)賬號(hào)可以登錄

    3.在我們服務(wù)器上提交自己的鏡像

    [root@VM-4-17-centos ~]# docker login --helpUsage: 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@VM-4-17-centos ~]# docker login -u zwjyyds -p ****** WARNING! Using --password via the CLI is insecure. Use --password-stdin. 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-storeLogin Succeeded

    4.登錄完畢后就可以提交鏡像了,就是一步 docker push

    # 提交 [root@VM-4-17-centos /]# docker push zwjyyds/diycentos:1.0 The push refers to repository [docker.io/zwjyyds/diycentos] An image does not exist locally with the tag: zwjyyds/diycentos [root@VM-4-17-centos /]# docker push diycentos:1.0 The push refers to repository [docker.io/library/diycentos] ce114fd83b70: Preparing e73ea09b2631: Preparing e73f7dbc2b0d: Preparing d1d9974be847: Preparing 174f56854903: Preparing denied: requested access to the resource is denied #被拒絕# 顯示當(dāng)前鏡像 [root@VM-4-17-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE diycentos 1.0 4f91adba8d48 4 hours ago 822MB# 解決,增加一個(gè)tag [root@VM-4-17-centos /]# docker tag diycentos:1.0 ****/diycentos:1.0 # ****必須是dockhub的用戶名# 顯示當(dāng)前鏡像 [root@VM-4-17-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE diycentos 1.0 4f91adba8d48 4 hours ago 822MB zwjyyds/diycentos 1.0 4f91adba8d48 4 hours ago 822MB# 提交 [root@VM-4-17-centos /]# docker push zwjyyds/diycentos:1.0

    小結(jié)

    Docker網(wǎng)絡(luò)

    此部分內(nèi)容建議使用tomcat7.0,新版的tomcat中沒有ping命令和yum命令

    理解Docker0

    測試

    # 獲取當(dāng)前ip地址 [root@VM-4-17-centos /]# ip addr

    三個(gè)網(wǎng)絡(luò)

    # 問題: docker是如何處理容器網(wǎng)絡(luò)訪問的? [root@VM-4-17-centos /]# docker run -d -P --name tomcat01 tomcat# 查看容器內(nèi)部的網(wǎng)絡(luò)地址 ip addr # 由于版本問題,ip addr可能已經(jīng)失效,可以用docker inspect tomcat01查看ip地址 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat01 ip addr, 發(fā)現(xiàn)容器啟動(dòng)的時(shí)候得到一個(gè)eth0@if115 ip地址,docker分配的! 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever 114: eth0@if115: <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 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever# 思考: linux 能不能ping通容器? [root@VM-4-17-centos ~]# 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.076 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.087 ms 64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.071 ms# linux 可以 ping 通docker容器內(nèi)部!

    我們每啟動(dòng)一個(gè)docker容器, docker就會(huì)給docker容器分配一個(gè)ip, 我們只要安裝了docker,就會(huì)有一個(gè)網(wǎng)卡 docker0橋接模式,使用的技術(shù)是veth-pair技術(shù)!

    再次測試ip addr

    再啟動(dòng)一個(gè)容器測試,發(fā)現(xiàn)又多了一對網(wǎng)卡

    # 我們發(fā)現(xiàn)這個(gè)容器帶來網(wǎng)卡,都是一對對的 # veth-pair 就是一對的虛擬設(shè)備接口,他們都是成對出現(xiàn)的,一端連著協(xié)議,一端彼此相連 # 正因?yàn)橛羞@個(gè)特性,veth-pair充當(dāng)一個(gè)橋梁, 連接各種虛擬網(wǎng)絡(luò)設(shè)備 # OpenStac, Docker容器之間的鏈接,OVS的鏈接, 都是使用veth-pair技術(shù)

    容器之間也是可以互相ping通的

    結(jié)論:tomcat01和tomcat02是共用的一個(gè)路由器,docker0

    所有容器不指定網(wǎng)絡(luò)的情況下,都是docker0路由的,doucker會(huì)給我們的容器分配一個(gè)默認(rèn)的可用IP

    Docker使用的是Linux的橋接,宿主機(jī)中是一個(gè)Docker容器的網(wǎng)橋docker0.

    Docker中的所有的網(wǎng)絡(luò)接口都是虛擬的,虛擬的轉(zhuǎn)發(fā)效率高!(內(nèi)網(wǎng)傳遞文件!)

    只要容器刪除,對應(yīng)的網(wǎng)橋一對就沒有了!

    __Link

    思考一個(gè)場景,我們編寫了一個(gè)微服務(wù),database url =ip***; 項(xiàng)目不重啟,數(shù)據(jù)ip換掉了,我們希望可以處理這個(gè)問題,可以按名字來進(jìn)行訪問容器

    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat01 ping: tomcat01: Name or service not known# 如何可以解決呢? # 通過--link既可以解決網(wǎng)絡(luò)連通問題 [root@VM-4-17-centos ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat e93f963ed8a3c0800fa60c8d70616195dfba770f46f537ec32392eb285456a3b[root@VM-4-17-centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e93f963ed8a3 tomcat "catalina.sh run" 9 seconds ago Up 9 seconds 0.0.0.0:49157->8080/tcp, :::49157->8080/tcp tomcat03 ad499cf17f6d tomcat "catalina.sh run" 3 hours ago Up 3 minutes 0.0.0.0:49156->8080/tcp, :::49156->8080/tcp tomcat02 2e68074aec30 tomcat "catalina.sh run" 4 hours ago Up 4 hours 0.0.0.0:49153->8080/tcp, :::49153->8080/tcp tomcat01[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# 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.129 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.110 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.107 ms# 反向可以ping通嗎? [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat03 ping: tomcat03: Name or service not known

    inspect bridge

    其實(shí)這個(gè)tomcat03就是在本地配置了tomcat02的配置

    [root@VM-4-17-centos ~]# docker exec -it tomcat03 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.3 tomcat02 ad499cf17f6d 172.17.0.4 e93f963ed8a3

    本質(zhì)探究:–link 就是我們在hosts配置中增加了一個(gè)172.17.0.3 tomcat02 ad499cf17f6d

    我們現(xiàn)在玩Docker已經(jīng)不建議使用–link了!

    現(xiàn)在都是自定義網(wǎng)絡(luò)!不使用Docker0!

    Docker0的問題:它不支持容器名鏈接訪問!

    思考一個(gè)場景,我們編寫了一個(gè)微服務(wù),database url =ip/?***; 項(xiàng)目不重啟,數(shù)據(jù)ip換掉了,就連接不到數(shù)據(jù)庫了。我們希望可以處理這個(gè)問題,可以按名字來進(jìn)行訪問容器

    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat01 ping: tomcat01: Name or service not known# 如何可以解決呢? # 通過--link既可以解決網(wǎng)絡(luò)連通問題 [root@VM-4-17-centos ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat e93f963ed8a3c0800fa60c8d70616195dfba770f46f537ec32392eb285456a3b[root@VM-4-17-centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e93f963ed8a3 tomcat "catalina.sh run" 9 seconds ago Up 9 seconds 0.0.0.0:49157->8080/tcp, :::49157->8080/tcp tomcat03 ad499cf17f6d tomcat "catalina.sh run" 3 hours ago Up 3 minutes 0.0.0.0:49156->8080/tcp, :::49156->8080/tcp tomcat02 2e68074aec30 tomcat "catalina.sh run" 4 hours ago Up 4 hours 0.0.0.0:49153->8080/tcp, :::49153->8080/tcp tomcat01[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# 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.129 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.110 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.107 ms# 反向可以ping通嗎? [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat03 ping: tomcat03: Name or service not known

    inspect bridge

    [外鏈圖片轉(zhuǎn)存中…(img-6GD8EnKz-1665554663931)]

    其實(shí)這個(gè)tomcat03就是在本地配置了tomcat02的配置

    [root@VM-4-17-centos ~]# docker exec -it tomcat03 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.3 tomcat02 ad499cf17f6d 172.17.0.4 e93f963ed8a3

    本質(zhì)探究:–link 就是我們在hosts配置中增加了一個(gè)172.17.0.3 tomcat02 ad499cf17f6d

    我們現(xiàn)在玩Docker已經(jīng)不建議使用–link了!

    現(xiàn)在都是自定義網(wǎng)絡(luò)!不使用Docker0!

    Docker0的問題:它不支持容器名鏈接訪問!

    自定義網(wǎng)絡(luò)

    查看所有網(wǎng)絡(luò)

    [root@VM-4-17-centos ~]# docker network ls NETWORK ID NAME DRIVER SCOPE cc96daeb0587 bridge bridge local 68a20aebc99e host host local d0bc18957a87 none null local

    網(wǎng)絡(luò)模式

    bridge: 橋接模式,橋docker 默認(rèn)

    none: 不配置網(wǎng)絡(luò)

    host: 和宿主機(jī)共享網(wǎng)絡(luò)

    contain: 容器間網(wǎng)絡(luò)連通(用的少)

    測試

    # 我們直接啟動(dòng)的命令默認(rèn)有一個(gè) --net bridge,而這個(gè)就是我們的docker0 [root@VM-4-17-centos ~]# docker run -d -P --name tomcat01 tomcat:7.0 [root@VM-4-17-centos ~]# docker run -d -P --name tomcat01 --net bridge tomcat:7.0# docker0特點(diǎn),默認(rèn),容器名不能訪問, --link可以打通連接! # 我們可以自定義一個(gè)網(wǎng)絡(luò)! # --driver bridge 橋接模式 # --subnet 192.168.0.0/16 可以支持255*255個(gè)網(wǎng)絡(luò) 192.168.0.2 ~ 192.168.255.254 # --gateway 192.168.0.1 網(wǎng)關(guān)# 創(chuàng)建網(wǎng)絡(luò)mynet [root@VM-4-17-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet edbae3e3682aa5ddd712154390d818c322effa142264aff2b0d130acce53aaec# 顯示當(dāng)前網(wǎng)絡(luò) [root@VM-4-17-centos ~]# docker network ls NETWORK ID NAME DRIVER SCOPE cc96daeb0587 bridge bridge local 68a20aebc99e host host local edbae3e3682a mynet bridge local d0bc18957a87 none null local

    我們自己的網(wǎng)絡(luò)就創(chuàng)建好了

    用創(chuàng)建的網(wǎng)絡(luò)啟動(dòng)兩個(gè)容器

    [root@VM-4-17-centos ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat:7.0 f286cc44c92afaf21f23e85f58b25f36c8abcfd27e922325d1e6f07ae0f9d9e4 [root@VM-4-17-centos ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat:7.0 97ac96a4c44e606f1e2f17547e84aa982485bbca819d472bd69d0364692399ca# 顯示這個(gè)網(wǎng)絡(luò)信息 [root@VM-4-17-centos ~]# docker network inspect mynet# Containers中就多了兩個(gè)容器ip"Containers": {"97ac96a4c44e606f1e2f17547e84aa982485bbca819d472bd69d0364692399ca": {"Name": "tomcat-net-02","EndpointID": "1b73798d90957023b8976db96205104f0e6ddd4dd7490513f43fb5e14978c665","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""},"f286cc44c92afaf21f23e85f58b25f36c8abcfd27e922325d1e6f07ae0f9d9e4": {"Name": "tomcat-net-01","EndpointID": "f9811a47e3111867524519c5d18fa53505e7d5d1998cae04fe3b4b3985059f69","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""}}# 我們來ping一下網(wǎng)絡(luò) [root@VM-4-17-centos ~]# docker exec -it tomcat-net-01 ping 192.168.0.3 # ping tomcat02的ip 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.139 ms 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.090 ms# 現(xiàn)在不適用docker --link 也可以ping容器名字了 [root@VM-4-17-centos ~]# docker exec -it tomcat-net-01 ping tomcat-net-02 # ping tomcat02的名字 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.084 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.089 ms

    我們自定義的網(wǎng)絡(luò)docker都已經(jīng)幫我們維護(hù)好了對應(yīng)的關(guān)系,推薦我們平時(shí)這樣使用網(wǎng)絡(luò)

    好處:

    redis - 不同的集群使用不同的網(wǎng)絡(luò),保證集群是安全和健康的

    mysql - 不同的集群使用不同的網(wǎng)絡(luò),保證集群是安全和健康的

    網(wǎng)絡(luò)連通

    測試打通tomcat01 和mynet

    # 直接ping [root@VM-4-17-centos ~]# docker exec -it tomcat01 ping tomcat-net-01 ping: tomcat-net-01: Name or service not known

    嘗試把tomcat01接入mynet

    [root@VM-4-17-centos ~]# docker network connect --helpUsage: docker network connect [OPTIONS] NETWORK CONTAINERConnect a container to a networkOptions:--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@VM-4-17-centos ~]# docker network connect mynet tomcat01

    查看mynet網(wǎng)絡(luò)

    docker network inspect mynet

    類比服務(wù)器

    就像一個(gè)是公網(wǎng)ip,一個(gè)是私網(wǎng)ip,一個(gè)容器兩個(gè)ip

    驗(yàn)證是否能ping通

    [root@VM-4-17-centos ~]# 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.112 ms 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.092 ms# 測試tomcat02是否可以ping通 [root@VM-4-17-centos ~]# docker exec -it tomcat02 ping tomcat-net-01 ping: tomcat-net-01: Name or service not known

    實(shí)戰(zhàn),部署Redis集群

    # 創(chuàng)建redis網(wǎng)絡(luò) [root@VM-4-17-centos ~]# docker network create redis --subnet 172.38.0.0/16 2c5bb068547e764cf368b4148af89119ab2c7530f4ed8c172d23479d0f8ebea4# 查看網(wǎng)絡(luò) [root@VM-4-17-centos ~]# docker network ls NETWORK ID NAME DRIVER SCOPE cc96daeb0587 bridge bridge local 68a20aebc99e host host local edbae3e3682a mynet bridge local d0bc18957a87 none null local 2c5bb068547e redis bridge local# 通過腳本創(chuàng)建六個(gè)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@VM-4-17-centos ~]# cd /mydata/redis [root@VM-4-17-centos redis]# ls node-1 node-2 node-3 node-4 node-5 node-6# 創(chuàng)建結(jié)點(diǎn)1 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#創(chuàng)建結(jié)點(diǎn)2 docker run -p 6372:6379 -p 16372: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 #創(chuàng)建結(jié)點(diǎn)3 docker run -p 6373:6379 -p 16373: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 #創(chuàng)建結(jié)點(diǎn)4 docker run -p 6374:6379 -p 16374: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 #創(chuàng)建結(jié)點(diǎn)5 docker run -p 6375:6379 -p 16375: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 #創(chuàng)建結(jié)點(diǎn)6 docker run -p 6376:6379 -p 16376: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# 查看服務(wù) [root@VM-4-17-centos redis]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 635c755e51e1 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 30 seconds ago Up 29 seconds 0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp redis-6 49a9e6017bec redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 38 seconds ago Up 37 seconds 0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp redis-5 b2eda60cb33c redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 47 seconds ago Up 46 seconds 0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp redis-4 23e7b7c57502 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 56 seconds ago Up 55 seconds 0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp redis-3 7c724462d992 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp redis-2 441b26f7eba7 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp redis-1# 創(chuàng)建集群 [root@VM-4-17-centos 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 >>> 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: 15e62b1ceef1187afaeeefd1564aa8d76a27c819 172.38.0.11:6379slots:[0-5460] (5461 slots) master M: ce628d1171969d7369d5e0fefca8d4851f91f094 172.38.0.12:6379slots:[5461-10922] (5462 slots) master M: b919d9d08ebf96c66f7bed803b439bd6053c8078 172.38.0.13:6379slots:[10923-16383] (5461 slots) master S: 6fe819edf4f4b5613b1425363f825124d81332b7 172.38.0.14:6379replicates b919d9d08ebf96c66f7bed803b439bd6053c8078 S: f8fa5b0b678c710aef205f29d2a25f20db4428b8 172.38.0.15:6379replicates 15e62b1ceef1187afaeeefd1564aa8d76a27c819 S: 7d9245617ecd13a1615fadb6ffdc539a9397c6d2 172.38.0.16:6379replicates ce628d1171969d7369d5e0fefca8d4851f91f094 Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join .. >>> Performing Cluster Check (using node 172.38.0.11:6379) M: 15e62b1ceef1187afaeeefd1564aa8d76a27c819 172.38.0.11:6379slots:[0-5460] (5461 slots) master1 additional replica(s) S: 6fe819edf4f4b5613b1425363f825124d81332b7 172.38.0.14:6379slots: (0 slots) slavereplicates b919d9d08ebf96c66f7bed803b439bd6053c8078 M: b919d9d08ebf96c66f7bed803b439bd6053c8078 172.38.0.13:6379slots:[10923-16383] (5461 slots) master1 additional replica(s) S: 7d9245617ecd13a1615fadb6ffdc539a9397c6d2 172.38.0.16:6379slots: (0 slots) slavereplicates ce628d1171969d7369d5e0fefca8d4851f91f094 M: ce628d1171969d7369d5e0fefca8d4851f91f094 172.38.0.12:6379slots:[5461-10922] (5462 slots) master1 additional replica(s) S: f8fa5b0b678c710aef205f29d2a25f20db4428b8 172.38.0.15:6379slots: (0 slots) slavereplicates 15e62b1ceef1187afaeeefd1564aa8d76a27c819 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.

    docker搭建集群完成!

    Springboot微服務(wù)打包Docker鏡像

  • 構(gòu)建springboot項(xiàng)目

  • 打包應(yīng)用

  • 編寫Dockerfile
    java:8已經(jīng)不再使用,用openjdk:8來代替

    FROM openjdk:8COPY *.jar /app.jarCMD ["--server.port=8080"]EXPOSE 8080ENTRYPOINT ["java", "-jar", "/app.jar"]
  • 構(gòu)建鏡像

    [root@VM-4-17-centos demo]# docker build -t docker-finish . Sending build context to Docker daemon 17.64MB Step 1/5 : FROM openjdk:8 8: Pulling from library/openjdk 001c52e26ad5: Pull complete d9d4b9b6e964: Pull complete 2068746827ec: Pull complete 9daef329d350: Pull complete d85151f15b66: Pull complete 52a8c426d30b: Pull complete 8754a66e0050: Pull complete Digest: sha256:86e863cc57215cfb181bd319736d0baf625fe8f150577f9eb58bd937f5452cb8 Status: Downloaded newer image for openjdk:8---> b273004037cc Step 2/5 : COPY *.jar /app.jar---> f19dfb67f413 Step 3/5 : CMD ["--server.port=8080"]---> Running in 9506ff0a26d3 Removing intermediate container 9506ff0a26d3---> 997aec0f7345 Step 4/5 : EXPOSE 8080---> Running in 5bbbfeaa8604 Removing intermediate container 5bbbfeaa8604---> 5099c2d20953 Step 5/5 : ENTRYPOINT ["java", "-jar", "/app.jar"]---> Running in 5b0c4cc8fb76 Removing intermediate container 5b0c4cc8fb76---> 8b793de54771 Successfully built 8b793de54771 Successfully tagged docker-finish:latest
  • 發(fā)布運(yùn)行!

  • # 查看鏡像 [root@VM-4-17-centos demo]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-finish latest 8b793de54771 35 seconds ago 544MB openjdk 8 b273004037cc 2 months ago 526MB tomcat 7.0 9dfd74e6bc2f 15 months ago 533MB redis 5.0.9-alpine3.11 3661c84ee9d0 2 years ago 29.8MB# 運(yùn)行 [root@VM-4-17-centos demo]# docker run -d -p 3344:8080 --name finish docker-finish 3750bc373ac2291d3ee3f6ce4ba8f7bdb90775e66e313d71f511bbc439b52922[root@VM-4-17-centos demo]# curl localhost:3344 #如果不可以后面檢查springboot中RequestMapping的內(nèi)容 hello,zwj

    記得開啟服務(wù)器的防火墻端口

    以后我們使用了Docker之后,給別人交付的就是一個(gè)鏡像!

    總結(jié)

    以上是生活随笔為你收集整理的Docker学习笔记 (狂神说)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。