1. 程式人生 > 實用技巧 >狂神Docker筆記

狂神Docker筆記

Docker

參考資料

官方文件:https://docs.docker.com/docker-for-windows/

【官方文件超級詳細】

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

【釋出到倉庫,git pull push】

b站教程:https://www.bilibili.com/video/BV1og4y1q7M4?

【這個教程非常簡潔!且深入!基於企業應用場景!推薦!以下筆記都基於該課程】

前期基礎

linux基本命令,類似cd,mkdir等

Docker概述

Docker為什麼會出現

一款產品,開發和上線兩套環境,應用環境配置費時費力,而且容易出問題

尤其對於機器學習和深度學習的庫更是如此,很可能存在版本問題、底層依賴衝突問題

所以釋出專案時,不只是一套程式碼過去,而是程式碼+環境整體打包過去

所謂開發即運維,保證系統穩定性,提高部署效率

使用Docker後的流程:

開發:建立模型--環境--打包帶上環境,即映象--放到Docker倉庫

部署:下載Docker中的映象,直接執行即可

Docker的思想來自於集裝箱,集裝箱,對環境進行隔離

Docker通過隔離機制,可以將伺服器利用到極致。

Docker的歷史

2010年,幾個搞IT的人,在美國成立一家公司dotCloud

做一些pass的雲端計算服務

他們將自己的容器化技術命名為Docker

Docker基於Go語言開發

Docker剛剛誕生的時候,沒有引起行業的注意,dotCloud活不下去

然後他們決定開源

2013年,創始人將Docker開源,不開則以,一開驚人,剛開源的時候,每個月都會更新一個版本

2014年4月9日,Docker 1.0釋出

容器vs虛擬機器

在容器技術出來之前,用的是虛擬機器技術

虛擬機器原理示意圖

缺點:

  1. 資源佔用多
  2. 冗餘步驟多
  3. 啟動很慢

容器化技術示意圖

不是模擬的完整的作業系統

二者對比

比較虛擬機器和Docker的不同

傳統虛擬機器 Docker
虛擬內容 硬體+完整的作業系統+軟體 APP+LIB
大小 笨重,通常幾個G 輕便幾個M或KB
啟動速度 慢,分鐘級 快,秒級

Docker安裝

Docker的基本組成

明確幾個概念:

  1. 映象(image):docker映象好比一個模板,可以通過這個模板來建立容器(container),一個映象可以建立多個容器,類似Python中的Class

  2. 容器(container):類似Python中通過Class建立的例項,Object;容器可以理解為一個簡易的系統

  3. 倉庫(repository):存放映象的地方,

    分為共有倉庫和私有倉庫

    • Docker Hub:國外的

    • 阿里雲:配置映象加速

環境準備

我們要有一臺伺服器,並且可以操作它

  1. Linux命令基礎,購買linux阿里雲的伺服器
  2. CentOS 7
  3. 使用Xshell連結遠端伺服器

安裝xshell

下載CentOS7 https://www.jianshu.com/p/a63f47e096e8

下載VMware 360軟體管家下載

VMware配置虛擬機器 https://blog.csdn.net/babyxue/article/details/80970526

xshell連結伺服器 https://blog.csdn.net/zzy1078689276/article/details/77280814

[root@192 ~]# cd /
[root@192 /]# pwd
/
[root@192 /]# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@192 /]# uname -r
3.10.0-1127.el7.x86_64

使用者名稱

密碼

檢視ip:vmware裡面輸入,ip addIPr

視訊書籤,p602:20

https://www.bilibili.com/video/BV1og4y1q7M4?p=6

Centos安裝

https://docs.docker.com/engine/install/centos/

解除安裝舊的版本

# 解除安裝舊的版本
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安裝基本環境

# 安裝基本的安裝包
$ sudo yum install -y yum-utils

!

設定映象的倉庫

注意!!下載預設用國外的,太慢不要用!

用國內映象,百度搜索,docker的阿里雲映象地址

# 不要用官網預設這個!
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo # 預設是國外的

# 換成下面的

$ sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里雲映象

直接複製貼上就OK了

更像軟體包索引

yum makecache fast

沒有問題的話就是可以用的

安裝docker引擎

yum install docker-ce docker-ce-cli containerd.io # docker-ce 社群版 ee 企業版

注意這裡會有幾個個y/n的判斷

要看到Complet再收手!

啟動Docker

systemctl start docker # 代表啟動成功
docker version
Client: Docker Engine - Community
 Version:           19.03.11
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        42e35e61f3
 Built:             Mon Jun  1 09:13:48 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.11
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       42e35e61f3
  Built:            Mon Jun  1 09:12:26 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

