狂神docker
Docker
參考資料
官方文件:https://docs.docker.com/docker-for-windows/
【官方文件超級詳細】
【釋出到倉庫,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虛擬機器
在容器技術出來之前,用的是虛擬機器技術
虛擬機器原理示意圖
缺點:
- 資源佔用多
- 冗餘步驟多
- 啟動很慢
容器化技術示意圖
不是模擬的完整的作業系統
二者對比
比較虛擬機器和Docker的不同
傳統虛擬機器 | Docker | |
---|---|---|
虛擬內容 | 硬體+完整的作業系統+軟體 | APP+LIB |
大小 | 笨重,通常幾個G | 輕便幾個M或KB |
啟動速度 | 慢,分鐘級 | 快,秒級 |
Docker安裝
Docker的基本組成
明確幾個概念:
-
映象(image):docker映象好比一個模板,可以通過這個模板來建立容器(container),一個映象可以建立多個容器,類似Python中的Class
-
容器(container):類似Python中通過Class建立的例項,Object;容器可以理解為一個簡易的系統
-
倉庫(repository):存放映象的地方,
分為共有倉庫和私有倉庫
-
Docker Hub:國外的
-
阿里雲:配置映象加速
-
環境準備
我們要有一臺伺服器,並且可以操作它
- Linux命令基礎,購買linux阿里雲的伺服器
- CentOS 7
- 使用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 的預設工作路徑
阿里雲映象加速
支付寶掃碼登入,簡訊驗證,確認授權
我有兩個問題
-
阿里雲映象加速必須配置嘛?
哎呦我去: 加速快
哎呦我去: 要是翻牆就無所謂了
-
這個阿里雲必須要買嘛,買哪個,我看阿里雲好多產品
哎呦我去:不需要買
哎呦我去:免費的
哎呦我去:阿里雲搜尋容器服務
哎呦我去:有一個映象加速
-
這個地址是哪來的呀
操作
控制檯搜尋 容器映象服務
找到加速地址
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
底層原理
Docker是真麼工作的?
Docker是一個Client-Server結構的系統,Docker的守護程序在主機上。通過Socket從客戶端訪問!
DockerServer接受到Docker-Client的指令,
Docker為什麼比VM快?
- Docker有著比虛擬機器更少的抽象層
- 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
docker search
搜尋倉庫中的映象,相當於網頁搜尋
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
發現問題
- linux命令少了
- 沒有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映象的檔案,可以理解為命令引數指令碼
構建步驟:
- 編寫一個dockerfile檔案
- docker build 構建成為一個映象
- docker run執行映象
- docker push 釋出映象(DockerHub、阿里雲映象倉庫 私有/共有)
這個寫一個專案時一樣的
官方DockerFile示例
看一下官方的DockerFile
可以看到官方映象都是基礎包,很多功能沒有,我們通常會自己搭建自己的映象
官方既然可以製作映象,我們亦可以
DockerFile基礎知識
- 每個指令都必須是大寫字母
- 按照從上到下順序執行
- #表示註釋
- 每一個指令都會建立體檢一個新的映象層,並提交
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節課,這周爭取都看完】
- 準備映象檔案 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中的主機介面即可
![image-20200616200505065](Docker.assets/image-20200616200505065.png