1. 程式人生 > >【生信】Docker生信基礎

【生信】Docker生信基礎

Docker生信基礎


Docker可以做什麼?

  • 提供一個虛擬化的操作平臺,便於安裝依賴不同版本系統的工具軟體
  • 提供一個即時可用的應用軟體或流程的映象,開發者可將軟體部署到映象中,使用者直接下載使用
  • 提供一個系統資源分配的靈活方式,可以為不同使用者的程式分配獨立的計算空間

Docker的基本概念

  • 映象 (Images): 是一種超輕量級的虛擬化方式。 映象有自己的唯一ID,名字和標籤,比如ubuntu:latest, django:1.6等。 通常是在已有的映象(多數是Linux作業系統的映象)的基礎上構建自己的、具有新功能的映象。
  • 容器 (Containers): 是一種超輕量級的虛擬機器,是映象執行所處的可讀寫的狀態。容器裡面可以安裝、執行程式,還可以把安裝好的程式儲存起來獲得新的映象。

與傳統虛擬機器很大的不同在於,一個容器通常只執行一個程式。在Docker中,應用程式和資料檔案是分開的,因此可以在不影響資料的情況下快速升級程式碼或系統。

  • 資料卷 (Volumes): 永久儲存資料的磁碟空間。Docker允許使用者定義哪一部分是應用程式,哪一部分是資料,並且把他們分隔開。這就保證了在Docker中容器的生命週期是短暫的,而資料的儲存是永恆的。

資料卷儲存在執行Docker的宿主機上,對每個容器來說是特有的。 我們可以啟動同一個映象來產生多個容器,並且分別給他們分配一個數據卷。

資料卷也可用於在不同的容器間共享資料。 具體參見http://blog.genesino.com/2016/09/docker-lamp/

  • 聯通 (Links): 容器啟動後會分配有一個私有IP,其它容器可以通過這個IP地 址與這個容器通訊。

假如有個正在執行的資料庫容器 (dbapp), 那麼我們可以在網路伺服器容器 (webserver)中通過指定埠連線dbapp與資料庫容器通訊。

Docker的安裝和配置

  • CentOS 6.5 安裝Docker
#新增epel的源
su -c 'rpm -Uvh  http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm'
yum update

# 安裝Docker
yum install docker-io

# 啟動Docker服務
service docker start
# 關閉Docker服務
service docker stop

# 設定Docker開機啟動
/sbin/chkconfig --add docker
/sbin/chkconfig docker on
  • 其他版本作業系統上Docker的安裝可以直接使用系統自帶的yumapt工具, 啟動和配置如上。
apt-get install docker.io

Docker的使用者許可權管理

預設情況下,Docker命令的執行需要root使用者許可權。一個解決辦法是把使用者加入docker使用者組,原因是Docker能夠將/run/docker.socket的檔案許可權設為660、使用者組設為docker。當把使用者加入到docker使用者組後,就無需使用sudosu命令切換獲取root使用者許可權。

###以下操作都是在根使用者下進行的

###增加一個使用者組docker
# groupadd docker
###把使用者${USER}加入docker使用者組
# usermod -aG docker ${USER}
###重啟docker服務(可不執行)
# service docker restart
###新視窗登入${USER}

但通常只應把信任的使用者加入docker使用者組,因為docker使用者組的許可權相當於root。

如果打算只允許使用者訪問一個特定的容器,可以寫一個簡單指令碼

# cat /bin/docker_container1
#!/bin/sh
docker run -ti --rm container_name /bin/sh

指令碼完成後,配置sudoers

# grep username /etc/sudoers
username   ALL=(ALL)  NOPASSWD: /bin/docker_container1

更多許可權設定見http://dockone.io/article/589

Docker的簡單使用

  • 檢視本地Docker的資訊:docker info
  • 執行Docker需要有一個映象和容器。映象是容器的只讀版本,最基礎的映象是一個作業系統,是執行其他命令的基礎。因此需要先獲取一個作業系統的映象。通常使用Ubuntu系統,CentOS系統和Alpine(大約只有5M)。也可以根據所要執行的軟體要求,獲取不同的作業系統,以便於安裝軟體。
  • 搜尋映象:docker search ubuntu;映象的名字通常由 “使用者名稱/映象名”構成,無使用者名稱的為官方認證的映象
