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 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

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

原文发表时间:2017-05-11

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python3

Docker修改hosts

Docker修改hosts?这还不简单,打开vim直接敲就完事儿了!然而事与愿违,事情没有我们想的那么简单。在很多场景中,比如我们需要搭建一个集群,这时候容器要...

6862
来自专栏散尽浮华

Docker容器学习梳理--私有仓库Registry使用

但有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,这点跟Maven的管理类似。 使用私...

2268
来自专栏散尽浮华

Docker容器学习梳理--Volume数据卷使用

之前部署了Docker容器学习梳理--基础环境安装,接下来看看Docker Volume的使用。 Docker volume使用 Docker中的数据可以存储在...

6698
来自专栏糊一笑

小白学Docker之基础篇

系列文章: 小白学Docker之基础篇 小白学Docker之Compose 小白学Docker之Swarm PS: 以下是个人作为新手小白学习docker的笔记...

4974

使用ACS和Kubernetes部署Red Hat JBoss Fuse

红帽JBoss Fuse 十多年来一直是构建Java Web / RESTful服务的实际标准。但是,如何在当今以云为中心的世界中该怎样高效运行?如您所见,基础...

2436
来自专栏散尽浮华

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

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

4285
来自专栏吴伟祥

Docker学习——三大组件的应用(二) 顶

Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。 下面将介绍更多关于镜像的内容,包括:从仓库获取镜像...

1172
来自专栏田飞雨的专栏

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

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

9.3K3
来自专栏编程坑太多

跟我一起学docker(三)--镜像的常用操作

1556
来自专栏性能与架构

Docker中配置centos容器支持ssh

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

3928

扫码关注云+社区