docker 一起性重启所有镜像_Docker常见问题总结
鏡像相關(guān)
如何批量清理臨時鏡像文件?
答:可以使用 docker image prune 命令。
如何查看鏡像支持的環(huán)境變量?
答:可以使用 docker run IMAGE env 命令。
本地的鏡像文件都存放在哪里?
答:與 Docker 相關(guān)的本地資源默認(rèn)存放在 /var/lib/docker/ 目錄下,以 aufs 文件系統(tǒng)為例,其中 container 目錄存放容器信息,graph 目錄存放鏡像信息,aufs 目錄下存放具體的鏡像層文件。
構(gòu)建 Docker 鏡像應(yīng)該遵循哪些原則?
答:整體原則上,盡量保持鏡像功能的明確和內(nèi)容的精簡,要點包括盡量選取滿足需求但較小的基礎(chǔ)系統(tǒng)鏡像,例如大部分時候可以選擇 debian:wheezy 或 debian:stretch 鏡像,僅有不足百兆大小;
清理編譯生成文件、安裝包的緩存等臨時文件;
安裝各個軟件時候要指定準(zhǔn)確的版本號,并避免引入不需要的依賴;
從安全角度考慮,應(yīng)用要盡量使用系統(tǒng)的庫和依賴;
如果安裝應(yīng)用時候需要配置一些特殊的環(huán)境變量,在安裝后要還原不需要保持的變量值;
使用 Dockerfile 創(chuàng)建鏡像時候要添加 .dockerignore 文件或使用干凈的工作目錄。
碰到網(wǎng)絡(luò)問題,無法 pull 鏡像,命令行指定 http_proxy 無效?
答:在 Docker 配置文件中添加 export http_proxy="http://:",之后重啟 Docker 服務(wù)即可。
容器相關(guān)
容器退出后,通過 docker container ls 命令查看不到,數(shù)據(jù)會丟失么?
答:容器退出后會處于終止(exited)狀態(tài),此時可以通過 docker container ls -a 查看。其中的數(shù)據(jù)也不會丟失,還可以通過 docker start 命令來啟動它。只有刪除掉容器才會清除所有數(shù)據(jù)。
如何停止所有正在運行的容器?
答:可以使用 docker stop $(docker container ls -q) 命令。
如何批量清理已經(jīng)停止的容器?
答:可以使用 docker container prune 命令。
如何獲取某個容器的 PID 信息?
答:可以使用 docker inspect --format '{{ .State.Pid }}' 命令。
如何獲取某個容器的 IP 地址?
答:可以使用 docker inspect --format '{{ .NetworkSettings.IPAddress }}' 命令
如何給容器指定一個固定 IP 地址,而不是每次重啟容器 IP 地址都會變?
答:使用以下命令啟動容器可以使容器 IP 固定不變$ docker network create-d bridge--subnet172.25.0.0/16my-net
$ docker run--network=my-net--ip=172.25.3.3-itd--name=my-container busybox
如何臨時退出一個正在交互的容器的終端,而不終止它?
答:按 Ctrl-p Ctrl-q。如果按 Ctrl-c 往往會讓容器內(nèi)應(yīng)用進(jìn)程終止,進(jìn)而會終止容器。
使用 docker port 命令映射容器的端口時,系統(tǒng)報錯“Error: No public port ‘80’ published for xxx”?
答:創(chuàng)建鏡像時 Dockerfile 要通過 EXPOSE 指定正確的開放端口;
容器啟動時指定 PublishAllPort = true。
可以在一個容器中同時運行多個應(yīng)用進(jìn)程么?
答:一般并不推薦在同一個容器內(nèi)運行多個應(yīng)用進(jìn)程。如果有類似需求,可以通過一些額外的進(jìn)程管理機(jī)制,比如 supervisord 來管理所運行的進(jìn)程。可以參考 https://docs.docker.com/config/containers/multi-service_container/ 。
如何控制容器占用系統(tǒng)資源(CPU、內(nèi)存)的份額?
答:在使用 docker create 命令創(chuàng)建容器或使用 docker run 創(chuàng)建并啟動容器的時候,可以使用 -c|—cpu-shares[=0] 參數(shù)來調(diào)整容器使用 CPU 的權(quán)重;使用 -m|—memory[=MEMORY] 參數(shù)來調(diào)整容器使用內(nèi)存的大小。
倉庫相關(guān)
倉庫(Repository)、注冊服務(wù)器(Registry)、注冊索引(Index) 有何關(guān)系?
首先,倉庫是存放一組關(guān)聯(lián)鏡像的集合,比如同一個應(yīng)用的不同版本的鏡像。
注冊服務(wù)器是存放實際的鏡像文件的地方。注冊索引則負(fù)責(zé)維護(hù)用戶的賬號、權(quán)限、搜索、標(biāo)簽等的管理。因此,注冊服務(wù)器利用注冊索引來實現(xiàn)認(rèn)證等管理。
配置相關(guān)
Docker 的配置文件放在哪里,如何修改配置?
答:使用 systemd 的系統(tǒng)(如 Ubuntu 16.04、Centos 等)的配置文件在 /etc/docker/daemon.json。
如何更改 Docker 的默認(rèn)存儲位置?
答:Docker 的默認(rèn)存儲位置是 /var/lib/docker,如果希望將 Docker 的本地文件存儲到其他分區(qū),可以使用 Linux 軟連接的方式來完成,或者在啟動 daemon 時通過 -g 參數(shù)指定,或者修改配置文件 /etc/docker/daemon.json 的 “data-root” 項 。可以使用 docker system info | grep "Root Dir" 查看當(dāng)前使用的存儲位置。
例如,如下操作將默認(rèn)存儲位置遷移到 /storage/docker。[root@s26~]#df-h
FilesystemSizeUsedAvailUse%Mountedon
/dev/mapper/VolGroup-lv_root50G5.3G42G12%/
tmpfs48G228K48G1%/dev/shm
/dev/sda1485M40M420M9%/boot
/dev/mapper/VolGroup-lv_home222G188M210G1%/home
/dev/sdb22.7T323G2.3T13%/storage
[root@s26~]#service docker stop
[root@s26~]#cd/var/lib/
[root@s26 lib]#mv docker/storage/
[root@s26 lib]#ln-s/storage/docker/docker
[root@s26 lib]#ls-la docker
lrwxrwxrwx.1root root1511月1713:43docker->/storage/docker
[root@s26 lib]#service docker start
使用內(nèi)存和 swap 限制啟動容器時候報警告:”WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.”?
答:這是因為系統(tǒng)默認(rèn)沒有開啟對內(nèi)存和 swap 使用的統(tǒng)計功能,引入該功能會帶來性能的下降。要開啟該功能,可以采取如下操作:編輯 /etc/default/grub 文件(Ubuntu 系統(tǒng)為例),配置 GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
更新 grub:$ sudo update-grub
重啟系統(tǒng),即可。
Docker 與虛擬化
Docker 與 LXC(Linux Container)有何不同?
答:LXC 利用 Linux 上相關(guān)技術(shù)實現(xiàn)了容器。Docker 則在如下的幾個方面進(jìn)行了改進(jìn):移植性:通過抽象容器配置,容器可以實現(xiàn)從一個平臺移植到另一個平臺;
鏡像系統(tǒng):基于 AUFS 的鏡像系統(tǒng)為容器的分發(fā)帶來了很多的便利,同時共同的鏡像層只需要存儲一份,實現(xiàn)高效率的存儲;
版本管理:類似于Git的版本管理理念,用戶可以更方便的創(chuàng)建、管理鏡像文件;
倉庫系統(tǒng):倉庫系統(tǒng)大大降低了鏡像的分發(fā)和管理的成本;
周邊工具:各種現(xiàn)有工具(配置管理、云平臺)對 Docker 的支持,以及基于 Docker的 PaaS、CI 等系統(tǒng),讓 Docker 的應(yīng)用更加方便和多樣化。
Docker 與 Vagrant 有何不同?
答:兩者的定位完全不同。Vagrant 類似 Boot2Docker(一款運行 Docker 的最小內(nèi)核),是一套虛擬機(jī)的管理環(huán)境。Vagrant 可以在多種系統(tǒng)上和虛擬機(jī)軟件中運行,可以在 Windows,Mac 等非 Linux 平臺上為 Docker 提供支持,自身具有較好的包裝性和移植性。
原生的 Docker 自身只能運行在 Linux 平臺上,但啟動和運行的性能都比虛擬機(jī)要快,往往更適合快速開發(fā)和部署應(yīng)用的場景。
簡單說:Vagrant 適合用來管理虛擬機(jī),而 Docker 適合用來管理應(yīng)用環(huán)境。
開發(fā)環(huán)境中 Docker 和 Vagrant 該如何選擇?
答:Docker 不是虛擬機(jī),而是進(jìn)程隔離,對于資源的消耗很少,但是目前需要 Linux 環(huán)境支持。Vagrant 是虛擬機(jī)上做的封裝,虛擬機(jī)本身會消耗資源。
如果本地使用的 Linux 環(huán)境,推薦都使用 Docker。
如果本地使用的是 macOS 或者 Windows 環(huán)境,那就需要開虛擬機(jī),單一開發(fā)環(huán)境下 Vagrant 更簡單;多環(huán)境開發(fā)下推薦在 Vagrant 里面再使用 Docker 進(jìn)行環(huán)境隔離。
其它
Docker 能在非 Linux 平臺(比如 Windows 或 macOS )上運行么?
答:完全可以。安裝方法請查看 安裝 Docker 一節(jié)
如何將一臺宿主主機(jī)的 Docker 環(huán)境遷移到另外一臺宿主主機(jī)?
答:停止 Docker 服務(wù)。將整個 Docker 存儲文件夾復(fù)制到另外一臺宿主主機(jī),然后調(diào)整另外一臺宿主主機(jī)的配置即可。
如何進(jìn)入 Docker 容器的網(wǎng)絡(luò)命名空間?
答:Docker 在創(chuàng)建容器后,刪除了宿主主機(jī)上 /var/run/netns 目錄中的相關(guān)的網(wǎng)絡(luò)命名空間文件。因此,在宿主主機(jī)上是無法看到或訪問容器的網(wǎng)絡(luò)命名空間的。
用戶可以通過如下方法來手動恢復(fù)它。
首先,使用下面的命令查看容器進(jìn)程信息,比如這里的 1234。$ docker inspect--format='{{. State.Pid}} '$container_id
1234
接下來,在 /proc 目錄下,把對應(yīng)的網(wǎng)絡(luò)命名空間文件鏈接到 /var/run/netns 目錄。$ sudo ln-s/proc/1234/ns/net/var/run/netns/
然后,在宿主主機(jī)上就可以看到容器的網(wǎng)絡(luò)命名空間信息。例如$ sudo ip netns show
1234
此時,用戶可以通過正常的系統(tǒng)命令來查看或操作容器的命名空間了。例如修改容器的 IP 地址信息為 172.17.0.100/16。$ sudo ip netns exec1234ifconfig eth0172.17.0.100/16
如何獲取容器綁定到本地那個 veth 接口上?
答:Docker 容器啟動后,會通過 veth 接口對連接到本地網(wǎng)橋,veth 接口命名跟容器命名毫無關(guān)系,十分難以找到對應(yīng)關(guān)系。
最簡單的一種方式是通過查看接口的索引號,在容器中執(zhí)行 ip a 命令,查看到本地接口最前面的接口索引號,如 205,將此值加上 1,即 206,然后在本地主機(jī)執(zhí)行 ip a 命令,查找接口索引號為 206 的接口,兩者即為連接的 veth 接口對。
總結(jié)
以上是生活随笔為你收集整理的docker 一起性重启所有镜像_Docker常见问题总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 快速实现栅格地图
- 下一篇: 帆软FineReport_下拉菜单内容并