-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
root
committed
Jan 4, 2020
1 parent
77e595b
commit 5e420a8
Showing
5 changed files
with
922 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,234 @@ | ||
## Dockerfile 基础命令 | ||
|
||
### 1、基本结构 | ||
|
||
Dockerfile 由一行行命令语句组成,并且支持以 `#` 开头的注释行。 | ||
|
||
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。 | ||
|
||
例如 | ||
|
||
```dockerfile | ||
# This dockerfile uses the ubuntu image | ||
# VERSION 2 - EDITION 1 | ||
# Author: docker_user | ||
# Command format: Instruction [arguments / command] .. | ||
|
||
# Base image to use, this must be set as the first line | ||
FROM ubuntu | ||
|
||
# Maintainer: docker_user <docker_user at email.com> (@docker_user) | ||
MAINTAINER docker_user [email protected] | ||
|
||
# Commands to update the image | ||
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list | ||
RUN apt-get update && apt-get install -y nginx | ||
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf | ||
|
||
# Commands when creating a new container | ||
CMD /usr/sbin/nginx | ||
``` | ||
|
||
其中,一开始必须指明所基于的镜像名称,接下来推荐说明维护者信息。 | ||
|
||
后面则是镜像操作指令,例如 `RUN` 指令,`RUN` 指令将对镜像执行跟随的命令。每运行一条 `RUN` 指令,镜像添加新的一层,并提交。 | ||
|
||
最后是 `CMD` 指令,来指定运行容器时的操作命令。 | ||
|
||
下面是一个更复杂的例子 | ||
|
||
```dockerfile | ||
# Nginx | ||
# | ||
# VERSION 0.0.1 | ||
|
||
FROM ubuntu | ||
MAINTAINER Victor Vieux <[email protected]> | ||
|
||
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server | ||
|
||
# Firefox over VNC | ||
# | ||
# VERSION 0.3 | ||
|
||
FROM ubuntu | ||
|
||
# Install vnc, xvfb in order to create a 'fake' display and firefox | ||
RUN apt-get update && apt-get install -y x11vnc xvfb firefox | ||
RUN mkdir /.vnc | ||
# Setup a password | ||
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd | ||
# Autostart firefox (might not be the best way, but it does the trick) | ||
RUN bash -c 'echo "firefox" >> /.bashrc' | ||
|
||
EXPOSE 5900 | ||
CMD ["x11vnc", "-forever", "-usepw", "-create"] | ||
|
||
# Multiple images example | ||
# | ||
# VERSION 0.1 | ||
|
||
FROM ubuntu | ||
RUN echo foo > bar | ||
# Will output something like ===> 907ad6c2736f | ||
|
||
FROM ubuntu | ||
RUN echo moo > oink | ||
# Will output something like ===> 695d7793cbe4 | ||
|
||
# You᾿ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with | ||
# /oink. | ||
``` | ||
|
||
### 2、指令 | ||
|
||
指令的一般格式为 `INSTRUCTION arguments`,指令包括 `FROM`、`MAINTAINER`、`RUN` 等。 | ||
|
||
#### 2.1 FROM | ||
|
||
格式为 `FROM <image>`或`FROM <image>:<tag>`。 | ||
|
||
第一条指令必须为 `FROM` 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 `FROM` 指令(每个镜像一次)。 | ||
|
||
#### 2.2 MAINTAINER | ||
|
||
格式为 `MAINTAINER <name>`,指定维护者信息。 | ||
|
||
#### 2.3 RUN | ||
|
||
格式为 `RUN <command>` 或 `RUN ["executable", "param1", "param2"]`。 | ||
|
||
前者将在 shell 终端中运行命令,即 `/bin/sh -c`;后者则使用 `exec` 执行。指定使用其它终端可以通过第二种方式实现,例如 `RUN ["/bin/bash", "-c", "echo hello"]`。 | ||
|
||
每条 `RUN` 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 `\` 来换行。 | ||
|
||
#### 2.4 CMD | ||
|
||
支持三种格式 | ||
|
||
- `CMD ["executable","param1","param2"]` 使用 `exec` 执行,推荐方式; | ||
- `CMD command param1 param2` 在 `/bin/sh` 中执行,提供给需要交互的应用; | ||
- `CMD ["param1","param2"]` 提供给 `ENTRYPOINT` 的默认参数; | ||
|
||
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 `CMD` 命令。如果指定了多条命令,只有最后一条会被执行。 | ||
|
||
如果用户启动容器时候指定了运行的命令,则会覆盖掉 `CMD` 指定的命令。 | ||
|
||
#### 2.5 EXPOSE | ||
|
||
格式为 `EXPOSE <port> [<port>...]`。 | ||
|
||
告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。 | ||
|
||
#### 2.6 ENV | ||
|
||
格式为 `ENV <key> <value>`。 指定一个环境变量,会被后续 `RUN` 指令使用,并在容器运行时保持。 | ||
|
||
例如 | ||
|
||
```dockerfile | ||
ENV PG_MAJOR 9.3 | ||
ENV PG_VERSION 9.3.4 | ||
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && … | ||
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH | ||
``` | ||
|
||
#### 2.7 ADD | ||
|
||
格式为 `ADD <src> <dest>`。 | ||
|
||
该命令将复制指定的 `<src>` 到容器中的 `<dest>`。 其中 `<src>` 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。 | ||
|
||
#### 2.8 COPY | ||
|
||
格式为 `COPY <src> <dest>`。 | ||
|
||
复制本地主机的 `<src>`(为 Dockerfile 所在目录的相对路径)到容器中的 `<dest>`。 | ||
|
||
当使用本地目录为源目录时,推荐使用 `COPY`。 | ||
|
||
#### 2.9 ENTRYPOINT | ||
|
||
两种格式: | ||
|
||
- `ENTRYPOINT ["executable", "param1", "param2"]` | ||
- `ENTRYPOINT command param1 param2`(shell中执行)。 | ||
|
||
配置容器启动后执行的命令,并且不可被 `docker run` 提供的参数覆盖。 | ||
|
||
每个 Dockerfile 中只能有一个 `ENTRYPOINT`,当指定多个时,只有最后一个起效。 | ||
|
||
#### 2.10 VOLUME | ||
|
||
格式为 `VOLUME ["/data"]`。 | ||
|
||
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。 | ||
|
||
#### 2.11 USER | ||
|
||
格式为 `USER daemon`。 | ||
|
||
指定运行容器时的用户名或 UID,后续的 `RUN` 也会使用指定用户。 | ||
|
||
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:`RUN groupadd -r postgres && useradd -r -g postgres postgres`。要临时获取管理员权限可以使用 `gosu`,而不推荐 `sudo`。 | ||
|
||
#### 2.12 WORKDIR | ||
|
||
格式为 `WORKDIR /path/to/workdir`。 | ||
|
||
为后续的 `RUN`、`CMD`、`ENTRYPOINT` 指令配置工作目录。 | ||
|
||
可以使用多个 `WORKDIR` 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如 | ||
|
||
```dockerfile | ||
WORKDIR /a | ||
WORKDIR b | ||
WORKDIR c | ||
RUN pwd | ||
``` | ||
|
||
则最终路径为 `/a/b/c`。 | ||
|
||
#### 2.13 ONBUILD | ||
|
||
格式为 `ONBUILD [INSTRUCTION]`。 | ||
|
||
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。 | ||
|
||
例如,Dockerfile 使用如下的内容创建了镜像 `image-A`。 | ||
|
||
```dockerfile | ||
[...] | ||
ONBUILD ADD . /app/src | ||
ONBUILD RUN /usr/local/bin/python-build --dir /app/src | ||
[...] | ||
``` | ||
|
||
如果基于 image-A 创建新的镜像时,新的Dockerfile中使用 `FROM image-A`指定基础镜像时,会自动执行`ONBUILD` 指令内容,等价于在后面添加了两条指令。 | ||
|
||
```dockerfile | ||
FROM image-A | ||
|
||
#Automatically run the following | ||
ADD . /app/src | ||
RUN /usr/local/bin/python-build --dir /app/src | ||
``` | ||
|
||
使用 `ONBUILD` 指令的镜像,推荐在标签中注明,例如 `ruby:1.9-onbuild`。 | ||
|
||
### 3、创建镜像 | ||
|
||
编写完成 Dockerfile 之后,可以通过 `docker build` 命令来创建镜像。 | ||
|
||
基本的格式为 `docker build [选项] 路径`,该命令将读取指定路径下(包括子目录)的 Dockerfile,并将该路径下所有内容发送给 Docker 服务端,由服务端来创建镜像。因此一般建议放置 Dockerfile 的目录为空目录。也可以通过 `.dockerignore` 文件(每一行添加一条匹配模式)来让 Docker 忽略路径下的目录和文件。 | ||
|
||
要指定镜像的标签信息,可以通过 `-t` 选项,例如 | ||
|
||
```shell | ||
$ sudo docker build -t myrepo/myapp /tmp/test1/ | ||
``` | ||
|
||
## 引用 | ||
|
||
[Dockerfile介绍](http://dockerinfo.net/dockerfile介绍) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
## Supervisor管理进程 | ||
|
||
|
||
Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。 | ||
|
||
本小节将使用进程管理工具 supervisor 来管理容器中的多个进程。使用 Supervisor 可以更好的控制、管理、重启我们希望运行的进程。在这里我们演示一下如何同时使用 ssh 和 apache 服务。 | ||
|
||
### 配置 | ||
|
||
首先创建一个 Dockerfile,内容和各部分的解释如下。 | ||
|
||
```dockerfile | ||
FROM ubuntu:13.04 | ||
MAINTAINER [email protected] | ||
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list | ||
RUN apt-get update | ||
RUN apt-get upgrade -y | ||
``` | ||
|
||
### 安装 ssh、apache 和 supervisor | ||
|
||
```dockerfile | ||
RUN apt-get install -y openssh-server apache2 supervisor | ||
RUN mkdir -p /var/run/sshd | ||
RUN mkdir -p /var/log/supervisor | ||
``` | ||
|
||
这里安装 3 个软件,还创建了 2 个 ssh 和 supervisor 服务正常运行所需要的目录。 | ||
|
||
```dockerfile | ||
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf | ||
``` | ||
|
||
添加 supervisord 的配置文件,并复制配置文件到对应目录下面。 | ||
|
||
```dockerfile | ||
EXPOSE 22 80 | ||
CMD ["/usr/bin/supervisord"] | ||
``` | ||
|
||
这里我们映射了 22 和 80 端口,使用 supervisord 的可执行路径启动服务。 | ||
|
||
### supervisor配置文件内容 | ||
|
||
```shell | ||
[supervisord] | ||
nodaemon=true | ||
[program:sshd] | ||
command=/usr/sbin/sshd -D | ||
|
||
[program:apache2] | ||
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND" | ||
``` | ||
|
||
配置文件包含目录和进程,第一段 supervsord 配置软件本身,使用 nodaemon 参数来运行。第二段包含要控制的 2 个服务。每一段包含一个服务的目录和启动这个服务的命令。 | ||
|
||
### 使用方法 | ||
|
||
创建镜像。 | ||
|
||
```shell | ||
$ sudo docker build -t test/supervisord . | ||
``` | ||
|
||
启动 supervisor 容器。 | ||
|
||
```shell | ||
$ sudo docker run -p 22 -p 80 -t -i test/supervisord | ||
2013-11-25 18:53:22,312 CRIT Supervisor running as root (no user in config file) | ||
2013-11-25 18:53:22,312 WARN Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing | ||
2013-11-25 18:53:22,342 INFO supervisord started with pid 1 | ||
2013-11-25 18:53:23,346 INFO spawned: 'sshd' with pid 6 | ||
2013-11-25 18:53:23,349 INFO spawned: 'apache2' with pid 7 | ||
``` | ||
|
||
使用 `docker run` 来启动我们创建的容器。使用多个 `-p` 来映射多个端口,这样我们就能同时访问 ssh 和 apache 服务了。 | ||
|
||
可以使用这个方法创建一个只有 ssh 服务的基础镜像,之后创建镜像可以使用这个镜像为基础来创建 | ||
|
||
## 引用 | ||
|
||
[实例 使用 Supervisor 来管理进程](http://dockerinfo.net/案例-使用-supervisor-来管理进程) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.