docker run hello-world

中間一堆是簽名信息

run的執行流程圖

檢視下載的映象

docker images

解除安裝Docker

# 解除安裝依賴
yum remove docker-ce docker-ce-cli containerd.io

# 刪除資源
rm -rf /var/lib/docker # docker 的預設工作路徑

阿里雲映象加速

支付寶掃碼登入,簡訊驗證,確認授權

我有兩個問題

  1. 阿里雲映象加速必須配置嘛?

    哎呦我去: 加速快

    哎呦我去: 要是翻牆就無所謂了

  2. 這個阿里雲必須要買嘛,買哪個,我看阿里雲好多產品

    哎呦我去:不需要買

    哎呦我去:免費的

    哎呦我去:阿里雲搜尋容器服務

    哎呦我去:有一個映象加速

  3. 這個地址是哪來的呀

操作

控制檯搜尋 容器映象服務

找到加速地址

sudo mkdir -p /etc/docker # 建立一個陌路
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://uyfgafsw.mirror.aliyuncs.com"]
}
EOF # 編寫配置檔案

sudo systemctl daemon-reload # 重啟服務
sudo systemctl restart docker # 重啟docker

線上畫圖軟體ProcessOn

伺服器及購買相關介紹

底層原理

Docker是真麼工作的?

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

DockerServer接受到Docker-Client的指令,

Docker為什麼比VM快?

  1. Docker有著比虛擬機器更少的抽象層
  2. docker主要用的是宿主機的核心,vm需要Guest OS

所以說新建一個容器的時候,docker不需要像虛擬機器一樣重新載入一個作業系統核心,避免引導

Docker命令

幫助命令

docker version # 顯示docker的基本資訊
docker info # 系統資訊,映象和容器的數量
docker 命令 --help # 全部資訊

官網文件

映象命令

docker images

檢視所有本地主機上的映象

[root@192 ~]# docker images

# 解釋
REPOSITORY  # 映象倉庫源
TAG                 # 映象的標籤
IMAGE ID           # 映象的ID
CREATED           # 映象的建立時間
SIZE # 映象的大小
--all , -a		Show all images (default hides intermediate images) # 顯示所有
--digests		Show digests
--filter , -f		Filter output based on conditions provided
--format		Pretty-print images using a Go template
--no-trunc		Don’t truncate output
--quiet , -q		Only show numeric IDs # 只顯示id

搜尋倉庫中的映象,相當於網頁搜尋

網頁搜尋

mysql

docker search mysql

docker search --help

# 解釋
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

docker search mysql --filter=STARS=3000 # 搜尋出Stars大於3000的

【視訊書籤,https://www.bilibili.com/video/BV1og4y1q7M4?p=9,13:44,太熱了我要緩一緩】

【20200616拳擊課回來,好爽,趕緊把這個命令熟悉完】

docker pull

下載映象

docker pull mysql # 下載mysql映象,default tag,預設最新版latest
[root@192 ~]# sudo systemctl daemon-reload
[root@192 ~]# sudo systemctl restart docker
[root@192 ~]# docker pull mysql
Using default tag: latest # 不寫tag預設最新版
latest: Pulling from library/mysql
8559a31e96f4: Pull complete  # layer 分層下載,docker image的核心 聯合檔案系統
d51ce1c2e575: Pull complete 
c2344adc4858: Pull complete 
fcf3ceff18fc: Pull complete 
16da0c38dc5b: Pull complete 
b905d1797e97: Pull complete 
4b50d1c6b05c: Pull complete 
c75914a65ca2: Pull complete 
1ae8042bdd09: Pull complete 
453ac13c00a3: Pull complete 
9e680cd72f08: Pull complete 
a6b5dc864b6c: Pull complete 
Digest: sha256:8b7b328a7ff6de46ef96bcf83af048cb00a1c86282bfca0cb119c84568b4caf6#簽名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真實地址

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


# 指定版本下載 
docker pull mysql:5.7

版本來自於官網,版本庫https://hub.docker.com/_/mysql

docker images

此時檢視映象,可以看到新下載的兩個

docker rmi

remove images

# 刪除一個 可以通過名稱 也可以指定id -f表示刪除所有
docker rmi -f 9cfcce23593a
# 刪除多個 用空格分隔id
docker rmi -f id id id
# 刪除所有 
docker rmi -f $(docker images -aq) # images -aq就是查所有映象id,從而遞迴刪除

容器命令

說明:有了映象才能建立容器,linux,下載一個centos映象來測試學習

docker pull centos

新建容器並啟動

docker run [可選引數] image

