前言
本系列文章主要还是围绕k8s的持续集成,但是一下子直奔主题可能跨度有点大,所以中间会穿插一些基础的知识。本文重点梳理一下docker的进阶知识——Dockerfile与docker-compose。因为很多人可能跟我之前一样入门学过docker,但是可能也只是简单的接触,觉得命令烦琐就放弃了。其实,当你学完dockerfile和docker-compose后,我相信你对docker的命令烦琐这个误解就会自动解除,然后会慢慢喜欢上docker。
Dockerfile
什么是Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
案例
制作一个nginx镜像并修改其默认首页内容
在没有使用Dockerfile之前,我们完成如上需求,可能会这样:
-
下载一个nginx镜像
docker pull nginx
-
启动nginx容器
docker run --name mynginx -d -p 8888:80 nginx
-
先访问一下服务
curl http://localhost:8888
-
进入容器
docker exec -it `docker ps | grep mynginx | awk '{print $1}'` bash
-
修改index.html
echo "66666" > /usr/share/nginx/html/index.html
-
退出容器
exit
-
验证修改内容
curl http://localhost:8888
-
将容器创建成一个新的镜像
docker commit docker commit -a "mldong.com" -m "我的镜像" `docker ps | grep mynginx | awk '{print $1}'` mynginx:666
-
查看新的镜像
docker images | grep mynginx
-
启动新的镜像
docker run --name mynginx666 -d -p 8889:80 mynginx:666
-
验证结果
curl http://localhost:8889
-
清一下刚才启动的容器
-
停止容器
docker ps -a | grep mynginx | awk '{print $1}' | xargs docker stop
-
删除容器
docker ps -a | grep mynginx | awk '{print $1}' | xargs docker rm
-
使用Dockerfile之后,我们完成如上需求,就这样:
-
创建工作目录并进入
mkdir -p /mldong/docker/nginx && cd /mldong/docker/nginx
-
新建一个Dockerfile
cat <<EOF > /mldong/docker/nginx/Dockerfile # 指定基础镜像 FROM nginx # 维护者信息 MAINTAINER mldong <524719755@qq.com> # 执行RUN指令替换首页内容 RUN echo '667' > /usr/share/nginx/html/index.html EOF
-
基于Dockerfile生成镜像
docker build -t mynginx:667 .
查看新的镜像
docker images | grep mynginx
-
启动新的镜像
docker run --name mynginx667 -d -p 8889:80 mynginx:667
-
验证结果
curl http://localhost:8889
-
清一下刚才启动的容器
-
停止容器
docker ps -a | grep mynginx | awk '{print $1}' | xargs docker stop
-
删除容器
docker ps -a | grep mynginx | awk '{print $1}' | xargs docker rm
-
最后清一下刚才新生成的镜像
docker images | grep mynginx | awk '{print $3}' | xargs docker rmi
Dockerfile指令详解
使用dockerfile定义镜像后,就不需要进入容器中commit了。上面的demo只简单使用了RUN指令。下面对其他常用的指令进行详细说明。
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
格式:
COPY <源路径1>... <目标路径>
如:
COPY mldong* /mydir/
COPY mldong?.txt /mydir/
ADD
ADD 指令和 COPY 的使用格式一致, 不过在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
格式:
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
ARG
构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。
格式:
ARG <参数名>[=<默认值>]
EXPOSE
仅仅只是声明端口。
作用:
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
格式:
EXPOSE <端口1> [<端口2>...]
除了以上指令,还有其他指令,这里就先不介绍了,后续实战中需要的时候再做介绍。
docker-compose
什么是docker-compose
Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。它是一个定义和运行多容器的 docker应用工具。使用compose,你能通过YMAL文件配置你自己的服务,然后通过一个命令,你能使用配置文件 创建和运行所有的服务。重点可以启动多个容器!
docker-compose安装
-
下载docker-compose
curl -L "https://github.com/docker/compose/releases/download/1.24.0/dockercompose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
-
设置执行权限
chmod +x /usr/local/bin/docker-compose
-
查看版本
docker-compose -version
-
卸载
rm -rf /usr/local/bin/docker-compose
案例
还是以nginx为例
├── /mldong/docker/nginx
└── docker-compose.yaml
-
新建编排文件
cat <<EOF > /mldong/docker/nginx/docker-compose.yaml version: '2' services: nginx: image: "nginx" restart: always volumes: - "/etc/localtime:/etc/localtime:ro" ports: - "8888:80" EOF
-
启动服务
docker-compose -f /mldong/docker/nginx/docker-compose.yaml up -d
-
验证服务
curl http://localhost:8888
-
删除服务
docker-compose -f /mldong/docker/nginx/docker-compose.yaml down
docker-compose常用命令说明
-
运行服务-非后台运行
docker-compose -f docker-compose.yaml up
-
运行服务-后台运行
docker-compose -f docker-compose.yaml up -d
-
停止并移除定义的服务
docker-compose -f docker-compose.yaml down
-
停止正在运行的服务
docker-compose -f docker-compose.yaml stop
-
启动停止的服务
docker-compose -f docker-compose.yaml start
小结
本文这里只是简单提一下Dockerfile和docker-compose,在k8s做持续集成的时候,Dockerfile是必不可少的,而docker-compose可能会用得比较少。但是还是建议两者都要学,因为当你不玩k8s的时候,docker-compose就是一个很好的工具。等k8s持续集成篇结束,我也会考虑出一些关于docker-compose的一些实战的文章。或者可以说是基于docker-compose做持续集成。