Dockerfile简介

Dockerfile 是一个用来构建镜像的文本文件。文本内容包含了一条条构建镜像所需的指令和说明。

Docker通过读取Dockerfile中的指令自动生成映像。用docker build命令来执行构建。可以加-f标志指向文件系统中任何位置的Dockerfile。例如:

docker build -f /path/to/a/Dockerfile

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

常用指令

  • FROM:指定基础镜像,必须为第一个命令
  • MAINTAINER: 维护者信息
  • RUN:构建镜像时执行的命令
  • ADD:将本地文件添加到容器中,tar文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
  • COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
  • CMD:构建容器后调用,也就是在容器启动时才进行调用。
  • ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
  • LABEL:用于为镜像添加元数据
  • ENV:设置环境变量
  • EXPOSE:指定于外界交互的端口
  • VOLUME:用于指定持久化目录
  • WORKDIR:工作目录,类似于cd命令
  • USER:用于指定执行后续命令的用户和用户组,只是切换后续命令执行的用户(用户和用户组必须提前创建)
  • ARG:用于指定传递给构建运行时的变量
  • ONBUILD:用于设置镜像触发器

下面这张图有点意思,总结的不错:

image-20210131104321093

构建示例

下面用一个构建Nginx的简单示例来讲解构建的步骤。

A. 先在装有docker的主机上新建一个目录docker-demo,进入这个目录,下载nginx-1.18.0.tar.gz,接着新建Dockerfile并加入下面的配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Version 1.0

# Base images 基础镜像
FROM centos

# MAINTAINER 维护者信息
MAINTAINER qinchende

# ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH

# ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.18.0.tar.gz /usr/local/
# ADD epel-release-latest-7.noarch.rpm /usr/local/

# RUN 执行以下命令
# RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

# WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.18.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module \
	--with-pcre && make && make install

# EXPOSE 映射端口
EXPOSE 80

# CMD 运行以下命令
# CMD /bin/sh -c 'nginx -g "daemon off;"'

B. 在当前目录运行构建命令:

docker build -t cd-nginx:118 .

C. 运行容器

docker run -d -p80:80 cd-nginx:118 nginx -g "daemon off;"

# 测试下是否可访问
curl -i http://127.0.0.1

上面三步稍微换一个写法,得到同样的结果:

A
# CMD 运行以下命令
CMD /bin/sh -c 'nginx -g "daemon off;"'

B
docker build -t cd-nginx:119 .

C
docker run -itd --name cdnginx119 -p80:80 cd-nginx:119

Compose

前面我们使用 docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器,然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而之。

使用 docker compose 可以轻松,高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。

1
2
3
# 安装非常简单,一般装了docker后就有它了
yum install -y docker-compose-plugin
docker compose version

下面是一个编排示例,新建一个目录,再建一个compose.yaml文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 简单示例 ++++++++++++++++++
# 定义版本
version: '3.8'
services:
  web:
    build: .
    ports:
      - "8000:5000"
    # 挂载数据卷,将容器工作目录/code挂载到当前目录下
    volumes:
      - .:/code
  redis:
    image: "redis:alpine"
    
# WordPress示例 ++++++++++++
version: '3.8'
services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     ports:
       - "3306:3306"
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}

运行如下命令启动容器

1
2
3
4
# 后台启动所有容器
docker compose up -d
# 停止并删除所有容器
docker compose down

常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# Compose 大部分命令的对象即可以是项目的本身,也可以是指定为项目中的服务或者容器
# 执行docker compose [COMMAND] --help 或者docker compose help [COMMAND]可以查看命令的帮助信息

# 具体的使用格式
docker compose [-f=<arg>...] [options] [COMMAND] [ARGS]

# 参数选项
-f,--file file指定模板文件,默认是compose.yml模板文件,可以多次指定
-p,--project-name name指定项目名称,默认使用所在目录名称作为项目名称
-v,--version 输出版本信息

# Compose所支持的命令
build              Build or rebuild services (构建项目中的服务容器)
config             Validate and view the Compose file (验证并查看Compose文件)
create             Create services (为服务创建容器)
down               Stop and remove containers, networks, images, and volumes
events             Receive real time events from containers (为项目中的每个容器流式传输容器事件)
exec               Execute a command in a running container
help               Get help on a command (获得一个命令的帮助)
images             List images ()
kill               Kill containers (通过发送SIGKILL信号来强制停止服务容器)
logs               View output from containers (查看服务容器的输出)
pause              Pause services (暂停一个容器)
port               Print the public port for a port binding (打印某个容器端口所映射的公共端口)
ps                 List containers (列出项目中目前所有的容器)
pull               Pull service images (拉取服务依赖镜像)
push               Push service images (推送服务镜像)
restart            Restart services (重启项目中的服务)
rm                 Remove stopped containers (删除所有停止状态的服务容器)
run                Run a one-off command (在指定服务上执行一个命令)
start              Start services (启动已存在的服务容器)
stop               Stop services (停止已存在的服务容器)
top                Display the running processes (显示容器正在运行的进程)
unpause            Unpause services (恢复处于暂停状态的容器)
up                 Create and start containers (完成包括构建镜像、创建服务、启动并关联容器服务)
version            Show the Docker-Compose version information (输出版本)

参考阅读

https://www.cnblogs.com/jsonhc/p/7767669.html

https://blog.csdn.net/weixin_43980547/article/details/136922491

(完)