专栏名称: 生信宝典
生物信息分析入门、晋级和经验分享。Linux、R、Python学习教程;高通量测序数据分析学习教程;生信软件安装教程。所有内容均为原创分享,致力于从基础学习到提高整个过程。
目录
相关文章推荐
生物学霸  ·  投资 55.12 亿,新「海洋大学」来了 ·  15 小时前  
BioArt  ·  Nat Biotechnol | ... ·  3 天前  
生物制品圈  ·  双雄争霸迎来群雄逐鹿,即将上市的十款减肥药 ·  4 天前  
生物制品圈  ·  硕腾2024年财报:中国市场迎来转折,业绩同 ... ·  5 天前  
51好读  ›  专栏  ›  生信宝典

用了Docker,妈妈再也不担心我的软件安装了 - 基础篇

生信宝典  · 公众号  · 生物  · 2017-06-19 06:04

正文

Docker能做什么

The key benefit of Docker is that it allows users to package an application with all of its dependencies into a standardized unit for software development.

  • 提供一个虚拟的操作平台,供我们安装依赖不同版本系统的工具软件。

  • 提供一个即时可用的应用软件或者流程的镜像,开发者把软件部署到系统镜像中, 使用者可以直接下载下来使用,省去了个人安装软件的烦恼。

  • 提供一个系统资源分配手段,给不同用户的程序分配独立的计算资源。

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与数据库容器通讯。

安装和配置

  • 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
  • 其他新版操作系统的安装可以直接使用系统自带的 yum apt 工具, 启动和配置如上。

    apt-get install docker.io

Docker用户权限

默认情况下,Docker命令的运行需要根用户权限。一个解决办法是把用户加入 docker 用户组,原因是Docker能够将 /run/docker.socket 的文件权限设为 660 、用户组设为 docker 。当把用户加入到 docker 用户组后,就无需使用 sudo su 命令切换获取根用户权限。check here

###以下操作都是在根用户下进行的

###增加一个用户组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 ; 镜像的名字通常由 用户名/镜像名 构成, 无用户名的为官方认证镜像。

    root@server:~# 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 获取镜像的最新版本(不指定版本号即为latest)

    • 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 --rm ubuntu echo "Hello from docker"
    Hello from docker

    交互式运行容器 docker run -it ubuntu , 这时可以发现终端的用户名变了

    root@server:~# docker run -it ubuntu
    root@57cb695e904f:/# ls
    bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
    boot  etc  lib   media  opt  root  sbin  sys  usr
    root@57cb695e904f:/#

    docker run --help 可以查看这个命令的参数。

  • 在容器中部署软件,安装 build-essential r-base ; build-essential 是编译软件包的基础,提供需要的编译器、头文件和库文件。 r-base 是编译R语言程序包的基础。

    apt-get update
    #apt-get install -y build-essential r-base
    apt-get install toliet

    这一步我们可以安装任意的软件,测试时可以选择小一点的软件包。 最开始时选择了安装 build-essential , 只是为了学习, 到后来发现安装这个并没有什么用,也不方便测试。为了简单起见, 可以尝试安装 Apache 。在本文后面有个简单的测试 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







请到「今天看啥」查看全文