# 引數說明
--name=“Name” # 容器名字,用於區分容器
-d 後臺方式執行
-it 使用互動方式執行,進入容器檢視內容
-p 指定容器的埠 如-p 8080::8080
	-p ip:主機埠:容器埠
	-p 主機埠:容器埠
	-p 容器埠
	
-p 隨機指定埠

進入退出容器

# 進入
docker run -it centos /bin/bash 
# 檢視目錄
ls
# 退出
exit

注意這裡面主機名,程式設計了centos的id

這裡面就是一個容器,套娃啊

檢視執行的容器

# 檢視正在執行的容器
docker ps
# 檢視曾經執行的容器
docker ps -a
# 顯示最近建立的容器,設定顯示個數
docker ps -a - n=? 
# 只顯示容器的編號
docker ps -aq
[root@192 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@192 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
9939864fa2e6        centos              "bin/bash"          4 minutes ago       Exited (0) 4 minutes ago                       unruffled_knuth
5f42e9930435        centos              "/bin/bash"         8 minutes ago       Exited (0) 4 minutes ago                       lucid_cannon
a89ddb393d3d        bf756fb1ae65        "/hello"            19 hours ago        Exited (0) 19 hours ago                        gracious_bhabha
[root@192 ~]# docker ps -a -n=2
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
9939864fa2e6        centos              "bin/bash"          6 minutes ago       Exited (0) 6 minutes ago                       unruffled_knuth
5f42e9930435        centos              "/bin/bash"         10 minutes ago      Exited (0) 7 minutes ago 
[root@192 ~]# docker ps -aq
9939864fa2e6
5f42e9930435
a89ddb393d3d

退出容器

# 容器停止退出
exit
# 容器不停止退出 注意必須在英文輸入法下,中文輸入法不行
Ctrl + P + Q
[root@192 ~]# docker run -it centos /bin/bash
[root@bfcea13c40cd /]# [root@192 ~]# docker ps ##注意這裡會自動給個命令,刪掉
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
bfcea13c40cd        centos              "/bin/bash"         About a minute ago   Up About a minute                       stoic_wilson
edbd9366d959        centos              "/bin/bash"         7 minutes ago        Up 7 minutes                            affectionate_bartik
[root@192 ~]# docker exec -it edbd9366d959 /bin/bash ## 再次進入
[root@edbd9366d959 /]# exit ##停止並推出
exit

刪除容器

# 刪除指定容器 不能刪除正在執行的容器,如果強制刪除 rm -f
docker rm 容器id
# 刪除所有容器
docker rm -f $(docker ps -aq)
# 刪除所有容器
docker ps -a -q|xargs docker rm
[root@192 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
bfcea13c40cd        centos              "/bin/bash"         29 minutes ago      Up 29 minutes                                   stoic_wilson
edbd9366d959        centos              "/bin/bash"         35 minutes ago      Up 35 minutes                                   affectionate_bartik
9939864fa2e6        centos              "bin/bash"          48 minutes ago      Exited (0) 48 minutes ago                       unruffled_knuth
5f42e9930435        centos              "/bin/bash"         52 minutes ago      Exited (0) 49 minutes ago                       lucid_cannon
a89ddb393d3d        bf756fb1ae65        "/hello"            20 hours ago        Exited (0) 20 hours ago                         gracious_bhabha
[root@192 ~]# docker rm 5f42e9930435
5f42e9930435
[root@192 ~]# docker rm edbd9366d959      # 注意正在執行的容器不能刪除
Error response from daemon: You cannot remove a running container edbd9366d9596c744dd449119269b04de2f2a494e7fc471f6396bcefd94c33fe. Stop the container before attempting removal or force remove

[root@192 ~]# docker ps -aq # 所有容器id
bfcea13c40cd
edbd9366d959
9939864fa2e6
a89ddb393d3d
[root@192 ~]# docker rm -f $(docker ps -aq) # 全部刪除
bfcea13c40cd
edbd9366d959
9939864fa2e6
a89ddb393d3d

啟動和停止容器的操作

docker start
docker restart
docker stop
docker kill
[root@192 ~]# docker run -it centos /bin/bash
[root@7b1a7dd10ea4 /]# exit
exit
[root@192 ~]# docker ps #檢視正在執行的
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@192 ~]# docker ps -a # 檢視歷史執行過的
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
7b1a7dd10ea4        centos              "/bin/bash"         54 seconds ago      Exited (0) 42 seconds ago                       fervent_mirzakhani
[root@192 ~]# docker start 7b1a7dd10ea4 # 啟動當前這個容器 container id 粘過 來
7b1a7dd10ea4
[root@192 ~]# docker ps # 檢視當前執行容器 發現啟動成功
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7b1a7dd10ea4        centos              "/bin/bash"         2 minutes ago       Up 28 seconds                           fervent_mirzakhani
[root@192 ~]# docker stop 7b1a7dd10ea4 # 停止執行
7b1a7dd10ea4
[root@192 ~]# docker ps # 再次檢視 沒有這個容器了
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES


常用其他命令

【視訊書籤:https://www.bilibili.com/video/BV1og4y1q7M4?p=11,不知不覺搞了一上午了,按部就班學東西的感覺真好,得找時間快點刷完】

後臺啟動docker

docker run -d 映象名
# 用docker ps 檢視的時候 發現停止了

# 後臺執行,docker發現前臺沒有,容器啟動後,發現自己沒有提供服務,會立刻停止
Last login: Wed Jun 17 19:47:35 2020
[root@192 ~]# systemctl start docker # 關機後重啟了,需要啟動docker
[root@192 ~]# docker run -d centos # 執行
8ce188e5fee31c2fac93c0a405ee1a95c38dbc50cb47c35b19c0039c27558ded
[root@192 ~]# docker ps -a # 檢視正在執行的
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
8ce188e5fee3        centos              "/bin/bash"         19 seconds ago      Exited (0) 18 seconds ago                       tender_dirac
7b1a7dd10ea4        centos              "/bin/bash"         8 hours ago         Exited (0) 8 hours ago                          fervent_mirzakhani

檢視日誌

docker logs
docker logs -f -t --tail n 【id】

[root@192 ~]# docker logs --help

Usage:	docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

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)

