Skip to content

Commit

Permalink
添加文档
Browse files Browse the repository at this point in the history
  • Loading branch information
root committed Jan 4, 2020
1 parent 77e595b commit 5e420a8
Show file tree
Hide file tree
Showing 5 changed files with 922 additions and 3 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@

1. [vue入门](./vuejs/vue入门.md)

## protocol buffer

1. [Proto3参考文档](./protobuf/proto3.md)

## 数据库

1. [mysql存储过程](./数据库/mysql存储过程.md)
Expand All @@ -136,6 +140,8 @@
1. [镜像下载加速](./docker/镜像下载加速.md)
2. [基础命令](./docker/基础命令.md)
3. [创建镜像](./docker/创建镜像.md)
4. [Dockerfile](./docker/dockerfile.md)
5. [Supervisor管理进程](./docker/supervisor管理进程.md)

## linux

Expand Down
234 changes: 234 additions & 0 deletions docker/dockerfile.md
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介绍)

83 changes: 83 additions & 0 deletions docker/supervisor管理进程.md
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-来管理进程)

33 changes: 30 additions & 3 deletions linux/查看占用端口的进程.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## 查看端口占用情况
### 1、lsof命令

`lsof -i`:用于查看所有IPV4/6端口占用情况

Expand Down Expand Up @@ -27,8 +27,7 @@ java 9535 root 149u IPv4 148223160 0t0 TCP 192.168.10.110:64885->192.
> NODE:索引节点(文件在磁盘上的标识)
> NAME:打开文件的确切名称

## 查看TCP、UDP的端口和进程情况
### 2、netstate命令

`netstat -tunlp`用于显示tcp、udp的端口和进程等相关情况。

Expand Down Expand Up @@ -59,5 +58,33 @@ tcp 0 0 0.0.0.0:8001 0.0.0.0:* LISTEN 10600/java
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1124/nginx
```

### 3、ps命令

`ps -aux`用于显示当前进程的状态

> a:显示所有进程
>
> -a:显示同一终端下的所有程序
>
> -A:显示所有进程
>
> c:显示进程的真实名称
>
> f:显示程序间的关系
>
> -au:显示较详细的资讯
>
> -aux:显示所有包含其他使用者的进程
```shell
[root@yw ~]# ps -aux | grep docker
```

### 4、pgrep命令

pgrep专门用于查询进程

```shell
[root@yw ~]# pgrep docker
```

Loading

0 comments on commit 5e420a8

Please sign in to comment.