Docker真正的入門

前言(重):

我很喜歡一句話:「 弱小和無知不是生存的障礙,傲慢纔是 」。
學習方式說明:先理解概念,但是一定要實踐,最後實踐和理論相結合一次搞定這個知識!

1> 多數人以爲下屬文章內容已經算是熟悉docker,已經能部署服務,啓動Docker,這叫真正的用嗎?這不算,我告訴你這隻能算得上是Docker入門。

2> 玩會 「容器數據卷」、「DockerFile」、「Docker 網絡」 纔算玩會Docker,這三個是Docker的精髓,但還算不上玩轉DOcker。

3> 企業實戰,這纔是真正的去玩轉Docker,不是說你會用就完了。

本文pdf鏈接:
鏈接:https://pan.baidu.com/s/1KcQLtoJa8YBYpz-Kl8ekXA
提取碼:MZXY
在這裏插入圖片描述

Docker概述


Docker 爲什麼這麼火?

一款產品:開發–上線 兩套環境!應用環境,應用配置!

開發 ------ 運維, 問題:我在我的電腦上可以運行! 版本更新,導致服務不可用! 對於運維考驗就十分大!

環境配置是十分麻煩的,每一個機器都要部署環境!(費時費力)

發佈一個項目(MySQL,Nginx,Apache,Zabbix…),項目能不能帶上環境安裝打包。

之前在服務器配置應用的環境,MySQL,Nginx等,配置錯了就麻煩了,不能跨平臺。

Window,最後發佈到Linux!

傳統:開發丟包,運維來部署。現在:開發打包部署上線,一套流程做完!

開發–環境—打包(帶上環境)–鏡像(放在DocKer倉庫中類似商店)----運維 下載發佈的鏡像—直接運行就OK。

解決方案

DocKer給以上的問題,提出瞭解決方案!
在這裏插入圖片描述

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

多個應用(端衝突)—原來都是交叉的!

核心思想:隔離! 打包裝箱! 每個箱子是相互隔離的。 比如:一個裝水果,一個裝武器

在這裏插入圖片描述
如果放在一起,一個壞了可能影響另一個,現在鏡像隔離,一個壞了不影響另一個
還有一個好處:將Linux服務器壓榨到極致,DOcKer通過隔離機制,將服務器應用到極致。

本質:所有的技術都是因爲出現了一些問題,我們需要解決,纔去學習的。

DocKer 的歷史

2010年,幾個高it的年輕人,就在美國成立了一家公司 dotCloud

做一些 pass的雲計算服務! LXC 有關的容器技術。

在這裏插入圖片描述
他們將自己的容器化技術,命名就是DocKer !
DocKer 剛剛誕生的時候沒有引起行業的注意!dotCloud,就活不下去!
開源:開放源代碼!(好比最開始的阿里)

2013 年,DOcker 開源!

Docker 越來越多的人發現了Docker的優點!火了,DocKer 每個月更新一個版本!

2014 年 4 月9 日,Docker 1.0 發佈!

DocKer爲什麼這麼火? 十分輕巧

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

虛擬機:在windos中裝一個虛擬機軟件Vmware,通過這個軟件我們就可以虛擬出來一臺或者多臺電腦!笨重!

虛擬機也是屬於虛擬化技術,DocKer容器技術,也就是一種虛擬化技術!

vm - linux centos 原生鏡像(一個電腦) 隔離,需要開啓多個虛擬機( 幾個G裝一個虛擬機)啓動幾分鐘!

DocKer - 隔離,鏡像(最核心的環境 4m)+ MysQl 等, 十分的小巧,運行鏡像就可以了 (幾兆,最小甚至kb)啓動秒級!

到現在所以開發人員都要會DocKer!!

聊聊DocKer

DocKer 是基於Go語言開發的!開源項目!

官網:https://www.docker.com/
在這裏插入圖片描述
文檔地址:https://docs.docker.com/ Docker的文檔是超級詳細的!

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

DocKer能幹嘛

虛擬化技術:

在這裏插入圖片描述
虛擬機的缺點:
1.資源佔用十分多
2.冗餘步驟多
3.啓動很慢

