Docker:使用教程

docker 即容器

Docker Registry

Docker 远程镜像仓库

  • DockerHub

  • DaoCloud / Aliyun

Docker Images

Docker Images 是用来创建 docker 容器的只读模版,其中包含了容器启动所需要的所有配置信息和运行程序,一次构建之后可以多次复用。

从结构上来讲,Docker Image 是分层次的,如图所示:

这样就自然出现了父镜像和基础镜像的概念,在图中,每一个上层镜像都是依赖于下一层的镜像,所以下层镜像可称为上层镜像的父镜像,而最底层的镜像是没有父镜像的,可称其为基础镜像(Base Image)。

实际场景下,一般我们自己创建的镜像都会依赖于某个 Linux 操作系统的镜像,例如 ubuntu,大多数情况下,我们可称其为基础镜像,但是我们也可以查看 ubuntu 镜像的 Dockerfile 会发现,它也是依赖于一个叫 scratch 的镜像,scratchdocker 的一个空镜像,里面只有 docker 加入的一些元数据,如果我们想要追求自己的镜像尽可能的轻量,也可以将 scratch 镜像作为我们的基础镜像来构建。

Dockerfile

Dockerfile 是用来说明如何自动构建 docker image 的指令集文件,在 Dockerfile 中编写好指令集之后,我们就可以通过 docker build 命令构建镜像,Dockerfile 文件中命令的顺序就是构建过程中执行的顺序。

以下为几个常用的指令:

1. FROM:依赖镜像

所有 Dockerfile 都必须以 FROM 命令开始,表示其依赖的镜像。


2. MAINTAINER:镜像作者信息

3. RUN:在shell或者exec的环境下执行的命令

4. ADD:将主机文件复制到容器中

5. CMD:指定容器启动默认执行的命令

6. EXPOSE:指定容器在运行时监听的端口

7. WORKDIR:指定RUNCMDENTRYPOINT 命令的工作目录

8. VOLUME:授权访问从容器内到主机上的目录

关于 Dockerfile 编写有以下几点需要注意:

  • 尽量不要省略 MAINTAINER 信息。

  • EXPOSE 的端口不使用公有端口。

  • CMDENTRYPOINT 命令使用数组语法。

另外,在国内使用 docker(以 ubuntu 为例), Dockerfile 第一个执行的命令最好为(具体原因你猜):


Docker Container

Docker Container 中包含了我们的应用代码和代码执行的环境,是用来打包分发代码的单元。

首先要编写 Dockerfile,在文件中写入构建镜像需要的指令集,然后执行下面命令:


例如,我们构建一个 mysql 的镜像,先编写 Dockerfile

<span class="hljs-comment"># Install Base.
RUN \
sed -i <span class="hljs-string">'s/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
apt-get update && \
apt-get -y upgrade && \
apt-get install -y build-essential && \
apt-get install -y software-properties-common && \
apt-get install -y byobu curl git htop man unzip vim wget

RUN apt-get -y install mysql-server

EXPOSE 3306

CMD [<span class="hljs-string">"mysqld"]

执行


构建工具将先在本地查找 ubuntu:14.04 的镜像,如果有,则直接依赖使用,如果没有,将去远程的仓库中下载官方构建的 ubuntu:14.04 的镜像,当然因为一些不可描述的原因,这个下载过程成功率不大,而且非常耗时,所以我们可以做如下优化:


然后将 DockerfileFROM 命令修改为:


这样,就节省了很多的时间。

总之,在安装环境的过程中,因为某个伟大的防火墙工程,我们需要的大部分资源都没法顺利的获取到,解决办法就是将下载的源换成国内某些厂商提供的镜像源。(推荐阿里云,毕竟有钱,稳定。)

经过一段时间的自动构建,便可生成一个可用的 mysql 镜像,使用 docker images 命令查看构建好的镜像列表,输出:


删除一个镜像,使用下面命令:


有了基础的镜像模板之后,就可以创建容器来执行应用代码,具体用到 run 命令:


例如我们要创建一个运行 mysql 的容器,可以执行


