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

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

Docker用户权限

默认情况下,Docker命令的运行需要根用户权限。一个解决办法是把用户加入docker用户组,原因是Docker能够将/run/docker.socket的文件权限设为660、用户组设为docker。当把用户加入到docker用户组后,就无需使用sudosu命令切换获取根用户权限。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-essentialr-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 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 username@internet.com
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使用注意

  • 避免安装不必要的软件包。
  • 每个容器都只运行一个进程。
  • 最小化层:每执行一个命令,都会产生一个层。

参考

  • 入门级 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

原文发布于微信公众号 - 生信宝典(Bio_data)

原文发表时间:2017-06-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

Docker中配置centos容器支持ssh

image.png 在Docker起步中,已经下载了ubuntu系统镜像,启动容器后成功执行了一个简单的系统命令 此时的容器是封闭的,下面我们就建立起和容器的沟...

4198
来自专栏生信宝典

Docker基本使用

Docker能做什么 The key benefit of Docker is that it allows users to package an appli...

2007
来自专栏小狼的世界

创建自己的Docker基础镜像

Docker 提供了两种方法来创建基础镜像,一种是通过引入tar包的形式,另外一种是通过一个空白的镜像来一步一步构建,本文使用的是第二种方法,既FROM scr...

2332
来自专栏糊一笑

小白学Docker之Compose

承接上篇文章:小白学Docker之基础篇,自学网站来源于https://docs.docker.com/get-started 系列文章: 小白学Docker之...

38611
来自专栏测试驿栈

Docker_部署jenkins(dockerfile实现)

我用的是ubuntu14.04的基础镜像,并且在基础镜像中已经把ant,tomcat,jdk的安装包配置好了。具体的这里不做赘述。

1.4K3
来自专栏性能与架构

轻量级容器Docker的核心概念

image.png Docker镜像 Docker镜像(Image)类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读模板,包含了文件系统 例如:一...

3775
来自专栏散尽浮华

Docker容器学习梳理--日常操作总结

使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Com...

4535
来自专栏田飞雨的专栏

Docker 使用指南 (一)—— 基本操作

Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便...

9.4K3
来自专栏zhisheng

Docker 入门(一):理解三大核心

Docker 的前世今生 Docker 的核心理念是 Build, Ship, and Run Any App, Anywher,即一次封装,到处运行。 从前,...

3957
来自专栏你不就像风一样

史上最全面的Docker构建工具使用教程

Docker 是一个开源的应用容器引擎,基于 Go 语言] 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可...

1722

扫码关注云+社区

领取腾讯云代金券