Docker Getting Started
Docker 是什麼
Docker 是什麼上網搜一下就知道了,我只說說自己的體會。Docker 利用 Linux Kernel 提供的 cgroups, namespaces 等技術,構建類似沙盒的環境。在沙盒裡你怎麼搞破壞都沒事,從而達到了與主機環境隔離的作用。也因為 Docker 採用的技術和虛擬機器不同,它更輕量、更高效。
最初,Docker 主要用於 Linux。在 Windows 和 Mac OS 上使用 Docker 需要安裝 Linux 虛擬機器(用來執行 Linux containers)。但是到 2016 年, Windows 宣告通過 Hyper-V 技術,Docker 可以 natively 了。Windows 上既可以執行 Linux container,也可以執行 Windows container 了。技術在進步,不過,目前在 Linux 上執行 windows containers 或者在 Mac OS 執行 Linux 和 Windows containers 仍然是需要虛擬機器?
Docker 有什麼用
不同的人有不同的需求,對我而言 Docker 解決了環境衝突的問題。我經常需要在許多軟體的不同版本間切換,這導致我的開發環境一片混亂。Docker 讓我可以根據不同的需求,建立 container 來解決這個問題,互不干擾。container 不僅僅是一個沙盒,他也可以提供對外的介面和服務,因此用途十分廣泛。
Docker 常用到的命令
docker 配置
- 檢視 docker 資訊:
docker info
- 修改 Docker Root Dir
修改配置檔案中的 graph 欄位
image 的相關操作
- 查詢 image
docker search ubuntu
- 列出 image
docker image ls
docker images
-
獲取映象
參考 -
從 Docker 映象倉庫獲取映象的命令是 docker pull。其命令格式為:
docker pull [選項] [Docker Registry 地址[:埠號]/]倉庫名[:標籤] 具體的選項可以通過 docker pull --help 命令看到,這裡我們說一下映象名稱的格式。"Docker 映象倉庫地址" 的格式一般是 <域名/IP>[:埠號]。預設地址是 Docker Hub。"倉庫名" 如之前所說,這裡的倉庫名是兩段式名稱,即 <使用者名稱>/<軟體名>。對於 Docker Hub,如果不給出使用者名稱,則預設為 library,也就是官方映象。
$ docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
bf5d46315322: Pull complete
9f13e0ac480c: Pull complete
e8988b5b3097: Pull complete
40af181810e7: Pull complete
e6f7c7e5c03e: Pull complete
Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbe
Status: Downloaded newer image for ubuntu:16.04
- 以一個容器為基礎建立 image
docker commit -m "change somth" -a "somebody info" container_id(docker ps -a 獲取 id) 新映象名字
- 刪除映象
docker image rm 名字
注意:只有刪除了所有的相關 container,才能刪除映象。
container 的相關操作
- 列出 container
docker container ls 列出正在執行的 containner
docker container ls -l 列出最新建立的 containner
docker container ls -a 列出所有的 containner
docker container ls 等同於 docker ps
- 建立 container
docker run -t -i ubuntu:14.04 /bin/bash
其中,-t 選項讓Docker分配一個偽終端(pseudo-tty)並繫結到容器的標準輸入上, -i 則讓容器的標準輸入保持開啟。注意,該命令會生成一個全新的 container。
- 啟動 container
docker container start
將一個已經終止的容器啟動執行。前面的 docker container run 命令是新建容器,每執行一次,就會新建一個容器。同樣的命令執行兩次,就會生成兩個一模一樣的容器檔案。如果希望重複使用容器,就要使用 docker container start 命令,它用來啟動已經生成、已經停止執行的容器檔案。
- 執行 container
docker container exec -it [containerID] /bin/bash ##docker container
exec 命令用於進入一個正在執行的 docker 容器。如果 docker run 命令執行容器的時候,沒有使用 -it 引數,就要用這個命令進入容器。一旦進入了容器,就可以在容器的 Shell 執行命令了。
- 刪除 container
docker container rm [containerID]
如果在執行容器的時候,加上了 --rm 引數,則會在容器終止執行後自動刪除容器檔案。
- 修改 container 的名字
docker container rename old_name new_name
或者在 docker run 從映象建立容器的時候,加上 --name 選項來指定名字。
- 主機與容器的檔案傳輸
sudo docker cp host_path containerID:container_path // 從主機複製到容器
sudo docker cp containerID:container_path host_path // 從容器複製到主機
- 容器埠對映
docker port <images id> [port] 命令可以讓我們快捷地檢視埠的繫結情況
docker run 的 "大寫 -P" 引數可以自動對映埠,這個還沒有實際用過
docker run 的 “小寫 -p” 引數可以對映 主機埠:容器埠,可以有多個 -p 引數。
// 例子
docker run -it --name site2 -v /home/deyu/lab/xudeyu.github.io/_site:/root/_site -p 12345:4000 ubuntu /bin/bash
- 容器卷對映
docker run -v 主機目錄:容器目錄。可以指定多個 -v 引數,從而對映多個卷。例子參考上文。
- 顯示 GUI
// 主機連線本機的 Container
docker run -it -v /etc/localtime:/etc/localtime:ro -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE --device /dev/snd --name opencv330 769266b15f71 /bin/bash
// 在 HOST 端需要開啟
$ sudo apt-get install x11-xserver-utils
$ xhost +
[參考1](https://www.csdn.net/article/2015-07-30/2825340)
[參考2](https://blog.csdn.net/ericcchen/article/details/79253416)
[參考3](https://blog.jessfraz.com/post/docker-containers-on-the-desktop)
[參考4](http://blog.daocloud.io/dockercon-day-2-jessie-image)
- 退出容器
docker container kill
docker container stop 前面的docker container kill命令終止容器執行,相當於向容器裡面的主程序發出 SIGKILL 訊號。而docker container stop命令也是用來終止容器執行,相當於向容器裡面的主程序發出 SIGTERM 訊號,然後過一段時間再發出 SIGKILL 訊號。這兩個訊號的差別是,應用程式收到 SIGTERM 訊號以後,可以自行進行收尾清理工作,但也可以不理會這個訊號。如果收到 SIGKILL 訊號,就會強行立即終止,那些正在進行中的操作會全部丟失。
在容器裡執行 exit, 此時容器處於停止狀態
- 檢視容器 LOG
docker container logs [containerID]
docker container logs命令用來檢視 docker 容器的輸出,即容器裡面 Shell 的標準輸出。如果docker run命令執行容器的時候,沒有使用 -it 引數,就要用這個命令檢視輸出。
Docker 遇到的問題
-
在 docker 中部署了 jekyll,啟動服務監聽了 127.0.0.1:4000 埠。雖然容器的 4000 埠已經對映到了 host:4000,但是卻無法在 host 端通過 4000 埠訪問該服務。
解答:由於監聽了 127.0.0.1 為一個迴環地址,只能接受本機的訪問。因此,無法通過 host 訪問。改成 0.0.0.0 可以訪問,但是 css 檔案找不到了。這應該是另一個問題了。
參考資料