这条命令将创建后台执行的 mysql 容器,里面运行一个 mysql 服务器,可以使用 docker ps 命令查看启动的容器。

  • -d 参数表示后台守护进程运行容器。

  • --name 参数表示容器的名称,可随意取。

  • -v 表示主机和容器共享文件的映射,容器的目录就是 Dockerfile 中用 VOLUME 命令定义的目录。

  • -p 表器主机和容器端口映射,容器的端口就是 Dockerfile 中用 EXPOSE 命令绑定的端口。

关于创建容器的时候的坑:

一般来说,我们会在 Dockerfile 中的最后用 CMD 命令定义容器启动之后执行的命令,但是如果我们定义的命令执行报错或者命令没有创建一个守护进程的话,docker ps 之后是看不到容器在运行的,此时可以使用 docker l ogs 命令查看容器启动的日志,进行排错。

当然,我们也可以在 run 的时候定义容器启动的命令,例如下面命令将启动一个 ubuntu 的容器,并执行 /bin/bash 程序,进入 ubuntu 的 terminal:


此命令成功的标志就是你会发现命令行变成了类似:


说明现在已经进入了 ubuntu 的容器中,可以直接在此命令行中操作 ubuntu,或者输入 exit 回车之后即可退出,退出之后再 docker ps 会发现容器也不再运行了。

一些常用命令:

  • docker ps -a 命令可以列出所有的容器,包括已经终止运行的。

  • docker rm container_name/container_id 可以删除某个容器。

  • docker start container_name/container_id 启动某个容器。

  • docker stop container_name/container_id 终止某个容器。

  • docker exec -it contaner_name /bin/bash 在容器中执行 /bin/bash,执行该命令之后将可以以交互命令行的方式操作容器,另外 /bin/bash 可以替换成任意可执行命令。

docker-compose 是用来创建和管理多容器应用的工具,使用 docker-compose 只需三步:

  1. 编写应用运行环境的 Dockerfile,即 image。

  2. 编写 docker-compose.yml,在 services 块下指定容器相关参数以及与其它容器的依赖关系。

  3. 执行 docker-compose up,运行应用。

一个简单的 docker-compose.yml 如下:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Centos系统之Shell编程基础知识
从Export理解Shell环境和变量生存期
linux shell数组变量、类型及规则
Centos编程Shell基本工作原理方案
Centos操作系统编程之Shell 问答录
rsync-linux备份脚本
Linux Shell编程入门 1-4
用shc加密shell脚本
centos每天自动备份mysql数据库
shell字符串处理
awk&#160;用法:awk&#160;&#39;&#160;pattern&#160;{action}&#160;&#39; 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FI
sed之仅打印相邻重复的行 cat file aaa bbb bbb ccc ddd eee eee fff 只显示重复的行: bbb bbb eee eee sed -n &#39;:a;N;/\(
压缩: tar -zcvf 压缩后文件名.tar.gz 被压缩文件 解压: tar -zxvf 被解压文件 注意:不要有多余的空格,一个空格即可。 具体的可以在linux环境下 用 tar --hel
sed命令行格式为: sed [-nefri] ‘command’ 输入文本/文件 常用选项: -n∶取消默认的输出,使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料
#假设文件名是:fortest.gtfdeclare -i fileLinesfileLines=`sed -n &#39;$=&#39; fortest.gtf`echo $fileLines#--
获得每行的最后一个逗号后边的内容.例如:KIAA1967 KIAA1967, xxxxSECIS biding proin 2-like, SECISBP2L, yyyy 1234ankyrin re
bash 正则表达式匹配,一行文本中 “包含 ABC” 并且 “不包含 XYZ”A文件: XXXX ABC XXX4444444444444444XXXX ABC XXX XYZ66666666666
shell/bash 让vi/vim显示空格,及tab字符Vim 可以用高亮显示空格和TAB。文件中有 TAB 键的时候,你是看不见的。要把它显示出来::set listTAB 键显示为 ^I, $显
输出到文件log中,并在屏幕上显示:#ls &gt;&amp;1 | tee log追加输出到文件log中,并在屏幕上显示:#ls &gt;&amp;1 | tee -a log
Suppose we have a file contains the following information, termed input_file:A 0B 1C 21.Read file on