什么是 docker 容器?
docker 容器是一種輕量級(jí)弄匕、可移植颅悉、自包含的軟件執(zhí)行環(huán)境。有文件系統(tǒng)迁匠、網(wǎng)絡(luò)配置和運(yùn)行庫(kù)剩瓶,可以在任何支持 docker 的平臺(tái)上運(yùn)行。與傳統(tǒng)虛擬化技術(shù)(如 virtualbox 或 vmware)不同城丧,在 docker 中創(chuàng)建的容器與宿主機(jī)共享同一個(gè)內(nèi)核延曙。這使得 docker 容器更加輕量級(jí)、快速啟動(dòng)和停止亡哄,更方便部署在云端或本地服務(wù)器上枝缔。
docker 容器的優(yōu)勢(shì)
- 環(huán)境一致性:使用 docker 容器可以確保應(yīng)用在不同環(huán)境下的一致性,避免了由于環(huán)境差異而導(dǎo)致的運(yùn)行問(wèn)題蚊惯。
- 輕量級(jí)高效:docker 容器相對(duì)于虛擬機(jī)來(lái)說(shuō)更加輕量級(jí)愿卸、占用資源更少,啟動(dòng)和停止也更快捷拣挪,適合于實(shí)現(xiàn)微服務(wù)架構(gòu)擦酌。
- 可移植性:docker 容器可以在不同的平臺(tái)、操作系統(tǒng)和云服務(wù)中進(jìn)行部署菠劝,非常適合實(shí)現(xiàn)跨云供應(yīng)商應(yīng)用部署赊舶。
- 安全性:docker 容器提供了多種安全特性,如 namespace 隔離赶诊、cgroup 限制等笼平,可以有效隔離容器間的進(jìn)程和資源,提高了應(yīng)用的安全性舔痪。
基本操作
Docker 容器使用一系列的命令來(lái)管理容器寓调,這些命令的結(jié)構(gòu)大致分為:
$ docker [OPTIONS] COMMAND [ARG...]
-
docker:
命令是操作 Docker 容器的入口。 -
OPTIONS:
選項(xiàng)用于修改命令的行為锄码,可以省略夺英。 -
COMMAND:
是具體的執(zhí)行命令,例如run
,start
,stop
,rm
等滋捶。 -
ARG:
是命令的參數(shù)痛悯。
例如,使用 docker container run
命令創(chuàng)建一個(gè)新容器時(shí)重窟,命令結(jié)構(gòu)為:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-
docker run
是常用來(lái)創(chuàng)建并啟動(dòng)一個(gè)新容器的命令载萌。 -
OPTIONS
可以包含一些配置信息,如-d
表示在后臺(tái)運(yùn)行,-p
表示映射端口等扭仁。 -
IMAGE
是指要用來(lái)創(chuàng)建容器的鏡像名稱(chēng)或 ID垮衷。 -
COMMAND
是在容器內(nèi)部要執(zhí)行的命令,可以省略乖坠。 -
ARG
是傳遞給COMMAND
的參數(shù)搀突,可以省略。
運(yùn)行狀態(tài)
- 運(yùn)行:進(jìn)程正常運(yùn)行
- 暫停:進(jìn)程暫停瓤帚,CPU不再運(yùn)行描姚,并不釋放內(nèi)存
- 停止:進(jìn)程終止,回收進(jìn)程占用的內(nèi)存戈次、CPU等資源
常用命令
-
docker run:
創(chuàng)建并運(yùn)行容器 -
docker pause:
容器暫停 -
docker unpause:
容器從暫停恢復(fù)到運(yùn)行狀態(tài) -
docker stop:
停止容器 -
docker start:
啟動(dòng)容器 -
docker rm:
刪除已停止的容器筒扒,如果需要?jiǎng)h除正在運(yùn)行的則加上-f
-
docker inspect [容器ID]:
查看運(yùn)行容器的IP地址信息 -
docker logs:
查看容器運(yùn)行日志信息怯邪,攜帶-f
參數(shù)則可以持續(xù)查看 -
docker ps:
查看當(dāng)前運(yùn)行的容器列表,-a
則查看所有的容器
案例1:創(chuàng)建一個(gè) sonarqube 容器并運(yùn)行
步驟一:docker hub 查看sonarqube 的容器運(yùn)行相關(guān)命令
$ docker run --name sonar -p 9000:9000 -d sonarqube
命令解讀
-
docker run:
創(chuàng)建并運(yùn)行一個(gè)容器 -
--name:
給容器自定義name,eq:sonar -
-p:
將宿主機(jī)端口與容器端口映射 //注意左邊的是宿主機(jī)端口花墩,右邊是容器端口悬秉。可以理解為當(dāng)客戶(hù)端訪問(wèn)宿主機(jī)的9000端口則就是訪問(wèn)映射的容器端口9000
-
-d:
后臺(tái)運(yùn)行容器 -
sonarqube:
鏡像名稱(chēng)
如果創(chuàng)建過(guò)程中出現(xiàn)以下錯(cuò)誤:
docker: Error response from daemon:driver failed programming external connetivity on endpoint
因?yàn)樯鲜霏h(huán)境是在Windows系統(tǒng)的VM虛擬機(jī)搭建的docker環(huán)境,如果需要主機(jī)訪問(wèn)虛擬機(jī)中的sonarqube服務(wù),則需要通過(guò)VM機(jī)設(shè)置NAT模式共享主機(jī)IP,這種情況下主機(jī)與虛擬機(jī)是通過(guò)防火墻進(jìn)行路由IP的,而一開(kāi)始在環(huán)境搭建的時(shí)候,防火墻都是關(guān)閉狀態(tài).所以就需要開(kāi)啟防火墻.開(kāi)啟對(duì)應(yīng)的端口.然后重啟防火墻和docker服務(wù)才能使配置生效.
# 1.檢查端口是否占用
$ netstat -tunlp | grep 9000
# 2.檢查端口放行情況,如果端口未打開(kāi)則需要防火墻開(kāi)放指定端口
$ firewall-cmd --list-all --zone=trusted
# 3.重啟防火墻
$ firewall-cmd --reload
# 4.重啟docker
$ systemctl restart docker
# 5.創(chuàng)建并運(yùn)行sonarqube
$ docker run --name sonar -p 9000:9000 -d sonarqube
案例2: 進(jìn)入sonar 容器,修改 conf 配置信息
步驟一: 以命令行交互的方式進(jìn)入容器
$ docker exec -it sonar bash
命令解讀:
-
docker exec:
進(jìn)入容器內(nèi)部冰蘑,執(zhí)行某個(gè)命令 -
-it:
給當(dāng)前進(jìn)入容器創(chuàng)建一個(gè)標(biāo)準(zhǔn)輸入和泌、輸出終端,運(yùn)行與容器直接交互 -
sonar:
要進(jìn)入的容器對(duì)象名稱(chēng) -
bash:
進(jìn)入容器后執(zhí)行的命令祠肥,bash是一個(gè)Linux終端交互shell
步驟二:進(jìn)入sonarqube的配置文件目錄
$ cd /opt/sonarqube/conf
步驟三: 修改 soanr.properties 文件信息
# 注意因?yàn)槿萜鲀?nèi)部初始化并沒(méi)有vi相關(guān)命令武氓,這里通過(guò)sed操作文件修改
$ sudo sed -i 's/#sonar.jdbc.url=jdbc:postgresql://localhost/sonar.jdbc.url=jdbc:postgresql://192.168.1.100/g' /path/to/sonar.properties
# 上述命令將把注釋行 #sonar.jdbc.url=jdbc:postgresql://localhost 更改為未注釋的行 sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonarqube
以上從案例2可以看出,如果想對(duì)容器的相關(guān)信息進(jìn)行修改,非常的不方便仇箱,需要進(jìn)入容器內(nèi)部進(jìn)行操作县恕,而且可以發(fā)現(xiàn)這種操作的數(shù)據(jù)不是持久化,當(dāng)容器再次運(yùn)行之前的配置信息不會(huì)被保存剂桥。
容器與數(shù)據(jù)高度耦合忠烛。不便于修改,數(shù)據(jù)不可復(fù)用权逗,升級(jí)維護(hù)困難美尸。后續(xù)將通過(guò)數(shù)據(jù)卷掛載的形式解決