手把手带你玩转k8s-docker进阶Dockerfile与docker-compose

2,874 阅读3分钟

前言

本系列文章主要还是围绕k8s的持续集成,但是一下子直奔主题可能跨度有点大,所以中间会穿插一些基础的知识。本文重点梳理一下docker的进阶知识——Dockerfile与docker-compose。因为很多人可能跟我之前一样入门学过docker,但是可能也只是简单的接触,觉得命令烦琐就放弃了。其实,当你学完dockerfile和docker-compose后,我相信你对docker的命令烦琐这个误解就会自动解除,然后会慢慢喜欢上docker。

Dockerfile

什么是Dockerfile

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

案例

制作一个nginx镜像并修改其默认首页内容

在没有使用Dockerfile之前,我们完成如上需求,可能会这样:

  1. 下载一个nginx镜像

    docker pull nginx
    
  2. 启动nginx容器

    docker run --name mynginx -d -p 8888:80 nginx
    
  3. 先访问一下服务

    curl http://localhost:8888
    

  4. 进入容器

    docker exec -it `docker ps | grep mynginx | awk '{print $1}'` bash
    
  5. 修改index.html

    echo "66666" > /usr/share/nginx/html/index.html
    
  6. 退出容器

    exit
    
  7. 验证修改内容

    curl http://localhost:8888
    

  8. 将容器创建成一个新的镜像

docker commit docker commit -a "mldong.com" -m "我的镜像" `docker ps | grep mynginx | awk '{print $1}'`  mynginx:666

  1. 查看新的镜像

    docker images | grep mynginx
    

  2. 启动新的镜像

    docker run --name mynginx666 -d -p 8889:80 mynginx:666
    
  3. 验证结果

    curl http://localhost:8889
    

  4. 清一下刚才启动的容器

    1. 停止容器

      docker ps -a | grep mynginx | awk '{print $1}' | xargs docker stop
      
    2. 删除容器

      docker ps -a | grep mynginx | awk '{print $1}' | xargs docker rm
      

使用Dockerfile之后,我们完成如上需求,就这样:

  1. 创建工作目录并进入

    mkdir -p /mldong/docker/nginx && cd /mldong/docker/nginx
    
  2. 新建一个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
    
    
  3. 基于Dockerfile生成镜像

    docker build -t mynginx:667 .
    

    查看新的镜像

    docker images | grep mynginx
    
  4. 启动新的镜像

    docker run --name mynginx667 -d -p 8889:80 mynginx:667
    
  5. 验证结果

    curl http://localhost:8889
    

  6. 清一下刚才启动的容器

    1. 停止容器

      docker ps -a | grep mynginx | awk '{print $1}' | xargs docker stop
      
    2. 删除容器

      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安装

  1. 下载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
    
  2. 设置执行权限

    chmod +x /usr/local/bin/docker-compose
    
  3. 查看版本

    docker-compose -version
    
  4. 卸载

    rm -rf /usr/local/bin/docker-compose
    

案例

还是以nginx为例

├── /mldong/docker/nginx
	└── docker-compose.yaml
  1. 新建编排文件

    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
    
  2. 启动服务

    docker-compose -f /mldong/docker/nginx/docker-compose.yaml up -d
    
  3. 验证服务

    curl http://localhost:8888
    
  4. 删除服务

    docker-compose -f /mldong/docker/nginx/docker-compose.yaml down
    

docker-compose常用命令说明

  1. 运行服务-非后台运行

    docker-compose -f docker-compose.yaml up
    
  2. 运行服务-后台运行

    docker-compose -f docker-compose.yaml up -d
    
  3. 停止并移除定义的服务

    docker-compose -f docker-compose.yaml down
    
  4. 停止正在运行的服务

    docker-compose -f docker-compose.yaml stop
    
  5. 启动停止的服务

    docker-compose -f docker-compose.yaml start
    

小结

本文这里只是简单提一下Dockerfile和docker-compose,在k8s做持续集成的时候,Dockerfile是必不可少的,而docker-compose可能会用得比较少。但是还是建议两者都要学,因为当你不玩k8s的时候,docker-compose就是一个很好的工具。等k8s持续集成篇结束,我也会考虑出一些关于docker-compose的一些实战的文章。或者可以说是基于docker-compose做持续集成。

相关文章

手把手带你玩转k8s-集群创建和Hello World

手把手带你玩转k8s-ConfigMap与持久化存储

手把手带你玩转k8s-完整的发布一个可对外访问的服务