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:用于设置镜像触发器
下面这张图有点意思,总结的不错:
构建示例
下面用一个构建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
(完)