1. 程式人生 > >Docker Getting Started

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 配置

  1. 檢視 docker 資訊:
docker info
  1. 修改 Docker Root Dir
    修改配置檔案中的 graph 欄位
    參考

 

image 的相關操作

  1. 查詢 image
docker search ubuntu
  1. 列出 image
docker image ls
docker images
  1. 獲取映象
    參考

  2. 從 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
  1. 以一個容器為基礎建立 image
docker commit -m "change somth" -a "somebody info" container_id(docker ps -a 獲取 id) 新映象名字

參考

  1. 刪除映象
docker image rm 名字

注意:只有刪除了所有的相關 container,才能刪除映象。

 

container 的相關操作

  1. 列出 container
docker container ls      列出正在執行的 containner
docker container ls -l   列出最新建立的 containner
docker container ls -a   列出所有的 containner

docker container ls 等同於 docker ps

  1. 建立 container
docker run -t -i ubuntu:14.04 /bin/bash 

其中,-t 選項讓Docker分配一個偽終端(pseudo-tty)並繫結到容器的標準輸入上, -i 則讓容器的標準輸入保持開啟。注意,該命令會生成一個全新的 container。

  1. 啟動 container
docker container start

將一個已經終止的容器啟動執行。前面的 docker container run 命令是新建容器,每執行一次,就會新建一個容器。同樣的命令執行兩次,就會生成兩個一模一樣的容器檔案。如果希望重複使用容器,就要使用 docker container start 命令,它用來啟動已經生成、已經停止執行的容器檔案。

  1. 執行 container
docker container exec -it [containerID] /bin/bash  ##docker container 

exec 命令用於進入一個正在執行的 docker 容器。如果 docker run 命令執行容器的時候,沒有使用 -it 引數,就要用這個命令進入容器。一旦進入了容器,就可以在容器的 Shell 執行命令了。

  1. 刪除 container
docker container rm [containerID] 

如果在執行容器的時候,加上了 --rm 引數,則會在容器終止執行後自動刪除容器檔案。

  1. 修改 container 的名字
docker container rename old_name new_name

或者在 docker run 從映象建立容器的時候,加上 --name 選項來指定名字。

  1. 主機與容器的檔案傳輸
sudo docker cp host_path containerID:container_path		// 從主機複製到容器
sudo docker cp containerID:container_path host_path		// 從容器複製到主機
  1. 容器埠對映
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
  1. 容器卷對映
docker run -v 主機目錄:容器目錄。可以指定多個 -v 引數,從而對映多個卷。例子參考上文。
  1. 顯示 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)
  1. 退出容器
docker container kill
docker container stop 前面的docker container kill命令終止容器執行,相當於向容器裡面的主程序發出 SIGKILL 訊號。而docker container stop命令也是用來終止容器執行,相當於向容器裡面的主程序發出 SIGTERM 訊號,然後過一段時間再發出 SIGKILL 訊號。這兩個訊號的差別是,應用程式收到 SIGTERM 訊號以後,可以自行進行收尾清理工作,但也可以不理會這個訊號。如果收到 SIGKILL 訊號,就會強行立即終止,那些正在進行中的操作會全部丟失。

在容器裡執行 exit, 此時容器處於停止狀態

  1. 檢視容器 LOG
docker container logs [containerID]

docker container logs命令用來檢視 docker 容器的輸出,即容器裡面 Shell 的標準輸出。如果docker run命令執行容器的時候,沒有使用 -it 引數,就要用這個命令檢視輸出。

 

Docker 遇到的問題


  1. 在 docker 中部署了 jekyll,啟動服務監聽了 127.0.0.1:4000 埠。雖然容器的 4000 埠已經對映到了 host:4000,但是卻無法在 host 端通過 4000 埠訪問該服務。

    解答:由於監聽了 127.0.0.1 為一個迴環地址,只能接受本機的訪問。因此,無法通過 host 訪問。改成 0.0.0.0 可以訪問,但是 css 檔案找不到了。這應該是另一個問題了。

    參考1
    參考2

 

參考資料


電子書
基本命令查詢
官方文件
部落格介紹