LOADING

Follow me

Docker初级教程【zoues.com】
三月 21, 2017|DockerPaaS

Docker初级教程【zoues.com】

Docker初级教程【zoues.com】

一、Docker 介绍

Docker初级教程

Docker 是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker的应用场景

1、Web 应用的自动化打包和发布。

2、自动化测试和持续集成、发布。

3、在服务型环境中部署和调整数据库或其他的后台应用。

  Docker 的优点

1、简化程序:
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就能完成。

2、避免选择恐惧症:
如果你有选择恐惧症,还是资深患者。Docker 帮你打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。

3、节省开支:
一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。

二、Docker 架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类。

Docker 面向对象
容器 对象
镜像

Docker初级教程

Docker 镜像(Images)

Docker 镜像是用于创建 Docker 容器的模板。

Docker 容器(Container)

容器是独立运行的一个或一组应用。

Docker 客户端(Client)

Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。

Docker 主机(Host)

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

Docker 仓库(Registry)

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。

Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。

Docker Machine

Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

三、Docker 常用命令

容器生命周期管理

  • run start/stop/restart kill rm pause/unpause create exec

容器操作

  • ps inspect top attach events logs wait export port

容器rootfs命令

  • commit cp diff

镜像仓库

  • login pull push search

本地镜像管理

  • images rmi tag build history save import

info|version

  • info version

四、Dockerfile

Dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

Dockerfile 语法

在我们深入讨论Dockerfile之前,让我们快速过一下Dockerfile的语法和它们的意义。

什么是语法?

非常简单,在编程中,语法意味着一个调用命令,输入参数去让应用执行程序的文法结构。这些语法被规则或明或暗的约束。程序员遵循语法规范以和计算机 交互。如果一段程序语法不正确,计算机将无法识别。Dockerfile使用简单的,清楚的和干净的语法结构,极为易于使用。这些语法可以自我释义,支持注释。

Dockerfile 语法示例

Dockerfile语法由两部分构成,注释和命令+参数

  1. # Line blocks used for commenting

  2. command argument argument ..

一个简单的例子:

  1. # Print "Hello docker!"

  2. RUN echo "Hello docker!"

Dockerfile 命令

Dockerfile有十几条命令可用于构建镜像,下文将简略介绍这些命令。

ADD

ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

  1. # Usage: ADD [source directory or URL] [destination directory]

  2. ADD /my_app_folder /my_app_folder 

CMD

和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

  1. # Usage 1: CMD application "argument", "argument", ..

  2. CMD "echo" "Hello docker!"

ENTRYPOINT

ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。

  1. # Usage: ENTRYPOINT application "argument", "argument", ..

  2. # Remember: arguments are optional. They can be provided by CMD

  3. # or during the creation of a container.

  4. ENTRYPOINT echo

  5. # Usage example with CMD:

  6. # Arguments set with CMD can be overridden during *run*

  7. CMD "Hello docker!"

  8. ENTRYPOINT echo

ENV 

ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

  1. # Usage: ENV key value

  2. ENV SERVER_WORKS 4

EXPOSE

EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。

  1. # Usage: EXPOSE [port]

  2. EXPOSE 8080

FROM

FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

  1. # Usage: FROM [image name]

  2. FROM ubuntu 

MAINTAINER

我建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。

  1. # Usage: MAINTAINER [name]

  2. MAINTAINER authors_name 

RUN

RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。

  1. # Usage: RUN [command]

  2. RUN aptitude install -y riak

USER

USER命令用于设置运行容器的UID。

  1. # Usage: USER [UID]

  2. USER 751

VOLUME

VOLUME命令用于让你的容器访问宿主机上的目录。

  1. # Usage: VOLUME ["/dir_1", "/dir_2" ..]

  2. VOLUME ["/my_files"]

WORKDIR

WORKDIR命令用于设置CMD指明的命令的运行目录。

  1. # Usage: WORKDIR /path

  2. WORKDIR ~/

五、示例

CentOS安装Docker

安装命令如下:

[root@qinys-server ~]# yum y install docker

修改 Docker 镜像地址为国内镜像(http://aad0405c.m.daocloud.io):

[root@qinys-server ~]# vim /etc/docker/daemon.json

Docker初级教程

启动 Docker 后台服务:

[root@qinys-server ~]# systemctl start docker

Docker运行hello-world测试

[root@qinys-server ~]# docker run hello-world

Docker初级教程


搜索仓库中的镜像

[root@qinys-server ~]# docker search hello-world

Docker初级教程

拉取仓库中的镜像

[root@qinys-server ~]# docker pull docker.io/jasimpson/hello-world

Docker初级教程

Docker初级教程

创建容器并运行

[root@qinys-server ~]# docker pull docker.io/jasimpson/hello-world

Docker初级教程

通过Dockerfile构建java程序环境并启动程序(构建的java程序用到了dubbo框架,后续会启动一个dubbo-admin监控查看服务运行情况)

1、创建Dockerfile文件

[root@qinys-server mch-jobs]# vim Dockerfile

  1. # 基础镜像,centos操作系统

  2. FROM centos

  3. #作者

  4. MAINTAINER Veesonsan “yushun.qin@midea.com”

  5. # 从本地文件安装 JDK 7,并设置环境变量,add命令会自动解压,copy不会

  6. ADD jdk1.7.0_55.tar.gz /tmp/

  7. RUN mkdir -p /usr/lib/jvm

  8. RUN mv /tmp/jdk1.7.0_55/ /usr/lib/jvm/java-7-oracle/

  9. ENV JAVA_HOME /usr/lib/jvm/java-7-oracle

  10. ENV PATH $PATH:$JAVA_HOME/bin

  11. # 从本地环境拷贝java程序包至容器

  12. RUN mkdir -p /data/app/mch-jobs

  13. ADD job-core-3.1.1-SNAPSHOT-assembly.tar.gz /data/app/mch-jobs

  14. RUN chmod 755 /data/app/mch-jobs/bin/*.sh

  15. # 定义启动命令

  16. ENTRYPOINT cd /data/app/mch-jobs/bin/ && ./restart.sh && tail -f /data/app/mch-jobs/logs/mch-jobs.log

Docker初级教程

2、构建镜像

[root@qinys-server ~]# docker build -t jobs/mch-jobs .

Docker初级教程

Docker初级教程

3、创建mch-jobs容器并后台运行

[root@qinys-server ~]# docker build -t jobs/mch-jobs .

Docker初级教程

[root@qinys-server ~]# docker logs 280d11f8f4352e60e0e6b5ea9352947a1a85cae3be2ded12566e90fe1fa10e67

Docker初级教程

4、启动dubbo-admin并映射容器端口8080为宿主机8090端口

Docker初级教程

Docker初级教程

Docker初级教程

可以看到容器分配到的ip是172.17.0.9


参考资料:

http://www.runoob.com/docker

http://blog.csdn.net/we_shell/article/details/38445979#

no comments
Share

发表评论