Docker 屬于 Linux 容器的一種封裝贴铜,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案瀑晒。
Docker 將應(yīng)用程序與該程序的依賴绍坝,打包在一個文件里面。運(yùn)行這個文件苔悦,就會生成一個虛擬容器轩褐。程序在這個虛擬容器里運(yùn)行,就好像在真實的物理機(jī)上運(yùn)行一樣玖详。有了 Docker把介,就不用擔(dān)心環(huán)境問題勤讽。
總體來說,Docker 的接口相當(dāng)簡單拗踢,用戶可以方便地創(chuàng)建和使用容器脚牍,把自己的應(yīng)用放入容器。容器還可以進(jìn)行版本管理巢墅、復(fù)制诸狭、分享、修改君纫,就像管理普通的代碼一樣驯遇。
一、安裝
詳細(xì)安裝過程可參照官網(wǎng)蓄髓。
1.1 若以前有安裝過舊版本叉庐,先移除舊版本:
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
1.2 安裝依賴
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum-config-manager --enable docker-ce-edge
$ sudo yum-config-manager --enable docker-ce-test
1.3 安裝免費(fèi)版docker
默認(rèn)安裝最新版docker
$ sudo yum install docker-ce
1.4 啟動docker
$ sudo systemctl start docker
1.5 查看docker是否安裝成功
$ sudo docker run hello-world
1.6 加入docker用戶組
Docker 需要用戶具有 sudo 權(quán)限,為了避免每次命令都輸入sudo
双吆,可以把用戶加入 Docker 用戶組(官方文檔)眨唬。
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
檢查一下会前,不使用sudo
來運(yùn)行docker:
[09:40 sxuan@hulab ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
1.7 使用Docker 中國官方鏡像加速
通過 Docker 官方鏡像加速好乐,中國區(qū)用戶能夠快速訪問最流行的 Docker 鏡像。該鏡像托管于中國大陸瓦宜,本地用戶現(xiàn)在將會享受到更快的下載速度和更強(qiáng)的穩(wěn)定性蔚万,從而能夠更敏捷地開發(fā)和交付 Docker 化應(yīng)用。
Docker 中國官方鏡像加速可通過 registry.docker-cn.com 訪問临庇。該鏡像庫只包含流行的公有鏡像反璃。私有鏡像仍需要從美國鏡像庫中拉取。
您可以使用以下命令直接從該鏡像加速地址進(jìn)行拉燃俣帷:
$ docker pull registry.docker-cn.com/myname/myrepo:mytag
# 如下例子:
$ docker pull registry.docker-cn.com/library/ubuntu:16.04
當(dāng)然淮蜈,更簡單的方法是更改配置文件,一勞永逸已卷。修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 鍵值:
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
1.8 設(shè)置docker開機(jī)啟動
# systemd
$ sudo systemctl enable docker
# upstart
$ echo manual | sudo tee /etc/init/docker.override
#chkconfig
$ sudo chkconfig docker on
二梧田、使用Docker
2.1 簡單使用
下面,我們通過最簡單的 image 文件"hello world"侧蘸,感受一下 Docker裁眯。
$ docker image pull library/hello-world
上面代碼中,docker image pull
是抓取 image 文件的命令讳癌。library/hello-world
是 image 文件在倉庫里面的位置穿稳,其中library
是 image 文件所在的組,hello-world
是 image 文件的名字晌坤。
由于 Docker 官方提供的 image 文件逢艘,都放在library
組里面旦袋,所以它的是默認(rèn)組,可以省略埋虹。因此猜憎,上面的命令可以寫成下面這樣。
$ docker image pull hello-world
抓取成功以后搔课,就可以在本機(jī)看到這個 image 文件了胰柑。
docker image ls
現(xiàn)在,運(yùn)行這個 image 文件爬泥。
$ docker container run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
輸出這段提示以后,hello world就會停止運(yùn)行踩官,容器自動終止境输。
值得注意的是docker container run
命令是新建容器蔗牡,每運(yùn)行一次,就會新建一個容器辩越。同樣的命令運(yùn)行兩次信粮,就會生成兩個一模一樣的容器文件黔攒。如果希望重復(fù)使用容器,就要使用docker container start命令强缘,它用來啟動已經(jīng)生成、已經(jīng)停止運(yùn)行的容器文件旅掂。
$ docker container start [containerID]
有些容器不會自動終止商虐,因為提供的是服務(wù)。比如称龙,安裝運(yùn)行 Ubuntu 的 image,就可以在命令行體驗 Ubuntu 系統(tǒng)痴柔。
$ docker container run -it ubuntu bash
對于那些不會自動終止的容器疫向,必須使用docker container kill
命令手動終止。
$ docker container kill [containID]
docker container kill
命令終止容器運(yùn)行谈火,相當(dāng)于向容器里面的主進(jìn)程發(fā)出 SIGKILL 信號糯耍。而docker container stop
命令也是用來終止容器運(yùn)行,相當(dāng)于向容器里面的主進(jìn)程發(fā)出 SIGTERM 信號革为,然后過一段時間再發(fā)出 SIGKILL 信號舵鳞。
這兩個信號的差別是,應(yīng)用程序收到 SIGTERM 信號以后抛虏,可以自行進(jìn)行收尾清理工作套才,但也可以不理會這個信號。如果收到 SIGKILL 信號错忱,就會強(qiáng)行立即終止挂据,那些正在進(jìn)行中的操作會全部丟失。
2.2 容器文件
image 文件生成的容器實例儿普,本身也是一個文件,稱為容器文件个绍。也就是說浪汪,一旦容器生成,就會同時存在兩個文件: image 文件和容器文件广恢。而且關(guān)閉容器并不會刪除容器文件钉迷,只是容器停止運(yùn)行而已。
簡單的理解就是image就是沒有運(yùn)行的container荒椭,container就是運(yùn)行image運(yùn)行生成的容器舰蟆,只有運(yùn)行時才能進(jìn)行一些操作。
# 列出正在運(yùn)行的容器
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUSPORTS NAMES
# 列出本機(jī)所有容器信卡,包括終止運(yùn)行的容器
$ docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e3d2c90f5a4 hello-world "/hello" About an hour ago Exited (0) About anhour ago gracious_hermann
a5c267eb9afc hello-world "/hello" 2 hours ago Exited (0) 2 hours ago boring_stonebraker
# 查看本機(jī)已有的鏡像
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 2cb0d9787c4d 7 weeks ago 1.85kB
pkrusche/hap.py latest f69ea1624f20 15 months ago 2.16GB
# 刪除鏡像
$ docker rmi [image ID]
# 若出現(xiàn)Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container a5c267eb9afc is using its referenced image 2cb0d9787c4d 類似的報錯傍菇,可加-f參數(shù)強(qiáng)制刪除
$ docker rmi -f [image ID]
2.3 一個簡單的實戰(zhàn)
現(xiàn)在利用一個docker打包好的軟件來分析本地數(shù)據(jù)丢习。這里較為重要的一部就是將數(shù)據(jù)映射到容器中的某個目錄下以方便分析淮悼。
2.3.1 拉取所用到的docker鏡像
利用docker pull
命令可以方便的從遠(yuǎn)程倉庫中拉取所需要的軟件鏡像袜腥,這個命令跟git clone
有些許相似。
$ docker pull pkrusche/hap.py
2.3.2 運(yùn)行鏡像生成容器
直接使用docker run
命令來運(yùn)行鏡像:
$ docker run -it --rm -v `pwd`:/data -v /DataBase/Human/GATK_bundle/b37:/data/b37 f69ea1624f20 /bin/bash
-
-it
容器的 Shell 映射到當(dāng)前的 Shell鲤屡,然后你在本機(jī)窗口輸入的命令福侈,就會傳入容器肪凛。 -
--rm
默認(rèn)情況下,每個容器在退出時翘鸭,它的文件系統(tǒng)也會保存下來戳葵,這樣一方面調(diào)試會方便些,因為你可以通過查看日志等方式來確定最終狀態(tài)档址。另外一方面守伸,你也可以保存容器所產(chǎn)生的數(shù)據(jù)。但是當(dāng)你僅僅需要短暫的運(yùn)行一個容器见芹,并且這些數(shù)據(jù)不需要保存蠢涝,你可能就希望Docker能在容器結(jié)束時自動清理其所產(chǎn)生的數(shù)據(jù)。 -
-v
從主機(jī)掛載單個文件或目錄到容器中 -
/bin/bash
為運(yùn)行的容器執(zhí)行的第一個命令
2.3.3 運(yùn)行程序
在使用hap.py
程序之前我們需要先配置程序運(yùn)行所需文件:
$ export HGREF=/data/b37/human_g1k_v37_decoy.fasta
接下來就可以進(jìn)行運(yùn)行程序了:
$ /opt/hap.py/bin/hap.py \
/data/highconf_variation/HG001.highconf_SNP.vcf.gz \
/data/init_fq/gatk_call/variation_b37/raw_snp/HG001.raw_SNP.vcf.gz \
-f /data/rawdata/HG001.Hiseq.b37.bed -o HG001
[I] Total VCF records: 3258078
[I] Non-reference VCF records: 3258078
[I] Total VCF records: 50167
[I] Non-reference VCF records: 50167
Benchmarking Summary:
Type Filter TRUTH.TOTAL TRUTH.TP TRUTH.FN QUERY.TOTAL QUERY.FP QUERY.UNK FP.gt METRIC.Recall METRIC.Precision METRIC.Frac_NA METRIC.F1_Score TRUTH.TOTAL.TiTv_ratio QUERY.TOTAL.TiTv_ratio TRUTH.TOTAL.het_hom_ratio QUERY.TOTAL.het_hom_ratio
SNP ALL 42825 40024 2801 50140 10116 0 212 0.934594 0.798245 0 0.861055 2.543807 2.391331 1.567034 1.646584
SNP PASS 42825 40024 2801 50140 10116 0 212 0.934594 0.798245 0 0.861055 2.543807 2.391331 1.567034 1.646584
為了更方便以后運(yùn)行程序而不必每次運(yùn)行程序都要再次導(dǎo)入設(shè)置環(huán)境變量,有兩種方法可以保存現(xiàn)有容器的狀態(tài):其一為運(yùn)行鏡像時候不使用--rm
命令惕它,下次使用時繼續(xù)使用此容器废登,使用docker start
命令;其二是使用commit
提交生成新的鏡像堡距,以后每次運(yùn)行新的鏡像生成容器即可。
方法1:
# 第一次使用
$ docker run -it -v `pwd`:/data -v /DataBase/Human/GATK_bundle/b37:/data/b37 f69ea1624f20 /bin/bash
# 配置環(huán)境變量
root@f08af3e1ac90:/# echo "export HGREF=/data/b37/human_g1k_v37_decoy.fasta" >> ~/.bashrc && source ~/.bashrc
# 退出
root@2deb07b46456:/# exit
# 查看container ID
$ docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f08af3e1ac90 f69ea1624f20 "/bin/bash" About a minute ago Exited (0) 28 seconds ago focused_kare
# 繼續(xù)使用剛剛的容器
$ docker start -ai f08af3e1ac90
# 進(jìn)入容器后直接運(yùn)行
root@f08af3e1ac90:/# /opt/hap.py/bin/hap.py \
/data/highconf_variation/HG001.highconf_SNP.vcf.gz \
/data/init_fq/gatk_call/variation_b37/raw_snp/HG001.raw_SNP.vcf.gz \
-f /data/rawdata/HG001.Hiseq.b37.bed -o HG001
方法2:
# 第一次使用容器
$ docker run -it -v `pwd`:/data -v /DataBase/Human/GATK_bundle/b37:/data/b37 f69ea1624f20 /bin/bash
# 配置環(huán)境變量
root@f08af3e1ac90:/# echo "export HGREF=/data/b37/human_g1k_v37_decoy.fasta" >> ~/.bashrc && source ~/.bashrc
# 退出
root@f08af3e1ac90:/# exit
# 將容器進(jìn)行commit生成新的鏡像
$ docker commit -m="built env hap.py" --author="shexuan" f08af3e1ac90 hap.py/built_env
# 查看鏡像
[12:08 sxuan@hulab ~/WES]$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hap.py/built_env latest fb593adbe750 About an hour ago 2.19GB
pkrusche/hap.py latest f69ea1624f20 15 months ago 2.16GB
# 使用新的鏡像生成容器
$ docker run -it --rm -v `pwd`:/data -v /DataBase/Human/GATK_bundle/b37:/data/b37 fb593adbe750 /bin/bash
root@52d0e50f8f0c:/# /opt/hap.py/bin/hap.py \
> /data/highconf_variation/HG001.highconf_SNP.vcf.gz \
> /data/init_fq/gatk_call/variation_b37/raw_snp/HG001.raw_SNP.vcf.gz \
> -f /data/rawdata/HG001.Hiseq.b37.bed -o HG001
可以看到兩種方法是都可以正常運(yùn)行的。
docker commit
為使用一個配置發(fā)生改變的的容器生成新的鏡像疚俱,用法如下:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-
-a, --author=
添加作者信息 -
-c, --change=[]
使用Dockerfile指令來創(chuàng)建鏡像 -
-m, --message=
提交時的說明文字 -
-p, --pause=true
在commit時缩多,將容器暫停
一般來說是不推薦直接使用commit
來生成新的鏡像的衬吆,更推薦使用更改dockerfile來生成新的鏡像绳泉。
三、 一些其他的常用命令
docker ps [OPTIONS]
列出容器冒嫡。
-
-a
:顯示所有的容器,包括未運(yùn)行的 -
-f
:根據(jù)條件過濾顯示的內(nèi)容 -
--format
:指定返回值的模板文件 -
-l
:顯示最近創(chuàng)建的容器 -
-n
:列出最近創(chuàng)建的n個容器 -
--no-trunc
:不截斷輸出 -
-q
:靜默模式方咆,只顯示容器編號 -
-s
:顯示總的文件大小
docker top [OPTIONS] CONTAINER [ps OPTIONS]
查看容器中運(yùn)行的進(jìn)程信息瓣赂,支持 ps 命令參數(shù)片拍。
容器運(yùn)行時不一定有/bin/bash終端來交互執(zhí)行top命令,而且容器還不一定有top命令苫纤,可以使用docker top來實現(xiàn)查看container中正在運(yùn)行的進(jìn)程方面。
docker logs [OPTIONS] CONTAINER
獲取容器的日志色徘。
-
-f
: 跟蹤日志輸出 -
--since
:顯示某個開始時間的所有日志 -
-t
: 顯示時間戳 -
--tail
:僅列出最新N條容器日志
# 例子
$ docker logs 52d0e50f8f0c
root@52d0e50f8f0c:/# /opt/hap.py/bin/hap.py \
> /data/highconf_variation/HG001.highconf_SNP.vcf.gz \
> /data/init_fq/gatk_call/variation_b37/raw_snp/HG001.raw_SNP.vcf.gz \
> -f /data/rawdata/HG001.Hiseq.b37.bed -o HG001
[I] Total VCF records: 3258078
[I] Non-reference VCF records: 3258078ll/variation_b37/raw_snp/HG001.raw_SNP.vcf.gz
[I] Total VCF records: 50167
[I] Non-reference VCF records: 50167
Benchmarking Summary:
Type Filter TRUTH.TOTAL TRUTH.TP TRUTH.FN QUERY.TOTAL QUERY.FP QUERY.UNK FP.gt METRIC.Recall METRIC.Precision METRIC.Frac_NA METRIC.F1_Score TRUTH.TOTAL.TiTv_ratio QUERY.TOTAL.TiTv_ratio TRUTH.TOTAL.het_hom_ratio QUERY.TOTAL.het_hom_ratio
SNP ALL 42825 40024 2801 50140 10116 0 212 0.934594 0.798245 0 0.861055 2.543807 2.391331 1.567034 1.646584
SNP PASS 42825 40024 2801 50140 10116 0 212 0.934594 0.798245 0 0.861055 2.543807 2.391331 1.567034 1.646584
docker cp [OPTIONS] CONTAINER:SRC_PATH [DEST_PATH]
用于容器與主機(jī)之間的數(shù)據(jù)拷貝褂策。
-
-L
:保持源目標(biāo)中的鏈接
# 將主機(jī)/www/runoob目錄拷貝到容器96f7f14e99ab的/www目錄下
$ docker cp /www/runoob 96f7f14e99ab:/www/
#將主機(jī)/www/runoob目錄拷貝到容器96f7f14e99ab中斤寂,目錄重命名為www
$ docker cp /www/runoob 96f7f14e99ab:/www
# 將容器96f7f14e99ab的/www目錄拷貝到主機(jī)的/tmp目錄中
docker cp 96f7f14e99ab:/www /tmp/
docker history [OPTIONS] IMAGE
查看指定鏡像的創(chuàng)建歷史。
-
-H
:以可讀的格式打印鏡像大小和日期罗侯,默認(rèn)為true -
--no-trunc
:顯示完整的提交記錄 -
-q
:僅列出提交記錄ID
$ docker history -H hap.py/built_env
IMAGE CREATED CREATED BY SIZE COMMENT
fb593adbe750 2 hours ago /bin/bash 36.4MB built env hap.py
f69ea1624f20 15 months ago /bin/sh -c rm -rf /opt/hap.py-source 0B
<missing> 15 months ago /bin/sh -c #(nop) WORKDIR / 0B
<missing> 15 months ago /bin/sh -c bin/test_haplotypes 0B
<missing> 15 months ago /bin/sh -c #(nop) WORKDIR /opt/hap.py 0B
<missing> 15 months ago /bin/sh -c python install.py /opt/hap.py --w… 370MB
<missing> 15 months ago /bin/sh -c #(nop) WORKDIR /opt/hap.py-source 0B
<missing> 15 months ago /bin/sh -c #(nop) ENV PATH=/usr/local/sbin:/… 0B
<missing> 15 months ago /bin/sh -c wget http://archive.apache.org/di… 36.6MB
<missing> 15 months ago /bin/sh -c #(nop) WORKDIR /opt 0B
<missing> 15 months ago /bin/sh -c #(nop) WORKDIR /opt/hap.py-data 0B
<missing> 15 months ago /bin/sh -c mkdir -p /opt/hap.py-data 0B
<missing> 15 months ago /bin/sh -c #(nop) COPY dir:9d3c8f8028e03cbcc… 453MB
<missing> 15 months ago /bin/sh -c mkdir -p /opt/hap.py-source 0B
<missing> 15 months ago /bin/sh -c echo oracle-java8-installer share… 387MB
<missing> 15 months ago /bin/sh -c pip install bx-python 11.1MB
<missing> 15 months ago /bin/sh -c apt-get clean -y 0B
<missing> 15 months ago /bin/sh -c apt-get install software-properti… 51.7MB
<missing> 15 months ago /bin/sh -c apt-get install python2.7 python2… 312MB
<missing> 15 months ago /bin/sh -c apt-get install git bzip2 wget -y 32.6MB
<missing> 15 months ago /bin/sh -c apt-get install build-essential z… 266MB
<missing> 15 months ago /bin/sh -c apt-get update && apt-get upgrade… 111MB
<missing> 23 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 23 months ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 23 months ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$… 1.9kB
<missing> 23 months ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B
<missing> 23 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B
<missing> 23 months ago /bin/sh -c #(nop) ADD file:cd937b840fff16e04… 127MB