一、鏡像相關
1、如何批量清理臨時鏡像文件
答:可以使用 docker rmi $(docker images -q -f dangling=true) 命令。
2、如何查看鏡像支持的環境變量?
答:可以使用 docker run IMAGE env 命令。
3、本地的鏡像文件都存放在哪里?
答:與 Docker 相關的本地資源都存放在 /var/lib/docker/ 目錄下,以 aufs 文件系統為例,其中 container 目錄存放容器信息,graph 目錄存放鏡像信息,aufs 目錄下存放具體的鏡像層文件。
4、構建 Docker 鏡像應該遵循哪些原則?
答:整體原則上,盡量保持鏡像功能的明確和內容的精簡,要點包括
盡量選取滿足需求但較小的基礎系統鏡像,例如大部分時候可以選擇 debian:wheezy 或 debian:jessie 鏡像,僅有不足百兆大小;
清理編譯生成文件、安裝包的緩存等臨時文件;
安裝各個軟件時候要指定準確的版本號,并避免引入不需要的依賴;
從安全角度考慮,應用要盡量使用系統的庫和依賴;
如果安裝應用時候需要配置一些特殊的環境變量,在安裝后要還原不需要保持的變量值;
使用 Dockerfile 創建鏡像時候要添加 .dockerignore 文件或使用干凈的工作目錄。
5、碰到網絡問題,無法 pull 鏡像,命令行指定 http_proxy 無效?
答:在 Docker 配置文件中添加 export http_proxy="http://:",之后重啟 Docker 服務即可。
二、容器相關
1、容器退出后,通過 docker ps 命令查看不到,數據會丟失么?
答:容器退出后會處于終止(exited)狀態,此時可以通過 docker ps -a 查看。其中的數據也不會丟失,還可以通過 docker start 命令來啟動它。只有刪除掉容器才會清除所有數據。
2、如何停止所有正在運行的容器
答:可以使用 docker kill $(docker ps -q) 命令。
3、如何清理批量后臺停止的容器?
答:可以使用 docker rm -f $(docker ps -qa) 命令。
4、如何獲取某個容器的 PID 信息?
答:可以使用 docker inspect --format '{{ .State.Pid }}' 命令。
5、如何獲取某個容器的 IP 地址?
答:可以使用 docker inspect --format '{{ .NetworkSettings.IPAddress }}' 命令
6、如何給容器指定一個固定 IP 地址,而不是每次重啟容器 IP 地址都會變?
答:目前 Docker 并沒有提供直接的對容器 IP 地址的管理支持,用戶可以考慮參考第三部分中高級網絡配置章節中介紹的創建點對點連接例子,來手動配置容器的靜態 IP。或者在啟動容器后,再手動進行修改(可參考其它類的問題 “如何進入 Docker 容器的網絡命名空間?”)。
7、如何臨時退出一個正在交互的容器的終端,而不終止它?
答:按 Ctrl-p Ctrl-q。如果按 Ctrl-c 往往會讓容器內應用進程終止,進而會終止容器。
8、容器與宿主機系統時間相差8小時,如何處理?
?答:在啟動容器時多加以下參數
????????-v /etc/localtime:/etc/localtime:ro
????????-e LC_ALL="en_US.UTF-8"
????????-e TZ="Asia/Shanghai"
9、如何更改或指定容器的系統時間
答:1、在構建鏡像時添加一層:RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
????????2、如容器已啟動則執行以下命令:
? ? ? ? ? ? ? #docker? cp? /usr/share/zoneinfo/Asia/Shanghai? 容器ID:/etc/localtime
10、使用 docker port 命令映射容器的端口時,系統報錯“Error: No public port '80' published for xxx”?
答:創建鏡像時 Dockerfile 要通過 EXPOSE 指定正確的開放端口;
????????容器啟動時指定 PublishAllPort = true。
11、可以在一個容器中同時運行多個應用進程么?
答:一般并不推薦在同一個容器內運行多個應用進程。如果有類似需求,可以通過一些額外的進程管理機制,比如 supervisord 來管理所運行的進程。可以參考https://docs.docker.com/articles/using_supervisord/。
12、如何控制容器占用系統資源(CPU、內存)的份額?
答:在使用 docker create 命令創建容器或使用 docker run 創建并啟動容器的時候,可以使用 -c|--cpu-shares[=0] 參數來調整容器使用 CPU 的權重;使用 -m|--memory[=MEMORY] 參數來調整容器使用內存的大小。
三、倉庫相關
1、倉庫(Repository)、注冊服務器(Registry)、注冊索引(Index) 有何關系?
首先,倉庫是存放一組關聯鏡像的集合,比如同一個應用的不同版本的鏡像。
注冊服務器是存放實際的鏡像文件的地方。注冊索引則負責維護用戶的賬號、權限、搜索、標簽等的管理。因此,注冊服務器利用注冊索引來實現認證等管理。
2、從非官方倉庫(例如 non-official-repo.com)下載鏡像時候,有時候會提示“Error: Invalid registry endpointhttps://non-official-repo.com/v1/……”?
答:Docker 自 1.3.0 版本往后,加強了對鏡像安全性的驗證,需要添加私有倉庫證書,或者手動添加對非官方倉庫的信任。 編輯 Docker 配置文件,在其中添加:
DOCKER_OPTS="--insecure-registry non-official-repo"
之后,重啟 Docker 服務即可。
四、配置相關
1、Docker 的配置文件放在哪里,如何修改配置?
答:使用 upstart 的系統(如Ubuntu 14.04)的配置文件在 /etc/default/docker,使用systemd 的系統(如 Ubuntu 16.04、Centos 等)的配置文件在 /etc/systemd/system/docker.service.d/docker.conf。
Ubuntu 下面的配置文件內容如下,讀者可以參考配。(如果出現該文件不存在的情況,重啟或者自己新建一個文件都可以解決。)
# Customize location of Docker binary (especially for development testing). #DOCKERD="/usr/local/bin/dockerd" # Use DOCKER_OPTS to modify the daemon startup options. #DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4" # If you need Docker to use an HTTP proxy, it can also be specified here. #export http_proxy="http://127.0.0.1:3128/" # This is also a handy place to tweak where Docker's temporary files go. #export TMPDIR="/mnt/bigdrive/docker-tmp"
2、如何更改 Docker 的默認存儲位置?
答:Docker 的默認存儲位置是 /var/lib/docker,如果希望將 Docker 的本地文件存儲到其他分區,可以使用 Linux 軟連接的方式來完成,或者在啟動 daemon 時通過 -g 參數指定。
例如,如下操作將默認存儲位置遷移到 /storage/docker。
[root@s26 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 50G 5.3G 42G 12% / tmpfs 48G 228K 48G 1% /dev/shm /dev/sda1 485M 40M 420M 9% /boot /dev/mapper/VolGroup-lv_home 222G 188M 210G 1% /home /dev/sdb2 2.7T 323G 2.3T 13% /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. 1 root root 15 11月 17 13:43 docker -> /storage/docker [root@s26 lib]# service docker start
3、使用內存和 swap 限制啟動容器時候報警告:“WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.”?
答:這是因為系統默認沒有開啟對內存和 swap 使用的統計功能,引入該功能會帶來性能的下降。要開啟該功能,可以采取如下操作:
編輯 /etc/default/grub 文件(Ubuntu 系統為例),配置 GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1";
更新 grub:$ sudo update-grub;
重啟系統,即可。
五、Docker 與虛擬化
1、Docker 與 LXC(Linux Container)有何不同?
答:LXC 利用 Linux 上相關技術實現了容器。Docker 則在如下的幾個方面進行了改進:
移植性:通過抽象容器配置,容器可以實現從一個平臺移植到另一個平臺;
鏡像系統:基于 AUFS 的鏡像系統為容器的分發帶來了很多的便利,同時共同的鏡像層只需要存儲一份,實現高效率的存儲;
版本管理:類似于Git的版本管理理念,用戶可以更方便的創建、管理鏡像文件;
倉庫系統:倉庫系統大大降低了鏡像的分發和管理的成本;
周邊工具:各種現有工具(配置管理、云平臺)對 Docker 的支持,以及基于 Docker的 PaaS、CI 等系統,讓 Docker 的應用更加方便和多樣化。
2、Docker 與 Vagrant 有何不同?
答:兩者的定位完全不同。
Vagrant 類似 Boot2Docker(一款運行 Docker 的最小內核),是一套虛擬機的管理環境。Vagrant 可以在多種系統上和虛擬機軟件中運行,可以在 Windows,Mac 等非 Linux 平臺上為 Docker 提供支持,自身具有較好的包裝性和移植性。
原生的 Docker 自身只能運行在 Linux 平臺上,但啟動和運行的性能都比虛擬機要快,往往更適合快速開發和部署應用的場景。
簡單說:Vagrant 適合用來管理虛擬機,而 Docker 適合用來管理應用環境。
3、開發環境中 Docker 和 Vagrant 該如何選擇?
答: Docker 不是虛擬機,而是進程隔離,對于資源的消耗很少,但是目前需要 Linux 環境支持。Vagrant 是虛擬機上做的封裝,虛擬機本身會消耗資源。
如果本地使用的 Linux 環境,推薦都使用 Docker。
如果本地使用的是 OSX 或者 Windows 環境,那就需要開虛擬機,單一開發環境下 Vagrant 更簡單;多環境開發下推薦在 Vagrant 里面再使用 Docker 進行環境隔離。
六、其它
1、Docker 能在非 Linux 平臺(比如 Windows 或 MacOS)上運行么?
答:可以。目前需要使用 docker for mac、boot2docker 等軟件創建一個輕量級的 Linux 虛擬機層。
2、如何將一臺宿主主機的 docker 環境遷移到另外一臺宿主主機?
答:停止 Docker 服務。將整個 Docker 存儲文件夾復制到另外一臺宿主主機,然后調整另外一臺宿主主機的配置即可。
3、如何進入 Docker 容器的網絡命名空間?
答:Docker 在創建容器后,刪除了宿主主機上 /var/run/netns 目錄中的相關的網絡命名空間文件。因此,在宿主主機上是無法看到或訪問容器的網絡命名空間的。
?????? 用戶可以通過如下方法來手動恢復它。
?????? 首先,使用下面的命令查看容器進程信息,比如這里的1234。
?????? $ docker inspect --format='{{. State.Pid}} ' $container_id 1234
?????? 接下來,在 /proc 目錄下,把對應的網絡命名空間文件鏈接到 /var/run/netns 目錄。
?????? $ sudo ln -s /proc/1234/ns/net /var/run/netns/
?????? 然后,在宿主主機上就可以看到容器的網絡命名空間信息。例如
?????? $ sudo ip netns show 1234
?????? 此時,用戶可以通過正常的系統命令來查看或操作容器的命名空間了。例如修改容器的 IP 地址信息為 172.17.0.100/16。
?????? $ sudo ip netns exec 1234 ifconfig eth0 172.17.0.100/16
4、如何獲取容器綁定到本地那個 veth 接口上?
答:Docker 容器啟動后,會通過 veth 接口對連接到本地網橋,veth 接口命名跟容器命名毫無關系,十分難以找到對應關系。
??????? 最簡單的一種方式是通過查看接口的索引號,在容器中執行 ip a 命令,查看到本地接口最前面的接口索引號,如 205,將此值加上 1,即 206,然后在本地主機執行 ip a 命令,查找接口索引號為 206 的接口,兩者即為連接的 veth 接口對。
上傳鏡像至私有倉庫時失敗,如何處理。
http://blog.csdn.net/wangtaoking1/article/details/44180901/
5、Docker掛載主機目錄Docker訪問出現Permission denied的解決辦法
問題原因及解決辦法 原因是CentOS7中的安全模塊selinux把權限禁掉了,至少有以下三種方式解決掛載的目錄沒有權限的問題: 1.在運行容器的時候,給容器加特權,及加上 --privileged=true 參數: docker run -i -t -v /soft:/soft --privileged=true 686672a1d0cc /bin/bash 2.臨時關閉selinux: setenforce 0 3.添加selinux規則,改變要掛載的目錄的安全性文本
http://blog.csdn.net/rznice/article/details/52170085
6、Docker服務不能啟動并提示“Failed to start Docker Application Container Engine.”
答:一般情況下為配置文件中有格式錯誤的問題,可查看近期修改了哪些/etc/docker目錄下的文件,回滾即可。
案例:/etc/docker/daemon.json文件修改有問題,內容還原如下:
{ "storage-driver": "devicemapper"}
7、Docker 服務2375端口安全問題
docker服務通過修改配置文件后可以啟動2375端口,該端口未經加密,一旦開啟后,就可通過遠程命令的形式操作該臺Docker服務,遠程執行命令如下:
????docker -H IP:2375 run --rm -v /:/root alpine cat /root/etc/hostname
在測試環境中可能由于某種需要如此進行遠程控制,但不應該出現在生產環境中,一旦被掃描出來,就相當于裸露在公網中(也可能是局域網中)。