Docker 容器 ----介绍安装基本命令
Docker—入門詳解、部署、鏡像加速、基本命令
文章目錄
- Docker---入門詳解、部署、鏡像加速、基本命令
- 前言
- 一:DOCKER理論
- 1.1:什么是docker?有什么作用?
- 1.2:Docker的使用場景
- 1.3: Docker的優(yōu)勢
- 1.4:Docker引擎(Docker Engine)
- 1.5:Docker的架構(Docker architecture)
- 1.6:容器與虛擬機的區(qū)別
- 1.7 : Docker的核心概念
- 二: Docker安裝與優(yōu)化
- 三: Docker基本操作
- 3.1: Docker鏡像常用命令
- 3.2: Docker容器常用命令
前言
- Docker自2013年爆紅以來,一直獨領風騷,以下是我整理的一些Docker基礎理論,個人感覺這些是以后玩Docker,K8S等的敲門磚,很基礎,很重要!
一:DOCKER理論
1.1:什么是docker?有什么作用?
- Docker是一個用于開發(fā),交付和運行應用程序的開放平臺。Docker使您能夠?qū)贸绦蚺c基礎架構分開,從而可以快速交付軟件。
- 是一個開源的應用容器引擎,讓開發(fā)者可以打包大門的應用以及依賴包到一個可移植的鏡像中,然后發(fā)布到任何流行的Linux或者Windows機器上,也可以實現(xiàn)虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口
- 沙箱(Sandbox):在計算機安全領域,沙箱是一種程序的隔離運行機制
- Docker在2013年一炮而紅,直到現(xiàn)在,已經(jīng)成為容器技術的代名詞。
- Docker從一開始就以提供標準化的運行時環(huán)境為目標,真正做到“build once, run anywhere”,可以將同一個構建版本用于開發(fā)、測試、預發(fā)布、生產(chǎn)等任何環(huán)境,并且做到了與底層操作系統(tǒng)的解耦。在此基礎上還進一步發(fā)展出了CaaS(容器即服務)技術。
- Docker是通過進程虛擬化技術(namespaces及cgroups cpu、內(nèi)存、磁盤io等)來提供容器的資源隔離與安全保障等。由于Docker通過操作系統(tǒng)層的虛擬化實現(xiàn)隔離,所以Docker容器在運行時,不需要類似虛擬機(VM)額外的操作系統(tǒng)開銷,提高資源利用率。 namespace 資源隔離 cgroups 進程的資源限制 kvm 虛擬磁盤文件,資源隔離 kvm資源限制,–cpus --memory
- docker主要組件有:鏡像、容器、倉庫, 網(wǎng)絡,存儲
1.2:Docker的使用場景
- 打包應用程序簡單部署
- 可脫離底層硬件任意遷移(實現(xiàn)了應用的隔離,將應用拆分并進行解耦),例如:服務器從騰訊云遷移到阿里云
- 持續(xù)集成和持續(xù)交付(CI/CD):開發(fā)到測試發(fā)布
- 部署微服務
- 提供PAAS產(chǎn)品(平臺即服務){OpenStack的云主機類似于阿里云的ECS,屬于IAAS、Docker(K8S) 屬于PAAS}
1.3: Docker的優(yōu)勢
- 更快速的交付和部署
docker在整個開發(fā)周期都可以完美的輔助你實現(xiàn)快速交付。
docker允許開發(fā)者在裝有應用和服務本地容器開發(fā)。可以直接集成到可持續(xù)開發(fā)流程中
docker容器的啟動時間是秒級的,大量地節(jié)約了開發(fā)、測試、部署的時間
例如:開發(fā)者可以使用一個標準的鏡像來構建一套開發(fā)容器,開發(fā)完成之后,運維人員可以直接使用這個容器來部署代碼。
- 高效的部署和擴容
docker容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、pc、服務器。
這種兼容性可以讓用戶把一個應用程序從平臺直接遷移到另外一個
docker的兼容性和輕量型可以很輕松的實現(xiàn)負載的動態(tài)管理,可以快速擴容或者方便的下線應用和服務,趨近于實時
- 更高的資源利用率
docker對系統(tǒng)資源的利用率很高,一臺主機上可以同時運行數(shù)據(jù)個docker容器。容器除了運行其中應用外,基本不消耗額外的系統(tǒng)資源,使得應用的性能很高,同時系統(tǒng)的開銷盡量小。傳統(tǒng)虛擬機方式運行10個不同的應用就要10個虛擬機,而docker只需要啟動10個隔離的應用即可
- 更簡單的管理
使用docker,只需要小小的修改,就可以替代以往的大量的更新工作。所有的修改都以增量的方式被分發(fā)和更新,從而實現(xiàn)自動化并且高效的管理
1.4:Docker引擎(Docker Engine)
-
Docker Engine是具有以下主要組件的客戶端-服務器應用程序:
-
服務器是一種長期運行的程序,稱為守護程序進程( dockerd命令)。
-
REST API,它指定程序可以用來與守護程序進行通信并指示其操作的接口。
-
命令行界面(CLI)客戶端(docker命令)。
1.5:Docker的架構(Docker architecture)
-
Docker使用客戶端-服務器架構。Docker 客戶端與Docker 守護進程進行對話,該守護進程完成了構建,運行和分發(fā)Docker容器的繁重工作。
-
Docker區(qū)別于傳統(tǒng)的虛擬化,不需要虛擬硬件資源,直接使用容器引擎,所以速度快
-
Docker Client:客戶端
- Docker客戶端(docker)是許多Docker用戶與Docker交互的主要方式。當您使用諸如之類的命令時docker run,客戶端會將這些命令發(fā)送到dockerd,以執(zhí)行這些命令。該docker命令使用Docker API。Docker客戶端可以與多個守護程序通信。
-
Docker daemon:守護進程
- Docker守護程序(dockerd)偵聽Docker API請求并管理Docker對象,例如圖像,容器,網(wǎng)絡和卷。守護程序還可以與其他守護程序通信以管理Docker服務。
-
Docker images:鏡像
- 容器可以被打包成鏡像
-
Docker container:容器
-
Docker registry:鏡像倉庫
- 存儲鏡像的地方,默認在公共的Docker Hub上查找,可以搞個人倉庫。
1.6:容器與虛擬機的區(qū)別
-
linux容器技術,容器虛擬化和kvm虛擬化的區(qū)別 kvm虛擬化: 需要硬件的支持,需要模擬硬件,可以運行不同的操作系統(tǒng),啟動時間分鐘級(開機啟動流程)
-
linux開機啟動流程: bios開機硬件自檢 根據(jù)bios設置的優(yōu)先啟動項boot 網(wǎng)卡 硬盤 u盤 光驅(qū) 讀取mbr引導 2T UEFI(gpt分區(qū)) mbr硬盤分區(qū)信息,內(nèi)核加載路徑, 加載內(nèi)核 啟動第一個進程/sbin/init systemd 系統(tǒng)初始化完成 運行服務(nginx,httpd,mysql) 。。。
-
容器啟動流程: 共用宿主機內(nèi)核: 第一個進程直接啟動服務(nginx,httpd,mysql)
-
容器:共用宿主機內(nèi)核,輕量級,損耗少,啟動快,性能高,只能運行l(wèi)inux系統(tǒng)
-
虛擬機:需要硬件的支持,需要模擬硬件,需要走開機啟動流程,可以運行不同的操作系統(tǒng)
-
不同點containerVM 啟動速度 秒級 分鐘級 運行性能 接近原生(直接在內(nèi)核中運行) 5%左右損失 磁盤占用 MB GB 數(shù)量 成百上千 一般幾十臺 隔離性 進程級別 系統(tǒng)級別(更徹底) 操作系統(tǒng) 主要支持Linux 幾乎所有 封裝程度 只打包項目代碼和依賴關系,共享宿主機內(nèi)核 完整的操作系統(tǒng),與宿主機隔離
1.7 : Docker的核心概念
- image(鏡像)
docker鏡像就是一堆只讀層的統(tǒng)一視角(統(tǒng)一文件系統(tǒng)技術能夠?qū)⒉煌膶诱铣蔀橐粋€文件系統(tǒng),為這些層提供一個統(tǒng)一的視角,在用戶看來,只存在一個文件系統(tǒng))
例如:一個鏡像可以包含一個完整的操作系統(tǒng)環(huán)境,里面僅僅安裝了Apache或用戶需要的其他應用程序
鏡像可以用來創(chuàng)建docker容器,一個鏡像可以創(chuàng)建很多容器
docker提供了一個很簡單的機制來創(chuàng)建鏡像或者更新已有的鏡像,用戶也可以直接從其他人哪里下載一個已經(jīng)做好的鏡像來直接使用
- repository(倉庫)
倉庫是集中存放鏡像文件的場所。
有時候會把倉庫和倉庫注冊服務器當作同一含義。實際上倉庫注冊服務器存放著很多倉庫,每個倉庫之間又包含了多個鏡像,每個鏡像又有不同的標簽(tag)
倉庫分為公開倉庫(public)和私有倉庫(private)兩種形式。最大的公開倉庫的Docker Hub,存放了數(shù)量龐大的鏡像,提供用戶下載。國內(nèi)的公開倉庫包括時速云、網(wǎng)易云等,可以提供大陸用戶更穩(wěn)定快速的訪問。當然,用戶也可以在本地網(wǎng)絡內(nèi)創(chuàng)建一個私有倉庫
當用戶創(chuàng)建了自己的鏡像之后就可以使用push命令將鏡像上傳到公有或者私有倉庫中,這樣下次可以在另外一臺機器上使用這個鏡像時候,只需要從倉庫上pull下來就可以了
Docker倉庫概念和Git類似,注冊服務器可以理解為GItHub這樣的托管服務
- container(容器)
Docker利用容器(container)來運行應用。容器是從鏡像創(chuàng)建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。可以把容器看做是一個簡易版的Linux環(huán)境(包括root用戶權限、進程空間、用戶空間和網(wǎng)絡空間等)和運行在其中的應用程序
容器的定義和鏡像幾乎一樣,也是一堆層的統(tǒng)一視角,唯一的區(qū)別在于容器的最上面那一層是可讀寫的
一個運行當中的容器被定義為一個可讀寫的統(tǒng)一文件系統(tǒng)加上隔離的進程空間和包含其中的進程
而正是文件系統(tǒng)隔離技術使得docker成為了一個非常有潛力的虛擬化技術。一個容器中的進程可能會對文件進行修改、刪除、創(chuàng)建,這些改變都將作用于可讀寫層
二: Docker安裝與優(yōu)化
- #安裝docker與鏡像加速#!/bin/bash #安裝最新版Docker依賴環(huán)境 yum -y install yum-utils device-mapper-persistent-data lvm2 #關閉防火墻與核心防護 systemctl stop firewalld && systemctl disable firewalld setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config #網(wǎng)絡優(yōu)化 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p systemctl restart network #設置阿里云鏡像 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云鏡像加速 mkdir /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://ye71id**.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload #安裝Docker-Ce社區(qū)版 yum -y install docker-ce systemctl enable docker.service systemctl start docker.service if [ $? -eq 0 ];then echo "docker已安裝完成并優(yōu)化完畢" fi systemctl status docker.service#注釋 ##"registry-mirrors": ["https://ye71id**.mirror.aliyuncs.com"] 設置為自己的阿里云賬號加速器 ##yum-utils 提供了yum-config-manager ##device mapper 存儲驅(qū)動程序需要device-mapper-persistent-data和lvm2 ##device mapper 是Linux2.6內(nèi)核中支持邏輯卷管理的通用設備映射機制,它為了實現(xiàn)用于存儲資源管理的塊設備驅(qū)動提供了一個高度模塊化的內(nèi)核架構
三: Docker基本操作
3.1: Docker鏡像常用命令
-
docker version "查看docker版本"
-
docker search "搜索鏡像"
-
docker images "查看鏡像列表"
-
docker history "查看鏡像制作歷史"
-
docker inspect "查看鏡像底層信息"
-
docker pull "下載鏡像"
-
docker push "上傳鏡像"
-
docker rmi "刪除本地鏡像"
-
docker save "鏡像另存為tar包"
-
docker load "使用tar包導入鏡像"
-
docker tag "添加新鏡像名稱和標簽"
- #搜索,下載鏡像 [root@docker1 ~]# docker pull busybox [root@docker1 ~]# docker search nginx [root@docker1 ~]# docker pull nginx [root@docker1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 7e4d58f0e5f3 8 days ago 133MB busybox latest 6858809bf669 9 days ago 1.23MB //8 days ago 表示該鏡像是官網(wǎng)8天前更新的
- #添加新鏡像標簽
[root@docker1 ~]# docker tag nginx:latest nginx:web
[root@docker1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 8 days ago 133MB
nginx web 7e4d58f0e5f3 8 days ago 133MB
busybox latest 6858809bf669 9 days ago
[root@docker1 ~]# docker images|grep nginx
nginx latest 7e4d58f0e5f3 8 days ago 133MB
nginx web 7e4d58f0e5f3 8 days ago
只留下一個別名的鏡像才能用于刪id,刪除鏡像
#刪除鏡像;基于該鏡像的容器正在使用,不支持刪除 ;多個別名的鏡像也不支持用id刪除 [root@docker1 ~]# docker rmi nginx:web Untagged: nginx:web [root@docker1 ~]# docker images|grep nginx nginx latest 7e4d58f0e5f3 8 days ago [root@docker1 opt]# docker rmi nginx:latest Error response from daemon: conflict: unable to remove repository reference "nginx:latest" (must force) - container 0b77b208ed1c is using its referenced image 7e4d58f0e5f3 #批量刪除容器后再刪除鏡像 [root@docker1 opt]# docker ps -a | awk '{print "docker rm "$1}'|bash [root@docker1 opt]# docker rmi nginx Untagged: nginx:latest Untagged: nginx@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0 Deleted: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d Deleted: sha256:eedfd37abc0b05520a719addf6675b372687fe9a2ed1746fa988335720d4376c Deleted: sha256:4f052ddd517f6dc5b74d2f7d881838b8ec6a5e67ec7a1da8bbbe91e1e068ad3a Deleted: sha256:5f78154d356577280e4ac0d9bf0d021d488828e57f953b011dcbadaecd539ce4 Deleted: sha256:db5783668220e16186080f3e9d69ad748aab8c72abb8e457f6fc45369461634b Deleted: sha256:07cab433985205f29909739f511777a810f4a9aff486355b71308bb654cdc868 [root@docker1 opt]# docker images|grep nginx #刪除所有鏡像 docker image rm -f `docker image ls -q` #鏡像保存到當前目錄 [root@docker1 ~]# cd /opt [root@docker1 opt]# docker save -o nginx nginx:latest [root@docker1 opt]# ls -lh nginx -rw-------. 1 root root 131M 9月 19 07:52 nginx #從本地載入鏡像 [root@docker1 opt]# docker load < nginx 07cab4339852: Loading layer [==================================================>] 72.49MB/72.49MB f431d0917d41: Loading layer [==================================================>] 64.31MB/64.31MB 60c688e8765e: Loading layer [==================================================>] 3.072kB/3.072kB eabfa4cd2d12: Loading layer [==================================================>] 4.096kB/4.096kB 908cf8238301: Loading layer [==================================================>] 3.584kB/3.584kB Loaded image: nginx:latest [root@docker1 opt]# docker images|grep nginx nginx latest 7e4d58f0e5f3 8 days ago #上傳鏡像 "改標簽" docker tag nginx:latest abner/nginx:web "用戶名abner/倉庫名:鏡像名 "登陸" docker logion Username: docker password Email: xxx@xxx.com "上傳" docker push abner/nginx:web
3.2: Docker容器常用命令
-
docker create -it "創(chuàng)建容器;-i讓容器的標準輸入打開,-t讓docker分配一個偽終端"
-
docker run "運行容器"
-
docker ps "查看容器列表"
-
docker stop "關閉容器"
-
docker start id "啟動容器"
-
docker restart "重啟容器"
-
docker attach|exec "進入容器"
-
docker inpect "查看容器底層信息"
-
docker top "查看容器進程列表"
-
docker export id > nginx-am "保存容器到本地"
-
cat nginx-am|docker import - nginx:web "從本地導入容器
-
docker rm "刪除容器" "容器要先關閉,才能刪除;"
- #創(chuàng)建容器 [root@docker1 ~]# docker create -it nginx:latest /bin/bash 4f7d7bfc622c3e3ded410e1daee0b7c5e5c42d652bfa96f0bdeb23e4019257e8 #查看容器 [root@docker1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4f7d7bfc622c nginx:latest "/docker-entrypoint.…" 8 seconds ago Created goofy_kowalevski "狀態(tài)為Created"#啟動容器 [root@docker1 ~]# docker start 4f7d7bfc622c 4f7d7bfc622c [root@docker1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4f7d7bfc622c nginx:latest "/docker-entrypoint.…" 19 minutes ago Up 4 seconds 80/tcp goofy_kowalevski "狀態(tài)為Up" [root@docker1 ~]# ifconfig docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255inet6 fe80::42:8fff:feab:74ea prefixlen 64 scopeid 0x20<link>ether 02:42:8f:ab:74:ea txqueuelen 0 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 16 bytes 1994 (1.9 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 "docker0為docker的內(nèi)部網(wǎng)關" #啟動執(zhí)行命令查看系統(tǒng)根目錄 ##方法一 docker pull paigeeworld/centos7 docker create -it paigeword/centos7 /bin/bash docker start id ##方法二 docker run paigeworld/centos7 /user/bin/bash -c ls / "-c command 命令" "run完就直接釋放了,狀態(tài)為Exited" ##持續(xù)在后臺執(zhí)行 docker run paigeworld/centos7 /user/bin/bash -c "while true;do echo hello;done" #終止運行 docker stop id #啟動容器 docker start id #容器進入 docker start id "前提是容器UP狀態(tài)" docker exec -it id /bin/bash "exec進入" exit "離開容器" #容器導出 docker export id > nginx-am "名稱自定義" #容器導入 cat nginx-am|docker import - nginx:web #刪除容器 docker rm id #批量刪除容器 docker ps -a | awk '{print "docker rm "$1}'|bash
-
基于鏡像的容器在,就刪不掉鏡像,除非把容器刪掉,才能刪除鏡像
#創(chuàng)建交互式容器 docker container run -it id "i表示交互式 t表示開啟新的終端" #創(chuàng)建守護式容器 docker run -d --name="nginx" nginx:1.14 "-d 表示守護式 如果沒有這個鏡像會自動Pull 拉取命令#交互式的容器用于: 工具類: 開發(fā),測試,臨時性的任務() #守護式容器用于: 服務器上 網(wǎng)絡服務 #把容器的80端口映射到外部的8080端口提供外部訪問 docker container run -d -p 8080:80 --name="nginx" nginx:1.14 docker container run -d -p 10.0.0.100:8081:80 --name='n3' nginx:1.14 "映射到外部801" #演示 [root@docker1 ~]# docker container run -d -p 8080:80 nginx:latest 0c2c73225b4a573dd8c521a10f36e9bd91b75dd4fed01c5dc8e2ab372bc968e8 [root@docker1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0c2c73225b4a nginx:latest "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:8080->80/tcp naughty_euclid
總結
以上是生活随笔為你收集整理的Docker 容器 ----介绍安装基本命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 物业管理app软件开发功能
- 下一篇: cuckoo沙箱的搭建