容器化技術:
在這裏插入圖片描述
一塊崩了,不影響其他!

比較Docker和虛擬機技術的不同:

  • 傳統虛擬機,虛擬出 一套硬件 運行 一個完整的操作系統,然後再這個系統上安裝和運行軟件
  • 容器內的應用直接運行在宿主機上的內容,容器時沒有自己的內核的,也沒有虛擬我們的硬件,所以就輕便了。
  • 每個容器間是互相隔離的,每個容器內都有一個屬於自己的文件系統,互不影響。

DevOps(開發、運維)

應用更快速的交付和部署

傳統:一堆幫助文檔,安裝程序

Docker:打包鏡像發佈測試,一鍵運行

更便捷的升級和擴縮容

使用了Docker之後,我們部署應用就和搭積木一樣!

項目打包成一個鏡像(擴展 服務器A! 服務器B 一鍵運行擴展)

更簡單的系統運維

在容器化之後,開發的測試環境都是高度一致的。

更高效的計算資源利用:

DocKer 是 內核級別的虛擬化,可以在一個物理機上運行很多的容器實例! 服務器的性能可以被壓榨到極致。

在這裏插入圖片描述

鏡像(image):

Docker鏡像就好比一個模板,可以通過這個模板來創建容器服務,tomcat 鏡像 ==> run ==> romcat01(提供服務),通過這個鏡像可以擦黃金多個容器(最終服務運行或者項目運行就是在容器中)。

容器(container):

Docker利用容器技術,獨立運行一個或者一組應用,通過鏡像來創建的。

啓動,停止,排除,基本命令。

目前就可以把這個容器理解爲一個簡易的Linux系統。

倉庫(repostory):

倉庫就是存放鏡像的地方!

倉庫分爲公有倉庫和私有倉庫!

DocKer Hub(默認是國外的)

阿里雲…都有容器服務器(配置模板加速!)

安裝Docker


環境準備

1、需要會Linux基礎
2、CentOS 7
3、Xshell遠程連接服務器進行操作!

環境查看

1.系統內核
[[email protected] ~]# uname -r
3.10.0-957.el7.x86_64

2.系統版本
[[email protected] ~]#
[[email protected] ~]# 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/centos/
在這裏插入圖片描述

  1. 卸載舊的版本

    $ sudo yum remove docker
    docker-client
    docker-client-latest
    docker-common
    docker-latest
    docker-latest-logrotate
    docker-logrotate
    docker-engine

  2. 需要的安裝包(yum-utils)

    $ sudo yum install -y yum-utils

  3. 設置鏡像倉庫(默認國外的,十分慢)

    $ sudo yum-config-manager
    –add-repo
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    網址:https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.6ee51b11Xt190G

    docker-ce 社區版

  4. 安裝Docker相關的內容

    yum makecache fast
    yum install docker-ce docker-ce-cli containerd.io

  5. 啓動 Docker

    systemctl start docker

  6. docker version

  7. 測試hello word

    docker run hello-world

  8. 查看 下載的 hello world 鏡像

    [[email protected] ~]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    hello-world latest bf756fb1ae65 10 months ago 13.3kB

  9. 卸載Docker

    yum remove docker-ce docker-ce-cli containerd.io
    rm -rf /var/lib/docker

阿里雲鏡像加速

在這裏插入圖片描述

  1. 找到鏡像加速地址