[email protected]:~# docker search ubuntu
NAME              DESCRIPTION      STARS     OFFICIAL   AUTOMATED
ubuntu            Ubuntu is ...    4595      [OK]       
ubuntu-upstart    Upstart is...     66       [OK]
jordi/ubuntu      Ubuntu bas...     1                    [OK]
  • 獲取映象
    • docker pull ubuntu #獲取映象的最新版本(即lastest)
    • docker pull ubuntu:14.04#獲取指定版本的映象;14.04為映象的版本號(又稱為tag)
  • 檢視本機Docker中存在的映象:docker images
REPOSITORY   TAG      IMAGE ID       CREATED      VIRTUAL SIZE
ubuntu       latest   37b164bb431e   4 days ago   126.6 MB
  • 獲取映象後,需要執行映象;執行狀態的映象就是容器,是可讀寫的。可以在容器中安裝、執行軟體或命令。在容器中執行單個命令或程式,通常加“--rm”引數,容器執行結束之後就自動刪除。如果要保留對容器的修改,則不新增“--rm”引數。互動式執行容器為:docker run -it ubuntu,這時可以發現終端的使用者名稱改變了。另外,可以使用docker run --help檢視命令的引數。
docker run --rm ubuntu echo "Hello from docker"
Hello from docker
[email protected]:~# docker run -it ubuntu
[email protected]:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
[email protected]:/#
  • 在容器中部署軟體,安裝build-essentialr-base; build-essential 是編譯軟體包的基礎,提供需要的編譯器、標頭檔案和庫檔案。r-base 是編譯R語言程式包的基礎。
apt-get update
#apt-get install -y build-essential r-base
apt-get install toliet

這一步可以安裝任意的軟體,測試時可以選擇小一點的軟體包。 為了簡單起見, 可以嘗試安裝Apache。通過使用埠對映的方式通過主機IP+埠號的方式訪問容器的Apache應用。

  • 執行docker commit -m 'Add build-essential r-base' -a ct5869 8aca49b869be ct5869/ubuntu-dev:v1''
  • 測試執行新的映象 docker run --rm -it username/ubuntu-dev:v1
  • 掛載宿主機硬碟在容器內部操作, 通過-v引數,路徑都為絕對路徑,docker run --rm -v /host_absolute_dir:/container_absolute_dir username/ubuntu-dev:v1 echo 'test' >/container_absolute_dir/test_file這樣,就相當於把host機目錄/host_absolute_dir連結為docker容器路徑/container_absolute_dir
  • 如果只是自己用,到現在就可以結束了。之後可以在映象裡面繼續更多的操作了
  • 另外還可以運用匯出匯入來遷移映象
    • 匯出映象:docker export image_id >ubuntu-dev.v1.tar
    • 匯入映象:cat ubuntu-dev.v1.tar | docker import - username/ubuntu-dev:v1
  • 如果想把映象分發給別人使用,就需要把映象傳到映象倉庫,比如Docker Hub。 需要先在Docker hub註冊, 用註冊的使用者名稱替換掉前文提到的username
  • 註冊成功之後,在本地伺服器嘗試登入,用以把登入資訊儲存在本地,方便後續使用。 執行docker login,按提示輸入使用者名稱、密碼和郵件。登入成功會返回Login Succeeded
  • 執行docker push username/ubuntu-dev:v1把準備好的映象上傳; 等待片刻,完成上傳。這時就可以再Docker hub上看到上傳的映象了。
  • 其它使用者可以使用 docker pull username/ubuntu-dev:v1來獲取安裝好編 譯環境的ubuntu系統了。

