docker 的結(jié)構(gòu)
1 鏡像
-- 鏡像是一個(gè)模板文件,提供容器運(yùn)行時(shí)所需的程序常空,庫(kù),資源和配置盖溺,還有為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷漓糙、環(huán)境變量、用戶等)2 容器
-- 容器是鏡像的運(yùn)行實(shí)例烘嘱,容器根據(jù)鏡像生成一個(gè)隔離的應(yīng)用程序的環(huán)境包昆禽,每個(gè)容器都是一個(gè)標(biāo)準(zhǔn)化的單元蝗蛙,確保了在不同機(jī)子上也能擁有一致的行為。3 數(shù)據(jù)卷
-- docker 對(duì)數(shù)據(jù)的持久化方案醉鳖,數(shù)據(jù)不會(huì)隨著容器結(jié)束而丟失捡硅,通過(guò)將宿主機(jī)的某一文件目錄掛載到容器里來(lái)實(shí)現(xiàn)。在 Docker 里提供了三種方法來(lái)實(shí)現(xiàn)目錄的掛載:
-- volumes: 屬于 Docker 管理的目錄盗棵,無(wú)需自己創(chuàng)建目錄
-- bind mounts:自己指定的某個(gè)目錄壮韭,需注意不同操作系統(tǒng)的文件路徑格式。
-- tmpfs:僅存儲(chǔ)在主機(jī)系統(tǒng)的內(nèi)存中纹因,不會(huì)持久保存在磁盤(pán)上喷屋。容器可以使用它來(lái)共享簡(jiǎn)單狀態(tài)或非敏感的信息。4 網(wǎng)絡(luò)
-- bridge 模式
---【 Docker 在主機(jī)上會(huì)創(chuàng)建一個(gè) docker0 的網(wǎng)橋瞭恰,每當(dāng)有容器要?jiǎng)?chuàng)建時(shí)屯曹,便會(huì)為容器分配一個(gè)獨(dú)立的網(wǎng)卡,然后橋接到虛擬網(wǎng)橋上惊畏。這其實(shí)是一對(duì)虛擬網(wǎng)卡恶耽,一端放在容器里,另一端放在 docker0 網(wǎng)橋里颜启。當(dāng)一端有數(shù)據(jù)達(dá)到時(shí)驳棱,就會(huì)把數(shù)據(jù)包轉(zhuǎn)發(fā)到另一端上,這就實(shí)現(xiàn)了網(wǎng)絡(luò)通信农曲∩缃粒】
-- host 模式
---【在建一個(gè)容器時(shí),一般會(huì)為容器分配一個(gè)獨(dú)立的 Network Namespace 以進(jìn)行網(wǎng)絡(luò)隔離乳规。如果我們使用了 Host 模式形葬,則不再分配 Network Namespace,而是和宿主機(jī)共用一個(gè) Network Namespace暮的。此時(shí)容器將不再擁有自己的虛擬網(wǎng)卡笙以、IP 和端口,而是和宿主機(jī)共用一個(gè) IP 和端口冻辩〔螅】
-- none 模式
--- 【使用 none 模式的容器擁有屬于自己的 Network Namespace,但不做任何網(wǎng)絡(luò)配置恨闪。它和宿主機(jī)以及其他容器是不互通的倘感。如果需要和外部通信,則需要自定義網(wǎng)絡(luò)驅(qū)動(dòng)程序咙咽,自己添加網(wǎng)卡老玛、配置 IP 等。】
配置阿里云容器加速器
- 0 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
- 1 配置阿里云鏡像加速器:cd /etc/docker/daemon.json,
- 2 vim daemon.json 把: {"registry-mirrors": ["https://3tg72qr.mirror.aliyuncs.com"]} 填上
- 2_2 在鏡像中心-鏡像加速器- (https://3tg72qr1.mirror.aliyuncs.com)
- 3 配置后L : systemctl daemon-reload
- 4 重啟: systemctl restart docker
image 鏡像是啥!
- 鏡像由多個(gè)層組成蜡豹,每層疊加之后麸粮,從外部看來(lái)就如一個(gè)獨(dú)立的對(duì)象。鏡像內(nèi)部是一個(gè)精簡(jiǎn)的操作系統(tǒng)(OS)镜廉,同時(shí)還包含應(yīng)用運(yùn)行所必須的文件和依賴包(鏡像:一句話就是模板文件)弄诲。
- Docker 鏡像可以看作是一個(gè)特殊的文件系統(tǒng),是一個(gè)包含了運(yùn)行容器的各種資源的文件系統(tǒng)
- 容器是一個(gè)進(jìn)程集合娇唯,只不過(guò)把系統(tǒng)的其他資源給隔離開(kāi)齐遵!形成獨(dú)立的文件系統(tǒng)。其他資源包括網(wǎng)絡(luò)資源视乐,進(jìn)程也搓,文件系統(tǒng)等等契吉。
- 1 容器化本質(zhì)上就是虛擬化的改進(jìn)版本智哀,這種技術(shù)允許多個(gè)應(yīng)用程序駐留在同一個(gè)服務(wù)器中拇颅,不過(guò)兩者之間有區(qū)別的,虛擬化是在硬件級(jí)別分離應(yīng)用程序伸刃,而容器化則是在操作系統(tǒng)級(jí)別分離硬件程序.
- 2虛擬化使得操作系統(tǒng)可同時(shí)在單個(gè)硬件系統(tǒng)運(yùn)行谎砾。
- 3 容器則可共享同一個(gè)操作系統(tǒng)的內(nèi)核,將應(yīng)用進(jìn)程與系統(tǒng)其它部分隔離開(kāi)捧颅。例如:ARM linux系統(tǒng)運(yùn)行ARM Linux容器景图,x86 Linux系統(tǒng)運(yùn)行 x86Linux容器,x86容器具有極佳的可移植性碉哑,但前提是它們必須與底層系統(tǒng)兼容挚币。
- 4 這意味著什么?虛擬化會(huì)使用虛擬機(jī)監(jiān)控程序模擬硬件扣典,從而使多個(gè)操作系統(tǒng)能夠并行運(yùn)行妆毕,但這不如容器輕便。事實(shí)上贮尖,在僅擁有容量有限的資源時(shí)笛粘,需要能夠可以進(jìn)行密集部署的輕量級(jí)應(yīng)用。linux容器在本機(jī)操作系統(tǒng)上運(yùn)行湿硝,與所有容器共享該操作系統(tǒng)薪前,因此應(yīng)用和服務(wù)能夠保持輕巧,并行化快速運(yùn)行关斜。
- 5 linux容器鏡像提供了可移植性和版本控制示括,確保能夠在開(kāi)發(fā)人員的筆記本電腦上運(yùn)行的應(yīng)用,也能在生產(chǎn)環(huán)境中運(yùn)行蚤吹,相較于虛擬機(jī)例诀, Linux容器在運(yùn)行時(shí)所占用的資源更少随抠,使用的是標(biāo)準(zhǔn)接口 (啟動(dòng)裁着,停止繁涂,環(huán)境變量等)并會(huì)與應(yīng)用隔離開(kāi),此外二驰,作為(包含多個(gè)容器)大型應(yīng)用的一部分時(shí)更加易于管理扔罪,容器可以跨多個(gè)云環(huán)境進(jìn)行編排。
- 6 一旦容器從鏡像啟動(dòng)后桶雀,二者之間就變成了互相依賴的關(guān)系矿酵,并且在鏡像上啟動(dòng)的容器全部停止之前,鏡像是無(wú)法被刪除的矗积。嘗試刪除鏡像而不停止或銷毀使用它的容器全肮,會(huì)導(dǎo)致出錯(cuò)。
容器的生命周期(1創(chuàng)建 2運(yùn)行 3暫停 4關(guān)閉)
- 1 容器是進(jìn)程文件的一種集合棘捣,隔離性比VM要差辜腺,因?yàn)橄牡馁Y源相對(duì)VM要少很多。
- 2 鏡像一次構(gòu)建乍恐,到處運(yùn)行的特點(diǎn)评疗。鏡像就相當(dāng)于文件系統(tǒng)!
- 3 容器的生命周期和inition的周期是一致的,當(dāng)inition退出的時(shí)候茵烈,容器也就退出了.
- 4 容器退出百匆,但是數(shù)據(jù)是要可持久化的存儲(chǔ),這個(gè)就是數(shù)據(jù)卷了呜投,它負(fù)責(zé)容器退出后數(shù)據(jù)的可持久化存儲(chǔ)加匈!
- 5 K8S里的調(diào)度器會(huì)觀察容器所需的大小規(guī)格(內(nèi)存,CPU之類)仑荐,然后在集群中選一個(gè)比較空閑的機(jī)器來(lái)進(jìn)行放置的操作!
- 6 K8s有3個(gè)能力雕拼,1調(diào)度 2自動(dòng)恢復(fù) 3水平伸縮動(dòng)態(tài)擴(kuò)容
docker開(kāi)啟守護(hù)進(jìn)程
- 1 sudo systemctl start docker 開(kāi)啟守護(hù)進(jìn)程后才能在控制臺(tái)正常顯示信息
- 2 systemctl stop docker 停止守護(hù)進(jìn)程
- 3 systemctl enable docker (docker守護(hù)進(jìn)程開(kāi)機(jī)自啟)
docker在ubuntu安裝流程
設(shè)置root密碼:sudo passwd root
查看版本/虛擬環(huán)境: uname -a || ls -l /sys/class/misc/device-mapper
1 首先更新軟件源 apt-get update(不懂看這https://cloud.tencent.com/developer/article/1617353)
2 安裝安全插件: apt-get install apt-transport-https ca-certificates curl software-properties-common lrzsz -y
3 更換官方的docker下載源: sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
4 設(shè)置Docker穩(wěn)定版?zhèn)}庫(kù) : sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
5 升級(jí)下 :apt-get update
6 安裝最新版本Docker CE(社區(qū)版): sudo apt-get install docker-ce -y
7 安裝完畢后可以檢查: docker version 版本
8 完畢后多了一個(gè)網(wǎng)卡IP : ifconfig (docker 0 )
9 systemctl stop docker (關(guān)閉服務(wù)命令)
10 systemctl start docker (運(yùn)行服務(wù))
11 systemctl status docker ps (查看狀態(tài))
image鏡像的操作
- 12 docker search (ubuntu) (搜索鏡像)
- 13 docker pull (ubuntu) (拉取鏡像)
- 14 docker images 鏡像名稱 (查看鏡像)
- 15 docker tag nginx:latest nginx-panda:v1 (重命名鏡像)
- 16 docker rmi (鏡像ID / 或者鏡像名稱+版本號(hào)) (刪除鏡像!)
- 17 docker save -o nginx-panda.tar nginx (壓縮鏡像文件)
- 18 docker load < (--input) nginx-panda.tar (壓縮后的鏡像文化名) (解壓加載被壓縮后的鏡像)
- 19 cat ubuntu-16.10-x86_64.tar.gz | docker import - ubuntu_iso (解壓創(chuàng)建一個(gè)本地鏡像!)
- 20 docker history ubuntu_iso:latest (查看鏡像的歷史操作命令:鏡像名稱+版本號(hào))
- 21 docker inspect ubuntu_iso:latest (查看一個(gè)鏡像的詳細(xì)信息)
- 22 docker create -it --name [容器名稱] [依賴的容器鏡像名字] ls -al (創(chuàng)建一個(gè)容器鏡像!!成功后會(huì)在containers生成一個(gè)文件)
- 23 docker start -a 77e964f66402(容器ID) 啟動(dòng)一個(gè)容器
- 24 docker ps -a (查看運(yùn)行中的容器!)
- 25 docker run (參數(shù)) (鏡像名稱) (執(zhí)行命令) (創(chuàng)建并且啟動(dòng)容器的命令,創(chuàng)建容器是依賴于鏡像的!) :
--- docker run --rm --name ubuntu_iso ubuntu /bin/echo "HelloWorld" (啟動(dòng)容器并且刪除释漆,然后輸出信息)
--- --name 不起名字系統(tǒng)就會(huì)隨機(jī)起一個(gè)悲没, --rm 刪除!
創(chuàng)建并且啟動(dòng)運(yùn)行容器的命令
- 容器是依賴鏡像存在男图,如果鏡像刪除就無(wú)法啟動(dòng)該容器了!!!
- 1 docker run -d ubuntu-1 (以守護(hù)進(jìn)程的方式啟動(dòng), 隨機(jī)生成名字)
- 2 docker run -it ubuntu-1 (啟動(dòng)并且直接進(jìn)入容器, 沒(méi)加 --name 就隨機(jī)生成名字)
- 3 docker stop e3760ab45792 (關(guān)閉容器)
- 4 docker start e3760ab45792 (開(kāi)啟容器)
- 26 docker run -d --name ubuntu_iso ubuntu (守護(hù)進(jìn)程的方式啟動(dòng)容器, 區(qū)別在于-d的參數(shù))
暫停容器和取消暫停
- 27 docker pause 57b0ed72efe1(容器ID) (暫停容器的命令)
- 28 docker unpause 57b0ed72efe1 (容器id) (接觸暫停容器命令)
刪除容器的3種方法
- 29 docker rm (容器id) (刪除只能刪停止運(yùn)行的!)
- 30 docker rm -f nginx_2 (-f 強(qiáng)制刪除正在運(yùn)行的容器!)
- 31 docker rm -f $(docker ps -a -q) (強(qiáng)制刪除所有的容器)
進(jìn)入容器的方法
- 32 docker run -it --name nginx-2 nginx /bin/bash (創(chuàng)建容器并且進(jìn)入容器的方式)
- 33 docker run -it -d --name nginx-1 nginx /bin/bash (另外一種手動(dòng)進(jìn)入容器的方法示姿,先創(chuàng)建并且運(yùn)行了,區(qū)別在于 -d 參數(shù)會(huì)導(dǎo)致創(chuàng)建容器的時(shí)候就啟動(dòng)了,)
- 33_2 docker exec -it nginx-1 /bin/bash (這是第二步逊笆,這才真正進(jìn)入容器環(huán)境里面了!栈戳,前一步只是創(chuàng)建容器, 只能用于已經(jīng)運(yùn)行的容器進(jìn)入!)
把容器保存成鏡像儲(chǔ)存
- 1 docker commit -m "golang ubuntu iso"(創(chuàng)建信息) -a "sos"(作者信息) cf1785e3a68f(容器ID) ubuntu-iso-1:v1 (鏡像名字:版本)
- 2 docker export (容器ID) > 模板文件名.tar (docker export e43df5b05295 > ubuntu-1.tar)
- 3 cat mysql_iso_1.tar | docker import - mysql_con (把容器壓縮包生成鏡像!)
查看容器的詳細(xì)信息
- 1 docker inspect e3760ab45792 (容器id)
查看容器的端口映射
- 1 docker port nginx-3
修改容器名字
- 1 docker rename e3760ab45792(容器id) nginx-con(新名字)
數(shù)據(jù)卷
- 1 就是共享文件难裆,達(dá)到映射的效果子檀,對(duì)數(shù)據(jù)卷的更新镊掖,不會(huì)影響鏡像,卷會(huì)一直存在褂痰,直到?jīng)]有容器使用.
- 2 docker run -itd --name nginx-con2(容器名稱) -v /var/lib/docker/go/:/go-text nginx(依賴的鏡像) (進(jìn)入容器后跟外面的路徑映射起來(lái)亩进,形成數(shù)據(jù)共享!)
- 3 把數(shù)據(jù)卷容器跟容器掛載起來(lái)缩歪,把數(shù)據(jù)卷掛載在容器下面归薛,容器之間進(jìn)行數(shù)據(jù)共享以及增刪改查的操作
- 4 docker create -v /data-test (數(shù)據(jù)卷掛載的目錄) --name nginx-demo(數(shù)據(jù)卷容器的名稱) nginx (依賴鏡像) ——(數(shù)據(jù)卷目錄會(huì)掛載到進(jìn)入容器里的目錄下)
- 5 docker run --volumes-from nginx-demo -itd --name demo1 nginx
- 6 docker run --volumes-from nginx-demo -itd --name demo2 nginx (創(chuàng)造2個(gè)容器,把數(shù)據(jù)卷容器掛載進(jìn)來(lái)nginx-demo)
- 7 docker exex -it demo1 /bin/bash 2個(gè)容器都進(jìn)來(lái)后匪蝙,在data-test目錄里共享數(shù)據(jù)!!! 這個(gè)目錄所有操作都會(huì)共享資源
備份數(shù)據(jù)卷容器
- 1 備份數(shù)據(jù):
網(wǎng)絡(luò)
- 0 apt-get install bridge-utils (軟件安裝!)
- 1 端口映射,隨機(jī)分配端口: docker run -d -P --name nginx-1 nginx
- 2 可以指定ip訪問(wèn) : docker run -d -p(小寫(xiě)) --name nginx-2 nginx
- 3 可以指定多個(gè)IP和端口映射80端口訪問(wèn): docker run -d -p 10000:80 10240:80 --name nginx-3 nginx
- 4 查看容器的網(wǎng)絡(luò)相關(guān)信息 : docker inspect nginx-3
- 5 查看端口映射情況:docker port nginx-3
- 6 創(chuàng)建一個(gè)網(wǎng)絡(luò):docker network create --driver bridge bridge-demo1
- 7 容器網(wǎng)絡(luò)連接斷開(kāi)命令: docker disconnect
- 8 查看網(wǎng)絡(luò)的詳細(xì)信息: docker network inspect bridge-demo1
- 9 自定義網(wǎng)段和網(wǎng)關(guān) : docker network create --driver bridge --gateway 172.99.0.1 --subnet 172.99.0.0/16 bridge-demo2
- 10 創(chuàng)建一個(gè)容器主籍,并且指定網(wǎng)絡(luò):docker run --net=bridge-demo2 -itd --name nginx-2 nginx
- 11 斷開(kāi)容器的網(wǎng)絡(luò)連接: docker network disconnect bridge-demo1 nginx-1
- 12 重新讓容器連接網(wǎng)絡(luò): docker network connect bridge-demo2 nginx-1
brctl軟件的安裝及修改默認(rèn)的 docker 網(wǎng)橋,使用自己設(shè)定的網(wǎng)橋訪問(wèn)!
- 0 brctl 軟件是創(chuàng)建網(wǎng)橋用的!
- 1 網(wǎng)橋軟件的安裝:apt-get install bridge-utils
- 2 創(chuàng)建網(wǎng)橋:sudo brctl addbr br0 (網(wǎng)橋名稱)
- 3 給網(wǎng)橋設(shè)定網(wǎng)段和IP地址:sudo ifconfig br0 192.168.99.1 netmask 255.255.255.0
- 4 修改網(wǎng)橋配置文件 : vim /etc/default/docker
- 5 創(chuàng)建一個(gè)文件夾 : mkdir -p /etc/systemd/system/docker.service.d
- 6 創(chuàng)建一個(gè)文件: vim /etc/systemd/system/docker.service.d/Using_Environment_File.conf
- 7 在Using_Environment_File.conf 文件里寫(xiě)上逛球,以并關(guān)聯(lián)更改網(wǎng)橋的文件:
--[Service]
--EnvironmentFile=-/etc/default/docker
--ExecStart=
--ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS - 8 重新加載:systemctl daemon-reload
- 9 重啟docker : systemctl restart docker
- 10 在創(chuàng)建容器后會(huì)發(fā)現(xiàn)網(wǎng)橋信息變更了:1 docker run -itd --name nginx-3 nginx 千元,2 docker inspect 842090eeb31f ,3 docker network inspect bridge
- 11 接下來(lái)重新創(chuàng)建一個(gè)容器, 網(wǎng)絡(luò)采用host模式:docker run --net=host -itd --name nginx-1 nginx
- 12 執(zhí)行查看可以發(fā)現(xiàn)多了個(gè)80端口:docker network inspect host颤绕, docker inspect nginx-1
- 13 現(xiàn)在可以直接用宿主機(jī)的iP直接訪問(wèn)容器所代表的鏡像的業(yè)務(wù)頁(yè)面!!
容器是允許外部訪問(wèn)的
- 0 docker run -itd --net=host(模式) --name nginx-1 nginx ---80 端口直接就能使用IP訪問(wèn)!
- 1 隨機(jī)分配端口幸海,利用宿主機(jī)IP(服務(wù)器就是公網(wǎng)IP)訪問(wèn):docker run -d -P --name nginx-1 nginx 可以指定IP和端口
- 2 創(chuàng)建容器的時(shí)候默認(rèn)采用bridge網(wǎng)絡(luò)模式來(lái)進(jìn)行容器之間通信
- 3 可以指定主機(jī)IP訪問(wèn):docker run -d -p(小寫(xiě)) 192.168.1.4::80 --name nginx-2 nginx
- 4 可以在終端用內(nèi)網(wǎng)訪問(wèn):curl 192.168.99.2:8080 (-p 創(chuàng)建容器的時(shí)候指定的端口映射)
網(wǎng)絡(luò)模式: bridge, host ,none
- 0 bridge 模式只有宿主機(jī)能與該容器進(jìn)行通信
- 1 host 模式是 bridge 橋接模式很好的補(bǔ)充
- 2 采用 host 模式的 Docker Container,可以直接使用宿主機(jī)的 IP 地址與外界進(jìn)行通信
- 3 采用host模式后屋厘,網(wǎng)絡(luò)環(huán)境隔離性的會(huì)弱化涕烧。
- 4 host模式需要在創(chuàng)建容器時(shí)指定!:谷鳌议纯!(docker run --net=host -itd --name nginx-1 nginx)
- 5 none模式禁用了網(wǎng)絡(luò)功能,只有IO接口
- 6 查看網(wǎng)絡(luò)模式的詳細(xì)信息: docker network inspect none
安裝pipework軟件
- 1 git clone https://github.com/jpetazzo/pipework
在docker 容器里創(chuàng)建mysql
- docker run -d -p 6666:3306 -e MYSQL_ROOT_PASSWORD=1234(Mysql密碼設(shè)置) --name mysql-1 mysql:5.7 (版本號(hào))
- docker cp mysql-1:/etc/mysql/mysql.conf.d/mysqld.cnf /mysql/conf/ (把容器中文件拷貝到主機(jī)中R绨U胺铩!也就是外面來(lái)操作!!因?yàn)槿萜鲀?nèi)部沒(méi)有相關(guān)命令操作)
- (把外面創(chuàng)建的文件夾掛載到Mysql容器內(nèi)部) docker run -d -p 6666:3306 -v /mysql/conf:/etc/mysql/mysql.conf.d/ -e MYSQL_ROOT_PASSWORD=1234 --name mysql-1 mysql:5.7
- 設(shè)置Mysql中文字符集,在mysql.conf.d文件里配置 :character-set-server=utf8
自定義網(wǎng)絡(luò)讓主機(jī)跟容器內(nèi)部進(jìn)行通信
- 1 首先創(chuàng)建一個(gè)網(wǎng)絡(luò):docker network create --driver bridge --subnet 172.22.16.0/24 --geteway 172.22.16.1 my_net2
- 2 創(chuàng)建一個(gè)容器指定網(wǎng)絡(luò):docker run -itd --net=my_net2 busybox
- 3 可以查看網(wǎng)卡的關(guān)聯(lián)關(guān)系: ip a
- 4 進(jìn)入對(duì)應(yīng)容器:docker exec -it 94dedbe6cd93 /bin/bash
- 5 查看網(wǎng)卡關(guān)聯(lián)信息: ip a 看到有關(guān)ip地址
- 6 ping通試試: ping 172.22.16.1(IP)
- 不同網(wǎng)橋的容器通信可以用connect來(lái)連接:docker network connect **(網(wǎng)橋名稱) **(容器名稱)
- 但是docker的系統(tǒng)自帶的網(wǎng)橋之間:是可以通信的世杀,因?yàn)槭窃谝粋€(gè)網(wǎng)絡(luò)橋接上阀参。
查看服務(wù)器里tag 為none的鏡像ID
- 1 docker images | grep none | awk '{print $3}' | xargs docker rmi (刪除該為none的鏡像)
Dockerfile
- Dockerfile是用來(lái)構(gòu)建docker鏡像的文件,是由一系列命令和參數(shù)構(gòu)成的腳本瞻坝。
- 1.編寫(xiě)dockerfile文件
- 2.docker build 基于Dockerfile建造鏡像文件
- 3.docker run 運(yùn)行容器