在這裏插入圖片描述

  1. 配置使用

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-‘EOF’
    {
    「registry-mirrors」: [「https://77n2hz2x.mirror.aliyuncs.com」]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart

docker回顧hello word 流程

在這裏插入圖片描述

底層原理


Docker 是怎麼工作的?

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

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

在這裏插入圖片描述

Docker 爲什麼比虛擬機快?

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

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

所以說新建一個容器的時候,Docker不需要像虛擬機一樣重新加載一個操作系統內核,避免引導,虛擬機是加載Guest OS,分鐘級別的,而Docker是利用宿主機的操作系統,省略了這個複雜的過程,秒級。

DocKer 的常用命令


幫助命令

docker --help 幫助
docker version 版本
docker info 顯示Docker詳細信息(系統信息、容器數量)

幫助文檔的地址:

鏡像命令

/ # docker images 查看所有本地的主機上的鏡像
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 10 months ago 13.3kB

REPOSITORY 鏡像的倉庫源
TAG 鏡像的標籤
IMAGE ID 鏡像的ID
CREATED 鏡像的創建時間
SIZE 鏡像的大小

可選項:
Options:
-a, --all 列出所有的鏡像
-q, --quiet 只顯示鏡像的ID

網頁版搜索 —— 網站:https://hub.docker.com/

搜索命令:# docker search mysql

[[email protected] ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10134 [OK]

搜索出鏡像STARS>3000
[[email protected] ~]# docker search mysql --filter=stars=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10134 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3730 [OK]

下載:docker pull 鏡像名[:tag] 可以加版本,否則默認最新版

[[email protected] ~]# docker pull mysql
Using default tag: latest // 不寫tag默認latest
latest: Pulling from library/mysql
bb79b6b2107f: Pull complete // 分層下載:docker image的核心,聯合文件系統
49e22f6fb9f7: Pull complete
842b1255668c: Pull complete
9f48d1f43000: Pull complete
c693f0615bce: Pull complete
8a621b9dbed2: Pull complete
0807d32aef13: Pull complete
a56aca0feb17: Pull complete
de9d45fd0f07: Pull complete
1d68a49161cc: Pull complete
d16d318b774e: Pull complete
49e112c55976: Pull complete
Digest: sha256:8c17271df53ee3b843d6e16d46cff13f22c9c04d6982eb15a9a47bd5c9ac7e2d //簽名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest // 真實地址

注:docker pull mysql 等價於 docker pull docker.io/library/mysql:latest

指定版本下載:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZELFFpOE-1604900424123)(%E5%9B%BE%E5%BA%93/Docker/image-20201107095335062.png)][[email protected] ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
bb79b6b2107f: Already exists
49e22f6fb9f7: Already exists
842b1255668c: Already exists
9f48d1f43000: Already exists
c693f0615bce: Already exists
8a621b9dbed2: Already exists
0807d32aef13: Already exists // 已經存在,不需要重複下載
f15d42f48bd9: Pull complete
098ceecc0c8d: Pull complete
b6fead9737bc: Pull complete
351d223d3d76: Pull complete // 只需要更新沒有的
Digest: sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

刪除鏡像:docker rmi [-f id / 鏡像名]

docker rmi -f bf756fb1ae65
docker rmi mysql
docker rmi mysql:5.7

批量刪除:docker rmi -f ${docker images -aq}

容器命令

說明:有了鏡像纔可以創建容器,Linuk,下載一個Centos鏡像來測試。

docker pull centos

新建容器並啓動

docker run [可選參數] image

參數說明:
– name=‘name’ 容器名字
-d 後臺方式運行
-it 使用交互方式運行,進入容器查看內容
-p 指定容器的端口 -p 8080:8080
-p ip:主機端口:容器端口
-p 主機端口:容器端口 (常用)
-p 容器端口
容器端口

-P 隨機指定端口

列出所有運行的容器

啓動並進入容器

[[email protected] /]# docker run -it centos /bin/bash
[[email protected] /]# ls 查看容器內的centos,基礎版本,很多命令都是不支持的
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[[email protected] /]# exit // 退出容器
exit
[[email protected] /]# ls
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var www

查看當前運行的容器:
-a all 列出歷世運行過的容器
-n=? 顯示最近創建的容器

[[email protected] /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

查看曾經運行的容器:

[[email protected] /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d1be77075d4 centos 「/bin/bash」 4 minutes ago Exited (0) 2 minutes ago elated_driscoll

退出容器

exit 直接容器停止並退出
ctrl+p+q 容器不停止退出

刪除容器

douker rm 容器id 刪除指定容器——不能刪除運行的容器——rm -f 強制刪除
docker rm -f ${docker ps -qa} 刪除所有的容器
docker ps -a -q | xargs docker rm 刪除所有的容器

啓動和停止容器的操作

docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id

常用其他命令

後臺啓動

[[email protected] /]# docker run -d centos
問題 docker ps 發現 centos停止了。

常見的坑,docker容器使用後臺運行,就必須要有一個前臺運行,就會自動停止
nginx,容器啓動後,發現自己沒有程序服務,就會立刻停止,就是沒有程序了

查看日誌命令

[[email protected] /]# docker logs -tf --tail 596f32b8c5c1
-tf 顯示所有日誌,帶上時間戳
–tail number 顯示日誌的條數

查看容器中進程信息

docker top 容器id

[[email protected] /]# docker top 596f32b8c5c1
UID PID PPID C STIME TTY TIME CMD
root 9296 9281 0 10:56 pts/0 00:00:00

查看鏡像原數據

docker inspect 容器ID

[[email protected] /]# docker inspect 9aeed2d3fe5a
[
{
「Id」: 「9aeed2d3fe5a61b592693343cf7634391f5dd720f5768ef1f565c2ef3bcb0d3f」,
「Created」: 「2020-11-07T03:13:07.030570945Z」,
「Path」: 「/bin/bash」,
「Args」: [],
「State」: {
"Status": 「running」,
「Running」: true,
「Paused」: false,
「Restarting」: false,
「OOMKilled」: false,
「Dead」: false,
「Pid」: 10807,
「ExitCode」: 0,
「Error」: 「」,
「StartedAt」: 「2020-11-07T03:13:07.309774647Z」,
「FinishedAt」: 「0001-01-01T00:00:00Z」
},
「Image」: 「sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566」,
「ResolvConfPath」: 「/var/lib/docker/containers/9aeed2d3fe5a61b592693343cf7634391f5dd720f5768ef1f565c2ef3bcb0d3f/resolv.conf」,
「HostnamePath」: 「/var/lib/docker/containers/9aeed2d3fe5a61b592693343cf7634391f5dd720f5768ef1f565c2ef3bcb0d3f/hostname」,
「HostsPath」: 「/var/lib/docker/containers/9aeed2d3fe5a61b592693343cf7634391f5dd720f5768ef1f565c2ef3bcb0d3f/hosts」,
「LogPath」: 「/var/lib/docker/containers/9aeed2d3fe5a61b592693343cf7634391f5dd720f5768ef1f565c2ef3bcb0d3f/9aeed2d3fe5a61b592693343cf7634391f5dd720f5768ef1f565c2ef3bcb0d3f-json.log」,
「Name」: 「/zealous_varahamihira」,
「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/dcc65e601678e89c53be19b83e9636ec21f51682af78a0b2fc477ae36eee24ba-init/diff:/var/lib/docker/overlay2/345bc1cb7c251197f100d6ef47902581206b846870266b77d5fac853ba04f9c3/diff」,
「MergedDir」: 「/var/lib/docker/overlay2/dcc65e601678e89c53be19b83e9636ec21f51682af78a0b2fc477ae36eee24ba/merged」,
「UpperDir」: 「/var/lib/docker/overlay2/dcc65e601678e89c53be19b83e9636ec21f51682af78a0b2fc477ae36eee24ba/diff」,
「WorkDir」: 「/var/lib/docker/overlay2/dcc65e601678e89c53be19b83e9636ec21f51682af78a0b2fc477ae36eee24ba/work」
},
「Name」: 「overlay2」
},
"Mounts": [],
「Config」: {
"Hostname": 「9aeed2d3fe5a」,
「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」: 「20200809」,
「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」: 「cb83a1f609a65eaa0f1866dac64c92140c291a5ff7dcf3ed2b5079af854cd3e9」,
「HairpinMode」: false,
「LinkLocalIPv6Address」: 「」,
「LinkLocalIPv6PrefixLen」: 0,
「Ports」: {},
「SandboxKey」: 「/var/run/docker/netns/cb83a1f609a6」,
「SecondaryIPAddresses」: null,
「SecondaryIPv6Addresses」: null,
「EndpointID」: 「23ae0b7b1fea254e7bf9b99c7687904bf5476da02cc787cffd7768f24f553034」,
「Gateway」: 「172.17.0.1」,
「GlobalIPv6Address」: 「」,
「GlobalIPv6PrefixLen」: 0,
「IPAddress」: 「172.17.0.4」,
「IPPrefixLen」: 16,
「IPv6Gateway」: 「」,
「MacAddress」: 「02:42:ac:11:00:04」,
「Networks」: {
「bridge」: {
「IPAMConfig」: null,
「Links」: null,
「Aliases」: null,
「NetworkID」: 「5e7053223ddfa7f6643c4d4f65a129584f16ef63c94c94e05eb74acfa126c58d」,
「EndpointID」: 「23ae0b7b1fea254e7bf9b99c7687904bf5476da02cc787cffd7768f24f553034」,
「Gateway」: 「172.17.0.1」,
「IPAddress」: 「172.17.0.4」,
「IPPrefixLen」: 16,
「IPv6Gateway」: 「」,
「GlobalIPv6Address」: 「」,
「GlobalIPv6PrefixLen」: 0,
「MacAddress」: 「02:42:ac:11:00:04」,
「DriverOpts」: null
}
}
}
}
]

進入當前正在運行的容器

我們通常容器是使用後臺運行的,需要進入容器,修改一些配置。
1> docker exec -it 容器ID bashShell

[[email protected] /]# docker exec -it 9aeed2d3fe5a /bin/bash
[[email protected] /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 03:13 pts/0 00:00:00 /bin/bash
root 14 0 0 03:26 pts/1 00:00:00 /bin/bash
root 29 14 0 03:27 pts/1 00:00:00 ps -ef

2> docker attach 容器id

[[email protected] /]# docker attach 9aeed2d3fe5a
[[email protected] /]#

兩種方式的區別:
1> exec 進入容器後開啓一個新的終端
2>attach 進入容器正在執行的終端,不會啓動新的進程

從容器內拷貝文件到主機

命令:docker cp 容器id:容器內路徑 目的主機路徑

[[email protected] /]# docker exec -it 93b13bd5d8fa /bin/bash
[[email protected] /]# touch /home/test.conf
[[email protected] /]# exit
[[email protected] /]# docker cp 93b13bd5d8fa:/home/test.conf /home
[[email protected] /]# ll /home/
total 0
-rw-r–r-- 1 root root 0 Nov 7 11:42 test.conf

小結:

Docker 命令是非常多的!

在這裏插入圖片描述

接下來就是一堆的練習:

Docker 練習

Docker 安裝 Nginx
步驟:

  1. 搜索鏡像 search 建議去docker網站搜索,可以看到詳細信息

  2. 下載鏡像 pull

  3. 運行測試

    注:docker run -d --name nginx01 -p:3344:80 nginx
    -d 後臺運行
    –name 容器命名
    -p

[[email protected] /]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 13971 [OK] [[email protected] /]# docker pull nginx
Using default tag: latest

[[email protected] /]# docker pull nginx
latest: Pulling from library/nginx
bb79b6b2107f: Pull complete
5a9f1c0027a7: Pull complete
b5c20b2b484f: Pull complete
166a2418f7e8: Pull complete
1966ea362d23: Pull complete
Digest: sha256:aeade65e99e5d5e7ce162833636f692354c227ff438556e5f3ed0335b7cc2f1b
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

[[email protected] /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c39a868aad02 34 hours ago 133MB
centos latest 0d120b6ccaa8 2 months ago 215MB

[[email protected] /]# docker run -d --name nginx01 -p:3344:80 nginx
[[email protected] /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eb5899cc3a4f nginx 「/docker-entrypoint.…」 6 seconds ago Up 5 seconds 0.0.0.0:3344->80/tcp nginx01

[[email protected] /]# firewall-cmd --permanent --add-port=3344/tcp
[[email protected] /]# firewall-cmd --reload
[[email protected] /]# firewall-cmd --list-all

[[email protected] /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eb5899cc3a4f nginx 「/docker-entrypoint.…」 5 minutes ago Up 5 minutes 0.0.0.0:3344->80/tcp nginx01
83040b9b35d9 centos 「/bin/bash」 59 minutes ago Up 59 minutes brave_pare
93b13bd5d8fa centos 「/bin/bash」 About an hour ago Up About an hour lucid_pare
[[email protected] /]# curl localhost:3344
在這裏插入圖片描述
測試通過:進入容器

[[email protected] ~]# docker exec -it nginx01 /bin/bash
[email protected]:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx

端口暴露問題:
在這裏插入圖片描述

思考問題:我們每次該動nginx配置文件,都需要進入容器內部,十多麻煩,我們是可以在容器外部提供一個映射路徑,達到在容器外修改文件名,容器內就可以自動修改? -v 邏輯卷

Docker 來裝一個tomcat

注:tomcat是Web 應用服務器,輕量級,開發和調試JSP 程序的首選
在這裏插入圖片描述

官方的使用:
$ docker run -it --rm tomcat:9.0
之前的啓動都是在後臺,停止了容器後,容器還可以查到,–rm(用完即刪,用於測試)
[[email protected] ~]# docker run -it --rm tomcat:9.0

  1. 下載啓動
  2. 測試

[[email protected] ~]# docker pull tomcat:9.0

[[email protected] ~]# docker run -d -p 3355:8080 --name tomcat01 tomcat

測試訪問:
在這裏插入圖片描述

進入容器:

[[email protected] ~]# docker exec -it tomcat01 /bin/bas
發現問題:1.linux命令少了,沒有webapps。阿里雲鏡像的原因,默認是最小的鏡像,所以不必要都剔除掉,保證最小可運行的環境!
[email protected]:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
[email protected]:/usr/local/tomcat# cp -r webapps.dist/* webapps

在這裏插入圖片描述

再思考一個問題:以後要部署項目,每次都要進入容器是不是十分的麻煩?我要是可以在容器外部提供一個映射路徑,達到在容器修改文件名,webapps,在外部防止項目,自動同步到內部就好了!

docker 容器 tomact+網站 docker mysql,刪容易跑路?這個顯然不科學,刪數據庫跑路還*

部署es + kinana

注:
1> es 暴露端口多、十分耗內存、數據一般需要放置到安全目錄。
2> kibana工具是提供了一個可視化的界面,es:高擴展、開源的全文檢索和分析引擎。

在這裏插入圖片描述

官方:docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e 「discovery.type=single-node」 elasticsearch:7.9.3

啓動:Elasticsearch es十分耗內存

查看: docker stats (服務器總共2個G,它就佔了1G,68.52%的內存)
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
f0d3429c35b0 elasticsearch 0.27% 1.23GiB / 1.795GiB 68.52% 1.18kB / 942B 456MB / 1.27MB 49

測試一下es是否能夠成功

關閉,增加內存的限制

[[email protected] ~]# curl localhost:9200
{
「name」 : 「f0d3429c35b0」,
「cluster_name」 : 「docker-cluster」,
「cluster_uuid」 : 「BRZN9DoIRKGkitQkNa1Wdg」,
「version」 : {
「number」 : 「7.9.3」,
「build_flavor」 : 「default」,
「build_type」 : 「docker」,
「build_hash」 : 「c4138e51121ef06a6404866cddc601906fe5c868」,
「build_date」 : 「2020-10-16T10:36:16.141335Z」,
「build_snapshot」 : false,
「lucene_version」 : 「8.6.2」,
「minimum_wire_compatibility_version」 : 「6.8.0」,
「minimum_index_compatibility_version」 : 「6.0.0-beta1」
},
「tagline」 : 「You Know, for Search」
}

增加內存的限制,修改配置文件 -e 環境配置修改

[[email protected] ~]# docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e 「discovery.type=single-node」 -e ES_JAVA_OPTS="-Xms64 -Xmx512m" elasticsearch:7.9.3

[[email protected] ~]# docker stats elasticsearch02
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
fd1d1f553e6b elasticsearch02 201.80% 338MiB / 1.795GiB 18.39% 586B / 0B 46.3MB / 344kB 26

問題:使用Kibana連接es

在這裏插入圖片描述

可視化
  • protainer(先用這個)

docker run -d -p 8080:9000
–restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

  • Rancher(持續部署CI/CD再用)

什麼是protainer?

Docker圖形化界面管理工具!提供一個後臺面板供我們操作!

下載安裝

docker run -d -p 8088:9000
–restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

測試:http://156.238.***.***:8088/

在這裏插入圖片描述

進入之後:一般不會用
在這裏插入圖片描述

Docker 鏡像詳解


鏡像是什麼?

鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基本運行環境開發的軟件,它包含運行某個軟件所需的所有內容,包括代碼、運行時、庫、環境變量和配置。

所有的應用,直接打包docker鏡像,就可以直接跑起來!

如何得到鏡像內:

  1. 從遠處倉庫下載
  2. 朋友拷貝
  3. 自己製作一個鏡像 DockerFile
Docker 鏡像加載原理

UnionFS(聯合文件系統)

下載的時候看到一層一層的就是。

UnionFS(聯合文件系統):Union 文件系統(UnionFS)是一種分層、輕量級並且高性能的文件系統,它支持對文件系統修改作爲一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下,Union 文件系統是Docker鏡像基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像(沒有父鏡像),可以製作各種具體的應用鏡像。

特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄

​ Docker 鏡像加載原理

因爲Docker鏡像是分層的,因此在加載一個鏡像的時候,會按照從底層到高層的順序依次加載該鏡像所需要的鏡像層。在加載的過程中,如果當前鏡像層已經存在,則會跳過當前鏡像層。比如:已經下載過MySQL鏡像,現在要下載Tomcat鏡像,而這兩個鏡像都需要CentOS鏡像層,那麼下載Tomcat鏡像的時候,就會跳過下載CentOS鏡像層。

bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引導加載kernel,Linux剛啓動時會加載bpptfs文件系統,在Docker鏡像的最底層是bootfs,這一層與我們典型的Linxu/Unix系統是一樣的,包含boot加載器和內核,當boot加載完成之後整個內核就都在內存中了,此時內存的使用全已由bootfs轉交給內核,此時系統會卸載bootfs。

rootfs(root file syste),在boots之上,包含的就是典型Linux系統中的/dev ,/proc,/bin/etc,等標準目錄和文件,rootfs就是各種不同操作系統發行版,比如Ubuntu,Centos等等!

在這裏插入圖片描述

平時我們安裝進虛擬機的Centos都是好幾個G,爲什麼Docker才200M?

[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0d120b6ccaa8 2 months ago 215MB

對於一個精簡的OS,rootfs可以很小,只需要包含最基礎的命令,工具和程序就可以了,因爲底層直接用Host的kernel,自己之需要提供rootfs就可以了,由此可見對於不同的Linux發行版,rootfs會有差別,因此不同發行版可以公用bootfs

虛擬機分鐘級、容器秒級

分層的概念

分層的鏡像

可以去下載一鏡像,注意觀察下載的日誌輸出,可以看到的是一層一層的在下載
[[email protected] ~]# docker run --name some-redis -d redis
Unable to find image ‘redis:latest’ locally
latest: Pulling from library/redis
bb79b6b2107f: Already exists
1ed3521a5dcb: Pull complete
5999b99cee8f: Pull complete
dd17877d8f2d: Pull complete
4863b56b12a8: Pull complete
069e700bc397: Pull complete
Digest: sha256:a0494b60a0bc6de161d26dc2d2f9d2f1c5435e86a9e5d48862a161131affa6bd
Status: Downloaded newer image for redis:latest
12ecacff2838f7a0ca055fccba2946c5504d8e07671471ed00567faccd2944de

思考:爲什麼Docker鏡像採用分層的結構?

最大的好處,我覺得莫過於資源共享了!比如好多鏡像都從相同的Base鏡像構建而成,那麼宿主機只需要在上保留一份base鏡像,同時內存中也之需要加載一份base鏡像,這樣就可以爲所有容器服務了,二鏡像的每一層都可以被共享。

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

…[
},
「RootFS」: {
「Type」: 「layers」,
「Layers」: [
「sha256:d0fe97fa8b8cefdffcef1d62b65aba51a6c87b6679628a2b50fc6a7a579f764c」,
「sha256:832f21763c8e6b070314e619ebb9ba62f815580da6d0eaec8a1b080bd01575f7」,
「sha256:223b15010c47044b6bab9611c7a322e8da7660a8268949e18edde9c6e3ea3700」,
「sha256:6a9976a8f40851f45dc8c68a04b130e90522f46bb7e8403c6e7eb4331674f213」,
「sha256:c875a9fc3ec72b140e325e1a1b3b57d299b91811e8288a07c6b788b0d7cba185」,
「sha256:d9364cb75b1a364fbcb97b2f51332fc012ae0321e18c3fd3811f5e5a9f8a2d0e」
]
},
「Metadata」: {
「LastTagTime」: 「0001-01-01T00:00:00Z」
}
}
]

理解:

所有Docker鏡像都起始於一個基礎鏡像層,當進行修改或增加新的內容的時候,就會在當前鏡像層之上,創建新的鏡像層。

舉一個的例子:加入基於Ubuntu Linux 16.04 創建一個新的鏡像,這就是新鏡像的第一層,如果在該鏡像中添加Python 包,將會在基礎鏡像層之上創建第二個鏡像層;如果繼續添加一個安全補丁,就會創建第三次層。

該鏡像當前已經包含了三層鏡像,如下圖所示(這只是一個用於岩石的很簡單的例子)
在這裏插入圖片描述

在添加額外的鏡像同時,鏡像始終寶石當前所有鏡像的組合,理解這一點非常重要,下圖中舉了一個很簡單的例子,每個鏡像層包含三個文件,而鏡像包含了來自兩個鏡像層的6個文件。
在這裏插入圖片描述

上圖中的鏡像層跟之前的圖中的略有區別,主要目的是便於展示文件。

下圖中展示了一個稍微複雜的二層鏡像,在外部看來整個鏡像只有6個文件,這是因爲最上層中的7是文件5 的一個更新版。
在這裏插入圖片描述

這種情況下,上層鏡像層中的文件覆蓋了底層鏡像層中的文件、這樣就使得文件的更新版本作爲一個新鏡像層添加到鏡像中。Docker 通過存儲引擎(新版本採用快照機制)的方式來實現鏡像層堆棧,並保證多鏡像層對外展開爲統一的文件系統。

Linux 上可用的存儲引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顧名思義,每種存儲引擎又是基於Linux 中對應的文件操作系統或者塊設備技術、並且每種存儲引擎都有其特有的性能特點。

Docker在Windows 上僅支持windowsfilter 一種存儲引擎,該引擎基於NTDS文件系統之上實現了分層和CoW
下圖展示了與系統顯示相同的三層鏡像。所有鏡像都堆疊併合並,對外提供統一的視圖。

在這裏插入圖片描述

特點

Docker 鏡像都是隻讀的,當容器啓動時,一個新的可寫層被加載到鏡像的頂部!
這一層就是我們通常說的容器層,容器之下的都叫鏡像層!

在這裏插入圖片描述

如何提交一個自己的鏡像

commit 鏡像

docker commit 提交容器爲一個新的副本

命令和git原理相似
docker commit -m=「提交的錯誤信息」 -a=「作者」 容器id 目標鏡像名:[TAG]

實戰測試:

  1. 啓動一個默認的comcat
  2. 發現官方沒有默認webapps沒有文件
  3. 拷貝進入文件
  4. 將我們操作過的容器通過commit 提交一個鏡像!我們以後就使用我們修改過的鏡像即可,這就是我們自己的一個修改的鏡像

[[email protected] ~]# docker commit -a"admin123" -m=「add webapps app」 6f1af5dcd8f0 tomcat:1.0
sha256:c88bb83dc1d51588bbe15b73a7c27c33b1ddc1b8decf319f641284d3d95a384e
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 1.0 c88bb83dc1d5 13 seconds ago 653MB
tomcat latest dab3cf97dd54 2 days ago 648MB
在這裏插入圖片描述

學習方式說明:先理解概念,但是一定要實踐,最後實踐和理論相結合一次搞定這個知識!

如果你想要保存當前容器的狀態, 就可以通過commit來提交,獲得一個鏡像。
就好比我們以前學習VM的時候。快照

到了這裏纔算是入門

三體中的一句話:弱小和無知不是生存的障礙,傲慢纔是。