whiel true;do echo shenzai;sleep 
# 執行一個
[root@192 ~]# docker run -it centos /bin/bash

[root@c2887d35c71d /]# [root@192 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c2887d35c71d        centos              "/bin/bash"         57 seconds ago      Up 56 seconds                           vigorous_kare

# 檢視日誌,由於沒有執行指令碼,所以啥也沒顯示
[root@192 ~]# docker logs -f -t --tail 10 c2887d35c71d
^C # ctrl+c退出

# 執行centos裡面加個指令碼
[root@192 ~]# docker run -d centos /bin/sh -c "while true;do echo shenzai;sleep 1;done"
cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388

[root@192 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
cb6d7fbc3f27        centos              "/bin/sh -c 'while t…"   7 seconds ago       Up 6 seconds                            dreamy_almeida
c2887d35c71d        centos              "/bin/bash"              3 minutes ago       Up 3 minutes                            vigorous_kare

# 檢視日誌 發現隔一秒列印一條
[root@192 ~]# docker logs -f -t --tail 10 cb6d7fbc3f27
2020-06-17T12:02:11.293765084Z shenzai
2020-06-17T12:02:12.297675608Z shenzai
2020-06-17T12:02:13.301845582Z shenzai
2020-06-17T12:02:14.304800996Z shenzai
2020-06-17T12:02:15.307130238Z shenzai
2020-06-17T12:02:16.310574235Z shenzai
2020-06-17T12:02:17.312946923Z shenzai
2020-06-17T12:02:18.314841295Z shenzai
2020-06-17T12:02:19.317021705Z shenzai
2020-06-17T12:02:20.319670013Z shenzai
2020-06-17T12:02:21.322651649Z shenzai
2020-06-17T12:02:22.325466918Z shenzai
2020-06-17T12:02:23.327984704Z shenzai
2020-06-17T12:02:24.329656919Z shenzai

檢視正在執行的容器資訊

[root@192 ~]# docker inspect cb6d7fbc3f27
[
    {
        # 容器的完整id
        "Id": "cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388",
        
        # 建立時間
        "Created": "2020-06-17T12:00:50.706906186Z",
        
        # 指令碼位置
        "Path": "/bin/sh",
        
        # 執行的指令碼
        "Args": [
            "-c",
            "while true;do echo shenzai;sleep 1;done"
        ],
        "State": {
            "Status": "running", # 狀態,正在執行
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 1909, # 父程序id
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-06-17T12:00:51.093617477Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        
        # 來源映象
        "Image": "sha256:831691599b88ad6cc2a4abbd0e89661a121aff14cfa289ad840fd3946f274f1f",
        "ResolvConfPath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/hostname",
        "HostsPath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/hosts",
        "LogPath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388-json.log",
        
        
        "Name": "/dreamy_almeida",
        "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/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907-init/diff:/var/lib/docker/overlay2/7f79322e0f58d651a84a555dadd83d92537788172525945d3f538dd95dce336c/diff",
                "MergedDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907/merged",
                "UpperDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907/diff",
                "WorkDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907/work"
            },
            "Name": "overlay2"
        },
        
        "Mounts": [], # 掛載
        
        # 基本配置
        "Config": {
            "Hostname": "cb6d7fbc3f27",
            "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"
            ], # 基本環境變數,這裡沒有Java
            
            # 基本命令
            "Cmd": [
                "/bin/sh",
                "-c",
                "while true;do echo shenzai;sleep 1;done"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20200611",
                "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": "4d701985d7e77aa153790b697b2f38a61e20555c224b7675e4bf650b82799882",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/4d701985d7e7",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "8a6c71e2bafb19ca7dfd85445ccc4bef6d17467360a243d624089e676a24a018",
            "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": "22b0fd2290ccbc4e066a75d3f01bd8bf32ee4352c5bbcfc9f911287219219571",
                    "EndpointID": "8a6c71e2bafb19ca7dfd85445ccc4bef6d17467360a243d624089e676a24a018",
                    "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
                }
            }
        }
    }
]

