【生信】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的安裝可以直接使用系統自帶的
yum
或apt
工具, 啟動和配置如上。
apt-get install docker.io
Docker的使用者許可權管理
預設情況下,Docker命令的執行需要root使用者許可權。一個解決辦法是把使用者加入docker
使用者組,原因是Docker能夠將/run/docker.socket
的檔案許可權設為660
、使用者組設為docker
。當把使用者加入到docker
使用者組後,就無需使用sudo
或su
命令切換獲取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-essential
和r-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