DockerFile
基本结构
# 1、第一行必须是 FROM 基础镜像信息
FROM ubuntu
# 2、维护者信息
MAINTAINER docker_user docker_user@email.com
# 3、镜像操作指令
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
# 4、容器启动执行指令
CMD /usr/sbin/nginx
Dockerfile 基本就长这样,当然这是一个很简单的例子,还有很多其他命令会在下个小节介绍。
有几点需要注意,第一行必须是 FROM 命令,表示是基于哪个基础镜像来创建镜像的。第二行一般是 MAINTAINER 命令,表示维护人信息,但不做硬性要求。最后一行是 CMD 命令,表示启动容器执行的命令,CMD 命令必须在最后一行,如果有多个 CMD 命令,则只有最后一个生效。
常用指令
FROM: 必须是 Dockerfile 的首个命令,定义了使用哪个基础镜像启动构建流程。
MAINTAINER: 声明镜像作者。
COPY: 将宿主机的文件拷贝到镜像内的指定路径。
ADD: 作用类似于 COPY。
COPY 和 ADD 的区别是:ADD 命令功能更多,比如拷贝一个压缩包,ADD 可以将压缩包解压到镜像内,如果是下载链接,ADD 会先下载文件,然后再拷贝。
但现在 docker 官方更推荐使用 COPY 命令,一个命令只做一件事。
WORKDIR: 指定 Dockerfile 中该命令下的操作所在的工作目录。
RUN: 执行命令行命令。
ENV: 设置环境变量。
VOLUME: 挂载数据卷。
EXPOSE: 暴露端口。
CMD: 服务启动命令。
创建镜像
有了 Dockerfile 之后,在 Dockerfile 所在目录执行命令:
# docker build -t <image_name> .
就这么简单,镜像就创建好了。
DockerCompose
使用 docker-compose 部署 Redis 服务
项目 Docker 化部署的最后一步,就差 Redis 了。本来以为是一件很简单的事,没想到折腾了我大半天的时间,下面就来分享分享我的采坑经历。
docker-compose 文件:
version: '3'
services:
redis:
image: redis:3.2.12
container_name: redis
restart: always
network_mode: host
command: redis-server /etc/redis.conf
ports:
- 6379:6379
volumes:
- /data:/data
- ./redis.conf:/etc/redis.conf
当前目录下执行:
# docker-compose up
本来以为服务一启,事情就这么愉快的结束了,但是,报错。
Can’t open the log file: No such file or directory
原因就是 redis.conf 文件直接用的是在物理机上部署时用的,logfile
参数配的是 /var/lib/redis
,但 docker 容器里没有这个目录,但是有 /data
目录,所以,把 logfile
配置成 /data
即可。
改完之后再一启,没有任何信息输出,看来是成功了。
docker ps
看看,没有容器。
这下给我整懵了,咋回事呢?其实报错都不怕,就怕启动不成功,还没有报错信息。
就这个问题给我折腾了好久,突然灵光一闪,想到 redis 会不会是以后台进程起的,导致容器直接退出。
检查一下配置文件中的 daemonize
参数,果然是 yes
。改成 no
之后,就可以正常启动了。
就这么个破问题,卡了这么长时间,而且这类问题之前还遇到过,真是让人郁闷。
至此,项目中的所有服务就都 Docker 化部署了。