# 停止正在瘋狂輸出的那個容器
[root@192 ~]# docker stop cb6d7fbc3f27
cb6d7fbc3f27

進入當前正在執行的容器

# 我們通常容器都是使用後臺方式執行的e

docker exec -it 容器id bashSHELL

# 測試
[root@192 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c2887d35c71d        centos              "/bin/bash"         35 minutes ago      Up 35 minutes                           vigorous_kare
[root@192 ~]# docker exec -it c2887d35c71d /bin/bash
[root@c2887d35c71d /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@c2887d35c71d /]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 11:57 pts/0    00:00:00 /bin/bash
root         14      0  0 12:32 pts/1    00:00:00 /bin/bash
root         28     14  0 12:32 pts/1    00:00:00 ps -ef
[root@c2887d35c71d /]# c2887d35c71d
[root@c2887d35c71d /]# exit
exit

# 方式二
[root@192 ~]# docker attach c2887d35c71d
[root@c2887d35c71d /]# 

# 區別
# docker exec # 進入容器後開啟一個新的終端,可以在裡面操作(常用)
# docker attach 進入容器正在執行的終端,不會啟動新的程序

從容器內拷貝檔案到主機上

# 執行
[root@192 ~]# docker run -it centos
# ctrl P Q 不關閉退出,檢視
[root@0569081aa89c /]# [root@192 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0569081aa89c        centos              "/bin/bash"         19 seconds ago      Up 19 seconds    
hopeful_chebyshev

# 檢視主機home下無檔案
[root@192 ~]# cd /home
[root@192 home]# ls

# 進入正在執行的容器
[root@192 home]# docker attach 0569081aa89c

# 進入容器home目錄
[root@0569081aa89c /]# cd /home

# 在目錄中建立java檔案
[root@0569081aa89c home]# touch test.java

# 退出並停止容器
[root@0569081aa89c home]# exit
exit

# 檢視現在執行的容器
[root@192 home]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

# 容器雖然被停止,但是資料都會保留
[root@192 home]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS               NAMES
0569081aa89c        centos              "/bin/bash"              3 minutes ago       Exited (0) 8 seconds ago                           hopeful_chebyshev
f589e5684a01        centos              "/bin/bash"              44 minutes ago      Exited (0) 44 minutes ago                          cranky_easley
cb6d7fbc3f27        centos              "/bin/sh -c 'while t…"   54 minutes ago      Exited (137) 42 minutes ago                        dreamy_almeida
c2887d35c71d        centos              "/bin/bash"              58 minutes ago      Exited (127) 16 minutes ago                        vigorous_kare
8ce188e5fee3        centos              "/bin/bash"              About an hour ago   Exited (0) About an hour ago                       tender_dirac
7b1a7dd10ea4        centos              "/bin/bash"              9 hours ago         Exited (0) 9 hours ago                             fervent_mirzakhani

# 容器資料拷貝到主機
[root@192 home]# docker cp 0569081aa89c:/home/test.java /home
[root@192 home]# ls
test.java

# 拷貝是一個手動過程,未來我們使用 -v 卷的技術,可以實現自動同步 /home /home

檢視內容佔用

docker stats

小結

[root@192 home]# docker --help

Usage:	docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config
                           files (default "/root/.docker")
  -c, --context string     Name of the context to use to
                           connect to the daemon
                           (overrides DOCKER_HOST env var
                           and default context set with
                           "docker context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level
                           ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by
                           this CA (default
                           "/root/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file
                           (default "/root/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default
                           "/root/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  builder     Manage builds
  config      Manage Docker configs
  container   Manage containers
  context     Manage contexts
  engine      Manage the docker engine
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

作業練習

部署Nginx

# 官網搜尋nginx,可以看到幫助文件

# 下載映象
[root@192 home]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
8559a31e96f4: Pull complete 
8d69e59170f7: Pull complete 
3f9f1ec1d262: Pull complete 
d1f5ff4f210d: Pull complete 
1e22bfa8652e: Pull complete 
Digest: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

# 檢視映象
[root@192 home]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              831691599b88        13 hours ago        215MB
nginx               latest              2622e6cca7eb        7 days ago          132MB

# 執行測試
# -d 後臺執行,--name 命名,-p 暴露埠,3344伺服器、宿主機的埠,容器內部埠
[root@192 home]# docker run -d --name nginx01 -p:3344:80 nginx
38dbf7bdcaef232d269b7184d91e44e06087181b5ee929494e177ad526810fa8
[root@192 home]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
38dbf7bdcaef        nginx               "/docker-entrypoint.…"   7 seconds ago       Up 6 seconds        0.0.0.0:3344->80/tcp   nginx01

# 使用3344可以訪問成功
[root@192 home]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

埠暴露

可以公網訪問

找到伺服器地址

瀏覽器輸入 192.168.147.132:3344/

[root@192 home]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
38dbf7bdcaef        nginx               "/docker-entrypoint.…"   21 minutes ago      Up 21 minutes       0.0.0.0:3344->80/tcp   nginx01

# 進入容器
[root@192 home]# docker exec -it nginx01 /bin/bash

# 查一下nginx在哪
root@38dbf7bdcaef:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx

# 到這個目錄
root@38dbf7bdcaef:/# cd /etc/nginx
root@38dbf7bdcaef:/etc/nginx# ls
conf.d		koi-utf  mime.types  nginx.conf   uwsgi_params
fastcgi_params	koi-win  modules     scgi_params  win-utf

# 退出
root@38dbf7bdcaef:/etc/nginx# exit
exit

# 停止
[root@192 home]# docker stop 38dbf7bdcaef
38dbf7bdcaef


再次重新整理網頁,服務關閉

思考問題:每次改動nginx配置檔案,都需要進入容器內部,十分麻煩,要是可以在容器外部提供一個對映路徑,達到在容器修改檔名,容器內部就可以自動修改?-v 資料卷技術!

部署tomcat

【視訊書籤:https://www.bilibili.com/video/BV1og4y1q7M4?p=15】

【20200618畢竟生產力工具,加油搞,這週一定刷完!!每次關機都要重連,麻煩(╹▽╹)】

在docker hub上檢視版本號和使用方法

官方文件一定要翻爛,超多版本,我的天吶~

官方方法
docker run -it --rm tomcat:9.0

# docker run 可以不用pull,能自動下載
# -it 直接進去執行
# --rm 是什麼意思?入門的意思?
# 我們之前的啟動都是後臺,停止了容器之後,容器還是可以查到
# 寫了--rm,類似閱後即焚模式,用完即刪除,這種通常用來測試

# 最後冒號查好的版本號

ctrl+c退出

docker ps -a

可以看到並沒有tomcat,印證閱後即焚模式,容器會刪除,映象不會刪除

平時不建議這樣搞

正常方法
docker pull tomcat:9.0 # 之前下過了,應該不用下了,這裡老師講錯了

# 啟動執行,應該加上版本號
docker run -d -p 3355:8080 --name tomcat01 tomcat

# 進入容器
docker exec -it tomcat01 /bin/bash

發現問題

  1. linux命令少了
  2. 沒有webapps

這是阿里雲映象的原因:預設使用最小映象,所有不必要的都剔除了,保證最小可執行環境

再次找到結構

在瀏覽器中輸入:http://192.168.147.132:3355/

思考問題:我們以後部署專案,如果每次都要進入容器是不是身份麻煩?我要是可以在容器外部提供一個對映路徑,webapps,我們在外部放置專案,就自動同步到內部就好了!

docker容器 tomcat+網站

docker mysql

部署es+kibana

# es 暴露的埠很多
# es 十分耗記憶體
# es 的資料一般需要放置到安全目錄!掛載

# 啟動 elasticsearch
$ docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

# 檢視記憶體佔用情況
docker stats

# 先感覺stop一下
docker stop ba18713ca536

# 通過 -e 限制記憶體
$ docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS=“-Xms64m -Xmx512m” elasticsearch:7.6.2

沒成功啊,SEI能告訴我為啥!!

docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

py0003null大佬:
“ES_JAVA_OPTS=-Xms64m -Xmx512m”

py0003null大佬:
引號提前試試

原因是引號!!你沒覺得怪怪的嘛

此時檢視stats,發現記憶體佔用在控制範圍內

ctrl + C退出,記得stop

思考:用kibana連結elasticsearch

視覺化

  • portainer(先用這個)
  • Rancher(CI/CD時用)

portainer

Docker影象化介面管理工具,提供一個後臺面板供我們操作!

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

訪問外網8088

使用者名稱

密碼

【中午吃飯重連了一下,失敗,不知道發生了啥】

【平時不會用這個,好吧,先往下】

Docker映象

原理

UnionFS 聯合檔案系統

bootfs:boot file system

rootfs:root file system

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

commit提交映象

docker commit # 提交容器成為一個新的副本
docker commit -m="提交的描述資訊" -a="作者" 容器id 目標映象名:[TAG]
docker images
docker run -it -p 8080:8080 tomcat

這是一個前臺程式

將webapps.dist裡面所有的檔案拷貝到webapps裡面,其中-r必須有,表示目錄遞迴拷貝

docker commit -a="paidaxing" -m="add webapps app" 當前容器的id tomcat02:1.0

發現新的版本,比之前的大了一些,因為裡面記錄了我們的改動

如果想儲存當前容器的狀態,可以通過commit提交,獲得一個映象

好比我們以前學習VM的時候的快照

到這裡算是入門了

接下來三個部分是docker的精髓

容器資料卷

什麼是容器卷

docker是要將應用和環境打包成一個映象

這樣,資料就不應該在容器中,否則容器刪除,資料就會丟失,這就是刪庫跑路

故容器之間要有一個數據共享技術

在Docker容器中產生的資料,同步到本地,這就是卷技術

本質上是一個目錄掛載,將容器內的目錄掛載到虛擬機器上

目的:容器的持久化和同步操作

容器間可以資料共享

使用資料卷

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

docker run -it -v -p
# -it 互動式進入
# -v volume卷技術
# -p 主機埠

新開一個視窗

docker inspect 容器id

找到掛載資訊Mounts

測試

容器停止後,修改主機檔案,再啟動容器的時候,資料同樣改變

雙向同步

實戰安裝mysql

MySQL的資料持久化命令

docker search mysql

# 拉取
docker pull mysql:5.7

# 掛載
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql5.7

-d 後臺執行
-p 埠對映
-v 卷掛載
-e 環境配置 安裝啟動mysql需要配置密碼
--name 容器名字

連結測試:開啟SQLyog

點 測試連結

點 連結

具名和匿名掛載

【視訊書籤:https://www.bilibili.com/video/BV1og4y1q7M4?p=23,有點累了,跟不動了,這兩天運動太少了,有點頹】

DockerFile使用來構建docker映象的檔案

kas:
沒有安裝吧?

kas:
安裝一下就可以了

py9001021曾敘堅:
centos 預設使用vi寫內容,vim需要下載

py9001021曾敘堅:
是的,需要下載vim才能使用

YF:
配置可以改下,字型就很炫酷了

都建民:
用vi 試試

都建民:
你沒有安裝vim

都建民:
yum install vim

都建民:
試試這個命令

yum install vim # 編輯檔案的,沒有裝一下

安裝完之後就可以執行這個命令了

# 映象是一層一層的,指令碼是一行一行的
# 指令都是大寫的
# 這裡的每個命令可以理解為映象的一層

FROM centos

VOLUME ["volume01","volume02"] # 再建立映象的時候就掛載出來

CMD echo "---end---"
CMD /bin/bash

想儲存並退出

Wesley.:
shift 加 冒號

cat dockerfile1

docker build -f dockerfile1 -t padaxing/centos:1.0 .  # 最後的點很重要 映象名不能有/

docker images

啟動生成的映象

在容器內部建立一個檔案

檢視Mounts,Source對應容器外目錄,匿名掛載卷

測試一下,在container volume01下生成檔案

在主機掛載路徑下,也同樣生成

多個容器資料共享

【視訊書籤:https://www.bilibili.com/video/BV1og4y1q7M4?p=25,週日下午,濱江,大雨,本來說這週六刷完的,發現週六啥也幹不下去,除了吃就是睡,要麼發呆研究小金庫】

看一下有啥images

啟動docker01,用之前建的padaxing/centos 1.0 映象

docker run -it --name docker01 padaxing/centos:1.0 # 1.0必須寫

當前這個ctrl+p+q不停止退出

依次啟動docker02、docker03

docker run -it --name docker02 --volumes-from docker01 padaxing/centos:1.0

docker02繼承docker01的volumes

可以驗證,在docker01下加一個數據,在docker02下也會出現

建立docker03,同樣繼承docker01

docker run -it --name docker03 --volumes-from docker01 padaxing/centos:1.0

在docker03的volume01下建立檔案,在docker01的volume01下同樣也有

即通過--volumes-from 可以實現不同容器間的資料共享

刪除docker01,資料還在

docker rm -f 

可以看到,刪除docker01,進入docker02,資料依然在

結論:

容器之間配置資訊的傳遞,資料卷容器的生命週期一直持續到沒有容器使用位置

但是如果持久化到了本地,即使所有容器刪除了,本地資料是不會刪除的


DockerFile

是用來構建docker映象的檔案,可以理解為命令引數指令碼

構建步驟:

  1. 編寫一個dockerfile檔案
  2. docker build 構建成為一個映象
  3. docker run執行映象
  4. docker push 釋出映象(DockerHub、阿里雲映象倉庫 私有/共有)

這個寫一個專案時一樣的

官方DockerFile示例

看一下官方的DockerFile

可以看到官方映象都是基礎包,很多功能沒有,我們通常會自己搭建自己的映象

官方既然可以製作映象,我們亦可以


DockerFile基礎知識

  1. 每個指令都必須是大寫字母
  2. 按照從上到下順序執行
  3. #表示註釋
  4. 每一個指令都會建立體檢一個新的映象層,並提交

docker是面向開發的,我們以後要釋出專案,做映象,就要編寫dockerfile檔案,這個檔案十分簡單!

Docker映象逐漸成為企業的交付標準,必須掌握!


DockerFile命令

FROM # 基礎映象 比如centos
MAINTAINER # 映象是誰寫的 姓名+郵箱
RUN # 映象構建時需要執行的命令
ADD # 新增,比如新增一個tomcat壓縮包
WORKDIR # 映象的工作目錄
VOLUME # 掛載的目錄
EXPOSE # 指定暴露埠,跟-p一個道理
RUN # 最終要執行的
CMD # 指定這個容器啟動的時候要執行的命令,只有最後一個會生效,而且可被替代
ENTRYPOINT # 指定這個容器啟動的時候要執行的命令,可以追加命令
ONBUILD # 當構建一個被繼承Dockerfile 這個時候執行ONBUILD指定,觸發指令
COPY # 將檔案拷貝到映象中
ENV # 構建的時候設定環境變數

實戰構建自己的centos

Docker Hub中99%的映象都是從FROM scratch開始的

新增centos7的壓縮包

# 建立一個自己的centos

# 進入home目錄
cd /home

# 建立一個目錄,之後的東西都儲存到這裡
mkdir dockerfile
# 進入這個目錄
cd dockerfile/
# 建立一個dockerfile,名字叫mydockerfile
vim mydockerfile-centos


xshell新開一個介面

# 官方預設centos
docker run -it centos
pwd # 官方預設有pwd命令
vim # 官方預設沒有vim命令
ifconfig # 官方預設沒有ifconfig命令

回到mydockerfile

# 下面給官方centos加上自定義的內容
FROM centos
MAINTAINER padaxing<[email protected]>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

ESC, shif + : 輸入wq儲存並退出

如果寫錯了需要修改、

vim mydockerfile-centos
# 進入之後按i或者INSERT鍵即可修改

下面通過這個這個檔案建立映象

docker build -f dockerfile-centos -t mycentos:0.1 .

依次執行命令

最終返回Successfully表示成功

docker run -it mycentos:0.1 # 版本號必須寫,不然他會去找最新的
pwd
vim
ifconfig

這時可以看到這些功能都有了

可以通過檢視docker構建歷史

可以看到當前這個映象是怎麼一步一步構建起來的

我們平時拿到一個映象也可以通過這個方法研究一下他是怎麼做的

CMD與ENTRYPOINT

【視訊書籤,https://www.bilibili.com/video/BV1og4y1q7M4?p=29,雨終於停了,想去江邊跑步】


FROM centos
CMD ["ls","-a"] # 啟動centos展示目錄

測試ENTRYPOINT

run的時候可以直接加命令

Docker中許多命令都十分相似,我們需要了解他們的區別,最好的方式就是這樣對比測試


實戰Tomcat映象

【視訊書籤,https://www.bilibili.com/video/BV1og4y1q7M4?p=30,這節有點長,這個jar包是哪來的,晚上再搞,先去該模型比較急,還有10節課,這周爭取都看完】

  1. 準備映象檔案 tomcat壓縮包

IDEA整合Docker

Docker 整合Docker

Docker Compose

Docker Swarm

各種bug

Xshell連結失敗

Connecting to 192.168.147.131:22...
Could not connect to '192.168.147.131' (port 22): Connection failed.

注:電腦休眠重啟後,機子會斷開,要重新在vmware裡面輸入ip addr 獲得ip

修改xshell中的主機介面即可