Docker的基本操作

  • 當一個容器不再使用時,執行docker rm container_id移除容器,以節省空間。 這不會對映象造成影響
  • 當一個容器不再使用時,執行docker rm -v container_id移除容器及其掛載卷, 以節省空間。這不會對映象造成影響
  • 批量刪除退出的容器docker rm -v $(docker ps -a -q -f status=exited)
  • 對於只需要單次執行的容器,比如執行一個命令等,則只需要在docker run時新增--rm引數就好。這樣容器執行結束後會自動刪除
  • 執行docker rmi username/ubuntu-dev:v1移除映象
  • 執行docker tag 26d99f722dca username/ubuntu-dev:v0修改映象的名字
  • 執行docker run -d --name=container_name username/ubuntu-dev:v1指定執行的container的名字
  • 執行docker run --rm -ti -v /host_abs_dir:/container_abs_dir:ro username/ubuntu-dev:v1掛載只讀目錄
  • 執行docker stop containde_id/container_name停止映象
  • 執行docker rm $(docker ps -a -q)docker rmi $(docker images -q)移除全部映象。BE CAREFULL
  • 檢視Docker映象的建立歷史 docker history image_name
IMAGE          CREATED       CREATED BY SIZE                COMMENT
3d4f934accdb   7 months ago        /bin/sh -c #(nop) CMD ["/run.sh" ]               0 B                 
aa321fa8d23f   7 months ago        /bin/sh -c #(nop) EXPOSE  3306/tcp 80/tcp        0 B                 
6446fbfc507d   7 months ago        /bin/sh -c #(nop) VOLUME  [/etc/mysql /var/lib   0 B                 
44e98bdf2bbf   7 months ago        /bin/sh -c #(nop) ENV PHP_POST_MAX_SIZE=10M     0 B                 
bedff16caee9   7 months ago        /bin/sh -c #(nop) ENV  PHP_UPLOAD_MAX_FILESIZE   0 B                 
72b723ccc97f   7 months ago        /bin/sh -c mkdir -p /app && rm -fr /var/www/h   0 B
  • 檢視映象的JSON檔案 docker inspect image_name
  • Docker images的安裝路徑為 /var/lib/docker
    • ​​​​​​​/var/lib/docker/{driver-name} will contain the driver specific storage for contents of the images.
    • /var/lib/docker/graph/<id> now only contains metadata about the image,  in the json and layersize files.
  • 檢視Docker 容器啟動和執行日誌
docker logs --tail=all container_id

Dockerfile自動構建映象

除了可以像上面那樣一步步地獲取映象、修改容器、儲存映象、上傳映象等操作外, 還可以使用Dockerfile自動實現上述操作。

典型的Dockerfile如下所示:

FROM alpine
MAINTAINER username [email protected]
RUN apk add --no-cache apache2 apache2-utils
COPY public_html /var/www/html
EXPOSE 80 443
CMD ["rc-service apache2 start"]
  • FROM 為除註釋之外的第一條命令,用來宣告映象的基礎系統。
  • MAINTAINER 設定映象維護人的資訊。
  • RUN 在容器內部執行shell命令。
  • COPY 是把本地的bash配置檔案拷貝到新維護的映象中; COPY的檔案的路徑是相對於docker build的PATH,一般是當前路徑;
  • CMD 指定容易執行時預設執行的命令,如出現多個,只有最後一個會被執行。

執行命令docker build -t="username/httpd-alpine:v1" .就可以構建映象了。 最後的.表示Dockerfile在當前目錄,也可指定其他目錄。public_html必須 與Dockerfile在同一目錄。

Docker的特徵

  • Docker will watch only one single process. If you need multiple processes, you need to add a monitor like Monit or Supervisor at the top-level to take care of the others. But this is not recommended.

Docker使用注意tips

  • 避免安裝不必要的軟體包。
  • 每個容器都只執行一個程序。
  • 最小化層:每執行一個命令,都會產生一個層。

參考資料

  • 入門級 http://blog.saymagic.cn/2015/06/01/learning-docker.html
  • 入門級 https://www.dwhd.org/20151115_140935.html
  • 入門級 http://www.cnblogs.com/kevinX/p/5458244.html
  • Start (english version) https://scotch.io/tutorials/getting-started-with-docker
  • Start (english version) https://prakhar.me/docker-curriculum/
  • Greate english version https://blog.talpor.com/2015/01/docker-beginners-tutorial/
  • Docker trick https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/
  • Docker root and non-root http://www.2cto.com/os/201508/432930.html

原文連結:GitHub: http://blog.genesino.com/2016/07/docker/CSDN: http://blog.csdn.net/qazplm12_3/article/details/73436708