Docker 介绍、安装、基础搭建 --01
?1. Docker介紹
? ? ?1.1 是容器,可以部分完全封閉。封閉意味:一個物質(放到容器),另一個物質(放到容器)隔離
? ? ? ? ? ? 容器可以保護里面的物質
? ? ?1.2 容器的前世
? ? ? ? ? FreeBASE jail(監獄) ------> Linux vserver????最早的容器技術,研發目地:運行比較危險的程序,進行測試。
??????????問題:還得自己創建管理銷毀容器。------>到后期移至到 Linux vserver。Linux vserver是什么,相比虛擬化區別
??????????是什么:那個年代虛擬化流程,半虛擬化,全虛擬化,硬件虛擬化
? ? ? ? ? ?chroot ? -----> 完整的根文件系統(FHS)標準的
? ? ? ? ? ?namespaces ---> UTS Mount IPC PID user network
? ? ? ? ? ?cgroup?? ? ? ---> 資源的分配和監控
? ? ? ? ? 通過比較復雜的代碼開發的過程,調用以上三項技術
? ? ? ? ? 實現容器的創建 ? ----> 管理 ?---->銷毀
? ? ? 1.3 傳統虛擬化技術和容器對比
docker 只是管理容器,包括LXC。??
虛擬化技術:兩大類:? ? ??
一、軟件模擬:先模擬硬件在裝系統:1、server 包括硬件、cpud等等??2、Host OS (速度機器內核)操作平臺windows 3、 Hypervisor :比如你在vmware?4、Centos OS 你在vmware裝的Centos???????? 好處:隔離性強,全都是獨立、資源限制。?
?缺點:1、耗資源????2、如Centos 請求cpu資源的時候,先去找Hypervisor,進行轉換。所有在Hypervisor有層層轉換,然后在到達Host OS系統的內核,kernel。在到達硬件
二、虛擬化技術的演變:半虛擬化
? ????原理:不在Hypervisor 調用,實現應用調用Host OS,實現資源分配
????半虛擬化技術的演變:硬件半虛擬化
????原理:Host OS、Hypervisor 打包成一個。就是一個服務器什么也沒裝,裝上這個軟件就是一個系統。Vmware EXSI、KVM、XTN。?KVM:裝Centos,在裝?KVM模塊,把Host OS 變成帶有KVM內核,提供即使操作系統也是虛擬化。
???????使得發展非???#xff0c;但是還是分配、安裝等步驟。大規模移植、分發不實現、因為還得裝系統,基于系統。使得用虛擬化計算分發浪費資源,早期有用openstack。自從容器技術出來以后,不需要安裝系統,原有系統上達到資源隔離。
? ????1.4 容器的前世今生?
?????????容器是基于操作系統內核實現隔離,不需要操作系統,輕量級的虛擬化技術
?????????早期容器實現:Namespaces 、CCgroups、chroot?
? ? ??
? ? ? 實現隔離能力:原理:最下層為Linux??→上層為容器引擎 →在上為容器,容器與容器怎么隔離,獨立管理的資源,最基礎的? ? ? ? 名字、IP地址等。?在Linux 上是由uis管理,多臺機器中管理網絡,主機名等?。還有用戶、文件系統FS、進程(IPL進程之間? ? ? ? 的隔離)、根隔離(chroot ,比如把/etc設置為 ? ? ? 根???chroot /etc ,前提/etc/必須滿足FHS)、sdb掛在點隔離、其他按照? ? ? ? ? ? 需求等 。統稱:Namespaces? ?
? ? ?
? ? ?? ? ?
? ?? ?
? ? ?
?Linux在內核中通過namespaces,原生支持6種資源隔離,并且直接通過系統調用對外進行輸出。
? ?另外,僅靠namespaces,就可以完成容器的功能嗎?
? ?不對,我們還需要靠CCgroups 控制每個namespace中的資源分配。
??CCgroups:怎么分配cpu、怎么調度、每臺都要有一個獨立的資源。獨立的IO、CPU、硬件機制。要不會導致整個宿主機 ? 掛掉。早期調用需要用C開發調用,很麻煩
??直到今生出生:LXC(LinuXContainer) (對于原有的常用功能進行了封裝,不用開發寫,直接調用代碼,方便我們做容 ? ? 器的生命周期) ,LXC 把文件打包到到本地,但是創建還是很慢的,在跑一遍軟件。一致性難、但是最終出現
? ?----- >Docker(dotcloud),加上了常用鏡像的技術,centos、windows等等,里面封裝了lnmp等不需要跑一遍,啟動就 ? ?可以。docker 用的=go 語言進行二次開發,性能高,接近c語言的輕量級語言。
2、安裝:? ?
? ?yum源準備
???curl ?http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
???wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
???curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
? ?2.1 安裝依賴包
???yum install -y yum-utils device-mapper-persistent-data lvm2
???yum list docker-ce.x86_64 --showduplicates | sort -r
? 2.2 安裝docker-ce??--基于阿里云鏡像安裝docker
? ?安裝默認yum提供的版本:yum install -y docker-ce?????ce (社區)??ee(企業)
? ?安裝較舊版本(比如Docker 17.03.2) 時需要指定完整的rpm包的包名,并且加上--?setopt=obsoletes=0 參數:
? ?2.3 啟動Docker服務
systemctl daemon-reload systemctl restart docker? ?查看docker信息
[root@docker ~]# docker version 查看版本 Client: Docker Engine - Community ? ? CS 架構? c: clinet 客戶端Version: 20.10.11 docker 版本API version: 1.41 API的版本Go version: go1.16.9 go語言開發Git commit: dea9396 當前版本提交的信息編號Built: Thu Nov 18 00:38:53 2021 建立時間OS/Arch: linux/amd64 架構多少位Context: defaultExperimental: trueServer: Docker Engine - Community CS 架構? s: server 引擎端Engine:Version: 20.10.11API version: 1.41 (minimum version 1.12)Go version: go1.16.9Git commit: 847da18Built: Thu Nov 18 00:37:17 2021OS/Arch: linux/amd64Experimental: falsecontainerd: containerd 核心組件已經安裝Version: 1.4.12GitCommit: 7b11cfaabd73bb80907dd23182b9347b4245eb5drunc:Version: 1.0.2GitCommit: v1.0.2-0-g52b36a2docker-init:Version: 0.19.0GitCommit: de40ad0[root@docker ~]# docker info Client:Context: defaultDebug Mode: falsePlugins:app: Docker App (Docker Inc., v0.9.1-beta3)buildx: Build with BuildKit (Docker Inc., v0.6.3-docker)scan: Docker Scan (Docker Inc., v0.9.0)Server:Containers: 0Running: 0Paused: 0Stopped: 0Images: 0Server Version: 20.10.11Storage Driver: overlay2 # 存儲驅動器,當前流行版本(aufs、overlay、brtfs)overlay2官方 推薦,存儲速度也很 ,必須Linux內核是3.18以上,系統必須開d_type,要不用不了Backing Filesystem: xfsSupports d_type: trueNative Overlay Diff: trueuserxattr: falseLogging Driver: json-file # docker 日志存儲類型,json-file存在本地在Docker Root Dir:Cgroup Driver: cgroupfsCgroup Version: 1Plugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogSwarm: inactive # 是容器編排的工具,沒有看k8s好Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc # 運行容器的標準,docker就是基于runc創建、銷毀等等,核心的部分Default Runtime: runcInit Binary: docker-initcontainerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5drunc version: v1.0.2-0-g52b36a2init version: de40ad0Security Options:seccompProfile: defaultKernel Version: 3.10.0-1160.el7.x86_64Operating System: CentOS Linux 7 (Core)OSType: linuxArchitecture: x86_64CPUs: 1Total Memory: 1.777GiBName: localhost.localdomainID: HE56:OHT2:4HVH:KRJJ:SUS2:RO2Y:PJNX:4RZF:JBNJ:XTI4:VBZQ:4YOCDocker Root Dir: /var/lib/docker docker 日志存儲位置,每次docker重啟之后,日志會清除, 干凈狀態運行,可以更改,條件允許,使用單獨掛在的ssd或者其他的類型磁盤,防止日志大后,導致跟目錄占滿Debug Mode: falseRegistry: https://index.docker.io/v1/Labels:Experimental: falseInsecure Registries: 127.0.0.0/8Live Restore Enabled: false # 不打開,重啟docker會導致已經在運行的docker不會重新啟動。打開后,重啟docker經在運行的docker重新啟動,不用在手動啟動? ?2.4 配置鏡像加速,方便下載鏡像
? ?通過這個網站,生成一個鏡像私有的鏈接
? ?阿里云Docker-hub
? ?https://cr.console.aliyun.com/cn-hangzhou/mirrors
systemctl daemon-reload
systemctl restart docker
?? ? ??? ? ?
或者:
vim ? /etc/docker/daemon.json
?? ?{
?? ??? ? "registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"]
?? ?}?? ?
3. Docker體系結構
DOCKER_HOST 服務端??Docker_deamon 引擎 。 Containers 維護、管理客戶端。??Images 鏡像端,本地的鏡像存放位置,鏡像倉庫
clinet 客戶端???建立、上傳、運行
Registry 存放 Images,官方的dockerhub。提供:1、用戶驗證功能,有一些鏡像是私有的,需要用戶名密碼、授權。
2、所有鏡像索引,快速查找鏡像。3、鏡像存儲
所以正常的流程為:從Registry 把Nginx???pull下載到DOCKER_HOST本地images,在y運行成 Containers容器,提供給clinet nginx?
將來要實現秒級恢復鏡像,需要把鏡像pull 到本地。
主要運維管理是鏡像、容器、倉庫
1、容器的啟動
2、pull 想要的鏡像
3、制作鏡像
4、容器管理命令、開啟關閉監控
5、要一致跟新本地倉庫,提前準備好傳到私有倉庫,局域網調用
6、一但docker服務端down ,所有的都銷毀了,所以需要做高可用、自愈等等
7、架構,多臺主機,云
4. Docker的鏡像基礎管理
?? 4.1 ?獲取鏡像
? ? 基礎鏡像拉取
? ?? [root@localhost ~]# docker search centos????搜索列出鏡像
?????[root@localhost ~]# docker pull centos:6.9???拉取鏡像
?????[root@localhost ~]# docker pull centos:7.5.1804
?????[root@localhost ~]# docker pull nginx? ? ? ? ? 不加版本號下載最新版
?????[root@localhost ~]# docker pull alpine:3.6?
? ?4.2 鏡像基本查看????
[root@docekr docker]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest ea335eea17ab 6 days ago 141MB centos 6.9 2199b8eb8390 2 years ago 195MB centos 7.5.1804 cf49811e3cdb 2 years ago 200MB alpine 3.6 43773d1dba76 2 years ago 4.03MB? ? 標識鏡像唯一性的方法:
? ? 1、 REPOSITORY??倉庫名字,一般 centos 這種是官方的
? ? 2、 TAG 鏡像版本
? ? 3、 REPOSITORY:TAG? ? 例如:centos:7.5.1804?
? ? 4、?IMAGE ID? ?鏡像唯一標識,(由sha256算法獲得數值,sha256算法默認輸出64位的號碼,?這里未顯示完全,只截取12位),通過 docker image ls --no-trunc ,查看全部64位
? ? 4.3 鏡像詳細信息查看
查看的必須是已經下載到本地的鏡像 [root@docekr docker]# docker image ls |grep centos centos 6.9 2199b8eb8390 2 years ago 195MB centos 7.5.1804 cf49811e3cdb 2 years ago 200MB查看inspect的幫助 [root@localhost ~]# docker image inspect --\helpUsage:?? ?docker image inspect [OPTIONS] IMAGE [IMAGE...]Display detailed information on one or more imagesOptions:-f, --format string ? Format the output using the given Go template如何使用inspect [root@docekr docker]# docker image inspect centos:latest 或者 [root@docekr docker]# docker image inspect 2199b8eb8390 [{"Id": "sha256:2199b8eb8390197d175b1dd57ed79f53ed92ffa58e23826ada54113262237e56","RepoTags": ["centos:6.9"],"RepoDigests": ["centos@sha256:6fff0a9edc920968351eb357c5b84016000fec6956e6d745f695e5a34f18ecd2"],"Parent": "","Comment": "","Created": "2019-03-14T21:22:46.023197937Z","Container": "d3e1bd47b7bc5704e90893c57f35b4b446adc24229e93cec053e5dbddfbd56ce","ContainerConfig": {"Hostname": "d3e1bd47b7bc","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/sh","-c","#(nop) ","CMD [\"/bin/bash\"]"],"ArgsEscaped": true,"Image": "sha256:2949d2914bc8bcf330ffdea46d30b8798fe9be92c6bfdca14ffb8b3ed4a9afc9","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"build-date": "20170406","license": "GPLv2","name": "CentOS Base Image","vendor": "CentOS"}},"DockerVersion": "18.06.1-ce","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"],"ArgsEscaped": true,"Image": "sha256:2949d2914bc8bcf330ffdea46d30b8798fe9be92c6bfdca14ffb8b3ed4a9afc9","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"build-date": "20170406","license": "GPLv2","name": "CentOS Base Image","vendor": "CentOS"}},"Architecture": "amd64","Os": "linux","Size": 194752565,"VirtualSize": 194752565,"GraphDriver": {"Data": {"MergedDir": "/var/lib/docker/overlay2/91496c836a1f8000af7d7a870e341d0079ae5217c9e8a2c2a18dc6a1bcce86f0/merged","UpperDir": "/var/lib/docker/overlay2/91496c836a1f8000af7d7a870e341d0079ae5217c9e8a2c2a18dc6a1bcce86f0/diff","WorkDir": "/var/lib/docker/overlay2/91496c836a1f8000af7d7a870e341d0079ae5217c9e8a2c2a18dc6a1bcce86f0/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:aaa5621d7c0157cae5916c9cca66dd8fc2fb4bdb74813ed463b73d5b58cccfdf"]},"Metadata": {"LastTagTime": "0001-01-01T00:00:00Z"}} ]? ?4.4 只查看鏡像ID
[root@docekr docker]# docker image ls -q ea335eea17ab 2199b8eb8390 cf49811e3cdb 43773d1dba76? ?4.5 刪除鏡像:
刪除指定的鏡像: [root@docker ~]#?docker image rm?IMAGE ID或者REPOSITORY:TAG,其中image rm 可以寫成rmi 例如: [root@docekr docker]# docker image ls |grep centos centos 6.9 2199b8eb8390 2 years ago 195MB centos 7.5.1804 cf49811e3cdb 2 years ago 200MB [root@docker ~]#?docker image rm?centos:6.9 [root@docker ~]#?docker rmi?centos:6.9 或者 [root@docker ~]#?docker image rm?2199b8eb8390 [root@docker ~]#?docker rmi?2199b8eb8390遇到問題:must be forced 必須要強制,有依賴。-f 刪除+依賴? [root@docker ~]#?docker image rm -f IMAGE ID或者REPOSITORY:TAG 例如: [root@docker ~]#?docker image rm -f?centos:6.9?刪除所有本地的鏡像,上述講述docker image ls -q 只查看鏡像ID [root@docker ~]# docker image rm `docker image ls -q`? ?4.6 鏡像的導入和導出
? ? 場景:局域網電腦,不能上網,只能從鏡像服務器上下載?
打包導出成文件: docker image save ?IMAGE ID > 文件名 或者 docker image save REPOSITORY:TAG > 文件名例子: root@docekr ~]# docker image ls |greo nginx REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest ea335eea17ab 6 days ago 141MB [root@docekr ~]# docker image save ea335eea17ab >/root/nginxlatest2.tar [root@docekr ~]# ll /root/nginx_latest.tar -rw-r--r-- 1 root root 145916416 Nov 23 22:02 /root/nginx_latest.tar導入打包的鏡像: ? docker image load -i 文件例子: [root@docekr ~]# docker rmi ea335eea17ab [root@docekr ~]# docker image load -i /root/nginx_latest.tar e1bbcf243d0e: Loading layer [==================================================>] 83.88MB/83.88MB 37380c5830fe: Loading layer [==================================================>] 61.99MB/61.99MB ff4c72779430: Loading layer [==================================================>] 3.072kB/3.072kB 49eeddd2150f: Loading layer [==================================================>] 4.096kB/4.096kB 1e8ad06c81b6: Loading layer [==================================================>] 3.584kB/3.584kB 8525cde30b22: Loading layer [==================================================>] 7.168kB/7.168kB Loaded image ID: sha256:ea335eea17ab984571cd4a3bcf90a0413773b559c75ef4cda07d0ce952b00291[root@docekr ~]# docker image ls 此時會出現一個問題,沒有標簽名字,只能重新設置標簽:手工鏡像打標簽 REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> ea335eea17ab 6 days ago 141MB centos 7.5.1804 cf49811e3cdb 2 years ago 200MB alpine 3.6 43773d1dba76 2 years ago 4.03MB[root@docekr ~]# docker image tag ea335eea17ab nginx:latest [root@docekr ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest ea335eea17ab 6 days ago 141MB centos 7.5.1804 cf49811e3cdb 2 years ago 200MB alpine 3.6 43773d1dba76 2 years ago 4.03MB問題:如果鏡像很大,分發慢---docker filter鏡像打包跟導入,還有一套命令: 打包:docker import 導入:docker export 注意:這兩套命令不能交叉使用,否則導入后,報錯open /var/lib/docker/tmp/docker-import-500852078/repositories: no such file or directory 兩套命令的區別: save命令會將鏡像完整保存,包括歷史版本和元數據信息,所以文件可能比較大 確切的說,export其實是容器的保存,只把鏡像當前的狀態保存下來,沒有歷史版本等信息,所有文件比較小5. 容器的管理??
? ? ?5.1 運行第一個容器 run
? ? ? ? 5.1.1 交互式的容器: ?
? ? ? ? ?交互式啟動,自動登錄后,此時的shell界面不能退出或者不能退出容器,否則容器停止,可以后期做dockerfile驗證,搭配--rm鏡像名稱
交互式啟動: docker container run -it (+自己起名字或者不加是隨機名字,名字后期管理用) IMAGE ID ?或者?REPOSITORY:TAGi交互,t(tty)開一個終端。每開一個窗口就會開啟一個tty,回車后容器創建啟動進入容器,并且登錄。實現隔離自動登陸. [root@docekr ~]# docker image ls |grep centos centos 6.9 2199b8eb8390 2 years ago 195MB[root@docekr ~]# docker container run -it 2199b8eb8390 [root@f09f9d4712e8 /]# 查看容器狀態 [root@docekr ~]# docker container ps 或者 docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f09f9d4712e8 2199b8eb8390 "/bin/bash" 20 seconds ago Up 19 seconds reverent_mccarthy? ? 參數: CONTAINER ID ? ? ? ? 容器的唯一號碼(自動生成的)。唯一代表容器的 ID。做容器管理,刪除停掉啟動重啟都要依賴這個ID 或者 NAMES IMAGE ? ? ? ? ? ? ? 通過什么鏡像 COMMAND ? ? ? ? ? ? 啟動容器,運行的第一個命令,交互鏈接shell窗口 CREATED ? ? ? ? ? ? ?已經創建后的時間 STATUS ? ? ? ? ? ? ? 容器的運行狀態 ?( Exited 未啟動, Up 啟動) PORTS? 容器宿主機的端口映射 NAMES ? ? ? ? ? ? ? ?容器的名字(可以自動,也可以手工指定)。不能重名注意:交互式啟動,自動登錄后,此時的shell界面不能退出或者不能退出容器,否則容器停止,方便后期做dockerfile驗證 [root@docekr ~]# docker container run -it 2199b8eb8390 [root@f09f9d4712e8 /]# exit [root@docekr ~]# [root@docekr ~]# docker container ps -a 通過 ps -a 查看全部 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f09f9d4712e8 2199b8eb8390 "/bin/bash" 17 minutes ago Exited (130) 7 minutes ago reverent_mccarthy? ? 指定容器名啟動:
[root@docekr ~]# docker container run -it --name="test_cent7.6" 2199b8eb8390 [root@c43486c07b32 /]# [root@docekr ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c43486c07b32 2199b8eb8390 "/bin/bash" 5 seconds ago Up 5 seconds test_cent7.6? ? ? 5.1.2 守護式容器啟動:
? ? ? 交互式的容器退出后容器消亡,想要維護測試功能的時候用。而守護式容器,只要不停止docker,就一直啟動
守護式容器啟動:在交互的基礎上,添加 -d 參數。 [root@docekr ~]# docker image ls |grep nginx REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest ea335eea17ab 6 days ago 141MB nginx 1.14 295c7be07902 2 years ago 109MB注意:name不能其帶: [root@docekr ~]# docker run -d --name="testnginx:1.14" 295c7be07902 docker: Error response from daemon: Invalid container name (testnginx:1.14), only [a-zA-Z0-9][a-zA-Z0-9_.-] are allowed. See 'docker run --help'例子: [root@docekr ~]# docker run -d --name="test_nginx_1.14" 295c7be07902 或者 [root@docekr ~]# docker run -d --name="test_nginx_1.14" nginx:1.14 37ce57bc91e43d6edaf20946a6146f56aed419d03edbb83a5d21533536458303 [root@docekr ~]#[root@docekr ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37ce57bc91e4 295c7be07902 "nginx -g 'daemon of鈥 About a minute ago Up About a minute 80/tcp test_nginx_1.14如何進入容器:(后續會詳細講解) [root@docekr ~]# docker exec -ti 37ce57bc91e4 bash root@37ce57bc91e4:/#注意事項:在后文(交互容器,如何退出后繼續在后臺執行)詳細講解
例如nginx這種,守護式容器啟動,使用run -d 就可以。 例如Centos這種,守護式容器啟動,使用run -itd? 這里由一個知識點,如果在創建容器過程中,本地沒有nginx:1.14鏡像,在運行docker run -d --name="test_nginx_1.14" nginx:1.14 后,會自動從網絡中pull nginx:1.14,在docker run -d --name="test_nginx_1.14" nginx:1.14? ?查看容器的網關、IP信息
[root@docekr ~]# docker container inspect test_nginx_1.14"Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16,注意:由于是nginx的鏡像,此時外部機器訪問不了nginx ,只能宿主機能范訪問nginx 宿主機訪問: [root@docekr ~]# curl 172.17.0.2:80 <!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>? ?如何刪除容器:
? ? ? 方法一:手工刪除
[root@docekr ~]# docker container ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37ce57bc91e4 295c7be07902 "nginx -g 'daemon of鈥 19 minutes ago Up 19 minutes 80/tcp test_nginx_1.14 f09f9d4712e8 2199b8eb8390 "/bin/bash" 51 minutes ago Exited (130) 42 minutes ago reverent_mccarthy[root@docekr ~]# docker container rm f09f9d4712e8 f09f9d4712e8 [root@docekr ~]# docker container ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37ce57bc91e4 295c7be07902 "nginx -g 'daemon of鈥 20 minutes ago Up 20 minutes 80/tcp test_nginx_1.14注意:在運行的容器不能刪除,除非 -f 強制刪除 [root@docekr ~]# docker container rm 37ce57bc91e4 Error response from daemon: You cannot remove a running container 37ce57bc91e43d6edaf20946a6146f56aed419d03edbb83a5d21533536458303. Stop the container before attempting removal or force remove[root@docekr ~]# docker rm -f 37ce57bc91e4 37ce57bc91e4???? ?方法二:交互式創建容器,退出容器后,容器停止,加上--rm鏡像名稱參數后,自動刪除容器
使用 docker container run -it --name="" ?--rm 鏡像名稱[root@docekr ~]# docker image ls |gere ningx REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest ea335eea17ab 6 days ago 141MB nginx 1.14 295c7be07902 2 years ago 109MB[root@docekr ~]# docker container run -it --name="oldguo_cent76" --rm 295c7be07902 回車后,就會卡住重啟一個shell輸入docker container ps,發現oldguo_cent76在啟動 [root@docekr ~]# docker container ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f682bd703b5f 295c7be07902 "nginx -g 'daemon of鈥 17 seconds ago Up 16 seconds 80/tcp oldguo_cent76在卡住的界面中,ctrl+c 后就會退出 [root@docekr ~]# docker container run -it --name="oldguo_cent76" --rm 295c7be07902^C[root@docekr ~]# 在查看docker container ps -a 沒有剛才的容器 [root@docekr ~]# docker container ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES[root@docekr ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest ea335eea17ab 6 days ago 141MB nginx 1.14 295c7be07902 2 years ago 109M? ? ?5.1.3 容器的應用場景
? ? ? ?交互式的容器: 工具類: 開發,測試,臨時性的任務()
? ? ? ?[root@docker ~]# docker container run -it --name="oldguo_cent76" ?--rm 9f38484d220f
? ? ? ?守護式容器: 跑網絡服務 ?ssh(管理自己的docker) ?nginx tomcat ? ???
? ? ?5.1.4? 容器端口的轉發? ??
? ? ? 守護式容器,跑nginx tomcat業務,除了宿主機,其他機器無法訪問容器的端口。如何實現外部機器訪問nginx,做端口轉發。
容器內部的80端口映射到宿主機的8080 <==> 外部機器訪問宿主機的8080,通過iptables轉給容器,訪問容器的80端口,注意宿主機的8080端口不要被占用,如果占用,可以使用其他的端口[root@docker /]# docker run -d -p 8080:80 --name="oldguo_nginx_80" nginx:1.14[root@docekr ~]# ip addr |grep ens33 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000inet 10.4.7.7/24 brd 10.4.7.255 scope global noprefixroute ens33[root@docekr ~]# curl 10.4.7.7:8080 <!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>[root@docekr ~]# docker container ps -a 內部的tcp 80端口映射到本地的任何地址的8080 通過iptables CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 893203b76bac nginx:1.14 "nginx -g 'daemon of鈥 36 minutes ago Up 36 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp oldguo_nginx_8? ? ?5.1.5 容器的啟動\關閉
? ? ? ?守護式容器的關閉和啟動
[root@docker /]# docker container stop oldguo_nginx_80 [root@docker /]# docker container start oldguo_nginx_80? ? ? 交互式的容器的關閉和啟動
[root@docker /]# docker container stop nervous_allen [root@docker /]# docker container start -i nervous_allen 通過這種形式的啟動后,把交互式的容器,改成守護式,一再在掛在中,但是如何進入容器,退出還是會停止容器。? ? ?停止所有docker
? ? ?腳本:docker container stop?`docker container ls -a |awk '{print $1}' |awk 'NR>1'`
? ? ?命令:docker container stop?`docker container ls -a -q`
?????注銷所有docker
?????腳本:docker container rm `docker container ls -a |awk '{print $1}' |awk 'NR>1'`
? ? ?命令:docker container rm `docker container ls -a -q`
? ? 5.1.6?容器的連接:
? ? ?比如不管是交互還是守護,在運行的容器中,如何進入容器:??
? ? ? ? 方法一:attach 把后臺運行的程序,鏡像鏈接出前臺來
? ? ? ? ?方法二:推薦主推方式
子進程的方式登錄(在已有工作容器中生成子進程,做登錄(相當于我自己開啟了一個/bin/bash,其他在登錄有開啟一個/bin/bash).可以用于進行容器的調試,退出時也不會影響到當前容器) ?/bin/bash不會隔離,只是窗口 [root@docker ~]# docker container exec -it nervous_allen /bin/bash注意:啟動某些鏡像的時候,比如centos ,最后可以不接/bin/bash,? docker container run -it centos啟動nginx這些鏡像的時候,最后需要接/bin/bash, docker container run -it nginx /bin/bash有些制作商在鏡像中,已經給你寫好了,在啟動交互式容器后第一個執行的命令是什么,如果第一個是/bin/bash,可以不加。但是像nginx 這種,制作商沒寫好,所以加/bin/bash或者/bin/sh? ? ??交互容器,如何退出后繼續在后臺執行:
??????1. 在進入交互式容器后啟動/bin/bash,exit后/bin/bash就會退出,容器停止,通過ctrl + P +Q??把/bin/bash 一直丟到后臺夯住,然后在通過attach或者把exec -ti 把丟給后臺的/bin/bash進程在獲取到,重新進如容器
??????2. 在run容器后,一直讓/bin/bash死循環,不建議
docker container run -it --name="" 鏡像名 sleep 100000???只要保證sleep足夠大,就會一直夯住
??????3. 讓容器中的一個程序一直運行,比如讓nginx程序一直在運行(這里的一直運行代表是,啟動后類似tail -f 卡住,叫一直運行),這樣容器就不會宕,而這個nginx進程不能在后臺(后臺:也就是容器先啟動/bin/bash,nginx雖然一直運行,但是進程是/bin/bash的shell中啟動),如果/bin/bash掛了,nginx也是宕的。實現不了容器一直存在,所以要把nginx進程放在前臺,夯在前臺(前臺:容器啟動的第一個程序,叫做前臺。而第一個進程是一切的開始,所以程序默認不會讓這個進程宕掉,所以依賴這個機制,實現一直掛載)? 。
制作守護式容器:
1、nginx 類型鏡像啟動容器后,制作鏡像的人,默認讓此鏡像第一個命令是nginx -g 'daemon off;'? ?這個就是夯住進程。驗證測試:docker container run nginx鏡像名,回車后當前界面的shell立即卡住,代表夯住。通過docker container ps 查看此容器,command第一個進程是nginx -g 'daemon off;' ")。所以制作nginx守護式容器:?docker container run -d nginx鏡像名? ? ?,-d 后臺一直運行
[root@docekr ~]# docker container run --name="ceshi_nginx" 295c7be07902[root@docekr ~]# docker container ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7a9495f275eb 295c7be07902 "nginx -g 'daemon off;'" 10 seconds ago Up 8 seconds 80/tcp ceshi_nginx2、centos 類型鏡像,他們的第一個命令是/bin/bash,可以通過docker container run centos鏡像名,docker container ps 查看此容器。但是運行?docker container run -d centos鏡像名? ,通過docker container ps 查看此容器立馬宕掉,因為第一個命令是/bin/bash,他不是一直運行,一直運行是卡住。為了解決這種情況,需要加-it 參數,通過參數開啟交互、開一個終端。讓后在把這個中終端,通過-d? 后臺一直運行。所以制作centos守護式容器:?docker container run -itd centos鏡像名? ?
???5.2 docker容器的網絡訪問詳解
? ? ?docker 默認網絡環境原理:宿主機開啟docker 0 (相當于端口轉發/nat模式)的網卡,宿主機通過docker 0與所有的docker容器鏈接,默認docker 0 IP是172.17.0.1、容器IP是172.17.0.%。容器上網的也是,docker 容器通過docker 0 ,在接入到宿主機網卡上網。同一臺宿主機所有容器都是可以互相通信的。
? ? ?docker容器的兩種端口地址映射:指定映射、?隨機映射
? ?? 原理:(docker 會自動添加一條iptables規則來實現容器內部跟宿主機之間的端口映射)
? ? ?隨機映射:
? ? ?docker run -P 端口
用-P(大寫)標記時,docker會隨機選擇一個端口映射到容器內部開放的網絡端口上。docker run -P 端口 使用-p(小寫)標記時則可以指定要映射的端口,并且在一個指定端口上只可以綁定一個容器,支持的格式有: ip:hostport:containerport ip::containerport hostport:containerport例子: [root@docker ~]# docker container run -d -p 80 --name='n5' nginx:1.14 ?意思是隨機分配一個宿主機的端口號跟容器的80端口地址映射,docker container ps 查看[root@docekr ~]# docker container ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2bab757be50b nginx:1.14 "nginx -g 'daemon off About a minute ago Up About a minute 0.0.0.0:49153->80/tcp, :::49153->80/tcp n5[root@docekr ~]# curl 127.0.0.1:49153 <!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> [root@docekr ~]# ?例子2: [root@docker ~]# docker container run -d -p 10.4.7.7::80 --name='n6' nginx:1.14 ? ? 隨機映射,把宿主機的這個容器80端口跟宿主機通信的隨機端口做綁定。目前IP只能跟宿主機,跟其他的報錯,不知道如何用應用場景:宿主機IP:端口號:容器端口號
實驗對象: 宿主機的IP:10.4.7.7 另一個機器IP:10.4.7.8另一個機器IP:物理機端口:容器端口,這種形式會報錯,所以根本用不了這樣。 [root@docekr ~]# docker run -it -d -p 10.4.7.8:8084:80 295c7be07902 6ffcd62eb2e3b7481845e6fc2a72cd0d8c3ac789ea5cee79416778b16fd0f02c docker: Error response from daemon: driver failed programming external connectivity on endpoint festive_chaum (477f2371e937f606d0b0643715ad362bfb6113f2df73effa9589aa8537d68406): Error starting userland proxy: listen tcp4 10.4.7.8:8084: bind: cannot assign requested address.那這個到底有何用處: 這臺宿主機機器有多個網卡:10.4.7.7 、10.4.7.9.這時候我們啟動多個nginx容器,他們都是80,這個時候,就可以 -p 10.4.7.7:80:容器1的80 -p 10.4.7.9:80:容器1的80。指定映射:
? ? -p 宿主機端口:容器端口
? ? -p 宿主機ip:宿主機端口:容器端口
? ? -p 宿主機ip::容器端口(隨機端口:32768-60999)
? ? -p 宿主機端口:容器端口/udp ? ?選擇 tcp 或者udp
? ? -p 81:80 –p 443:443 ? ?多端口映射
?多端口映射:
[root@docker ~]# docker container run -d -p 81:80 –p 443:443 ?--name='n6' nginx:1.14 ?多端口映射 CONTAINER ID ??IMAGE? ? COMMAND? ??CREATED? ? ?STATUS ?? PORTS? ? ?NAMES 45defc5f8660 ??nginx:1.14 ?"nginx -g 'daemon of…" ?6 seconds ago ??Up 4 seconds ?80/tcp, 0.0.0.0:8085->23/tcp,? ? ?0.0.0.0:8083->56/tcp ???oldguo8012?-p 后面不接tcp/udp,默認使用TCP的協議,比如-p 8080:80。如果要進行UDP協議轉發,如DNS,需要加上UDP
[root@docker ~]# docker container run -d -p 81:80 –p 443:443/udp ?--name='n6' nginx:1.14 ?選擇 tcp 或者udp-p 就是做了iptables,把外部機器訪問容器的流量,引入到容器中。所以如果不做-p,可以通過自己添加iptables,做兩跳的路由轉發一樣可以實現。
?? 5.3 容器的其他管理
查看目前所有的容器ID: ? docker ps -a ?-q ? 等價于: ?docker container ls -a -q找到容器最新的啟動時間 -l : docker ps -a -q -l ??? ?外部調試工具:top
場景:并不是每個docker都可以允許讓你登錄,但是還想知道容器的狀態,就需要使用外部docker命令.查看容器的top: docker ?top ?容器的ID例子:[root@docekr ~]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 452f295a0ef2 295c7be07902 "nginx -g 'daemon off 2 hours ago Up 2 hours 10.4.7.7:8084->80/tcp epic_herschel[root@docekr ~]# docker container top 452f295a0ef2 UID PID PPID C STIME TTY TIME CMD root 3840 3822 0 11:4 pts/0 00:00:00 nginx: master process nginx -g daemon off; 101 3866 3840 0 11:4 pts/0 00:00:00 nginx: worker process?查看容器內部的日志:
1、查看容器日志: docker container logs 容器ID[root@docekr ~]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 452f295a0ef2 295c7be07902 "nginx -g 'daemon of鈥 2 hours ago Up 2 hours 10.4.7.7:8084->80/tcp epic_herschel[root@docekr ~]# docker container logs 452f295a0ef2 10.4.7.7 - - [24/Nov/2021:14:09:35 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-" 10.4.7.1 - - [24/Nov/2021:14:09:43 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" "-" 2021/11/24 14:09:43 [error] 7#7: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.4.7.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "10.4.7.7:8084", referrer: "http://10.4.7.7:8084/" 10.4.7.1 - - [24/Nov/2021:14:09:43 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://10.4.7.7:8084/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" "-" [root@docekr ~]# 2、查看容器日志,并顯示時間方面等:docker container logs -t 容器ID 3、實施動態監控,跟 tail -f 一個功能:docker logs -f 容器ID 4、顯示最后10行,動態監控查看容器日志,并顯示時間等方面:docker logs -tf ?--tail 10 容器ID? 針對大量容器,大量日志,通過架構,容器化集群,日志怎么看很多 ? ?→ ?elk、efk 等
? 中心化 :數據中心 idc物理服務器搭建
? 云化 ?: ?去中心化 ,云計算?
? 容器內部命令CP:
需求1:已經啟動了nginx容器,如何把編寫好的index.html替換到容器/usr/share/nginx/html/下 使用方案:docker container cp 文件 容器的名字:容器的路徑[root@docekr ~]# docker run -d -p 8085:80 --name="testnginx" 295c7be07902 [root@docekr ~]# curl 127.0.0.1:8085 <!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> ..... </html>[root@docekr ~]# echo "nihao" > index.html [root@docekr ~]# docker container cp index.html testnginx:/usr/share/nginx/html/ [root@docekr ~]# curl 127.0.0.1:8085 nihoa [root@docekr ~]# 需求2:已經啟動了nginx容器,如何把容器的文件下載到本地[root@docekr ~]# docker container cp testnginx:/usr/share/nginx/html/50x.html ./ [root@docekr ~]# ll 50x.html -rw-r--r-- 1 root root 537 Dec 4 2018 50x.html [root@docekr ~]# 思考:如果每次運行完容器后,都需要手動拷貝文件到容器中,還是很麻煩,或者以后如果修index.html,還得繼續cp一次。簡化操作步驟,直接讓docker中的容器,調用的是本地的index,html,這樣實現本地修改,直接關聯容器。設置數據卷。? 5.4 docker的數據卷實現持久化存儲
? ?5.4.1?手工交互數據:
[root@docker opt]# docker container cp index.html n1:/usr/share/nginx/html/ [root@docker opt]# docker container cp n1:/usr/share/nginx/html/50x.html ./? ?5.4.2 Volume實現宿主機和容器的數據共享
? ?把容器/usr/share/nginx/html 目錄映射到本地 /opt/html
[root@docker opt]# mkdir -p /opt/html [root@docker ~]# docker run -d --name="nginx_3" -p 83:80 -v /opt/html:/usr/share/nginx/html nginx:1.14注意:如果容器沒有/usr/share/nginx/html會自動創建 作用: 容器數據持久化存儲。把容器中重要的目錄或者文件,進行數據持久化,就算容器被刪除,本地磁盤數據不會刪除。比如nginx容器主要是conf跟html ,做成數據卷就算掛了,也沒事。? ? 5.4.3 共享資源數據卷實現負載均衡
例子:? 啟動兩個nginx容器,分別掛在到宿主機90、91端口,共同掛載一個數據卷,實現靜態資源共享,nginx做宿主機90、91端口輪詢,實現負載均衡
[root@localhost html]#docker run -d --name="nginx_90" -p 90:80 -v /opt/html:/usr/share/nginx/html nginx:1.14 [root@localhost html]#docker run -d --name="nginx_91" -p 91:80 -v /opt/html:/usr/share/nginx/html nginx:1.14查看容器數據卷掛在路徑:
?docker container inspect nginx_91"Mounts": [{"Type": "bind","Source": "/opt/html","Destination": "/usr/share/nginx/html","Mode": "","RW": true,"Propagation": "rprivate"}],? ?? 5.3.4?集中化管理數據卷容器:??
? 實現效果:比如這類容器,要掛載100個路徑,而這種類型的容器還要啟動100多個。創建第一個容器,需要寫很長的 -v ,而在創建后續的容器,還的繼續寫這么長,無疑是增加了工作量。如果第一個容器建立完成之后,其他的容器在此模板上創建,是不是就會簡化-v 的內容。
1、先創建第一個數據卷容器 docker run -it ?--name "nginx_test_volumes" -v /opt/Volume/a:/opt/a ?-v /opt/Volume/b:/opt/b centos:6.9 /bin/bash ,通過ctrl + p +? q?后臺運行2、創建其他的容器 ,?調用第一個數據卷容器 --volumes-from 作為模板。 docker run -d ?-p 8085:80 --volumes-from ?nginx_test_volumes --name "n8085" ?nginx docker run -d ?-p 8086:80 --volumes-from ?nginx_test_volumes --name "n8086" ?nginx 作用: ?在集中管理集群中,大批量的容器都需要掛載相同的多個數據卷時,可以采用數卷容器進行統一管理?5.5 制作本地局域網yum源
? 1. 安裝vsftpd軟件
? [root@docker ~]# yum install -y vsftpd
? 2. 啟動ftp?
?[root@docker ~]# systemctl enable vsftpd
?[root@docker ~]# systemctl start vsftpd
?3. 上傳系統鏡像進行到虛擬機
?cd /mnt
?rz CentOS-6.9-x86_64-bin-DVD1.iso
?rz CentOS-7.5-x86_64-bin-DVD1.iso
?配置yum倉庫
?mkdir -p /var/ftp/centos6.9?
?mkdir -p /var/ftp/centos7.5
?鏡像掛在到一個目錄上去
?[root@docker mnt]# mount -o loop /mnt/CentOS-6.9-x86_64-bin-DVD1.iso ?/var/ftp/centos6.9/
?[root@docker mnt]# mount -o loop /mnt/CentOS-7.5-x86_64-bin-DVD1.iso ?/var/ftp/centos7.5/
?windows驗證
?ftp://192.168.78.4/centos6.9/
優化yum源
cat >/etc/yum.repos.d/ftp_6.repo <<EOF?
[ftp]
name=ftpbase
baseurl=ftp://192.168.78.4/centos6.9
enabled=1
gpgcheck=0
EOF
cat >/etc/yum.repos.d/ftp_7.repo <<EOF?
[ftp]
name=ftpbase
baseurl=ftp://192.168.78.4/centos7.5
enabled=1
gpgcheck=0
EOF
?
總結
以上是生活随笔為你收集整理的Docker 介绍、安装、基础搭建 --01的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《高级计算机网络》之移动自组网——大连理
- 下一篇: LVS配合piranha安装使用