Dockerfile简介

image.png

Dockerfile

image.png

演示

使用Dockerfile构建Nginx容器,添加容器健康检查。

准备Dockerfile

  1. # 基于 nginx:1.17.9 镜像构建
  2. FROM nginx:1.17.9
  3. # 指定信息
  4. LABEL maintainer="test@qq.com"
  5. # 设置环境变量
  6. ENV NGINX_VERSION 1.17.9
  7. ARG work_pwd=/data/html
  8. # 切换 root 用户
  9. USER root
  10. # 执行命令,安装 curl 软件,设置软链接把nginx服务的日志显示到终端
  11. RUN apt-get -yq update && apt-get install -y curl && \
  12. ln -sf /dev/stdout /var/log/nginx/access.log && \
  13. ln -sf /dev/stderr /var/log/nginx/error.log
  14. # 设置工作目录
  15. WORKDIR $work_pwd
  16. # 复制index.html 文件到WORKDIR目录下
  17. COPY index.html .
  18. # 映射8080端口
  19. EXPOSE 8080
  20. CMD ["nginx", "-g", "daemon off;"]
  21. STOPSIGNAL SIGRTMAX
  22. # 检查容器健康,通过访问nginx服务8080端口来判断容器服务示范健康
  23. HEALTHCHECK --interval=5s --timeout=3s \
  24. CMD curl -fs http://localhost/ || exit 1

当前目录下构建镜像

从log中可以看到,构建是按照dockerfile从上到下一步一步执行。

  1. # -t tag:version
  2. [root@centos nginx]# docker build -t n:1 .
  3. Sending build context to Docker daemon 2.56kB
  4. Step 1/12 : FROM nginx:1.17.9
  5. ---> 5a8dfb2ca731
  6. Step 2/12 : LABEL maintainer="test@qq.com"
  7. ---> Using cache
  8. ---> 416c45116ea1
  9. Step 3/12 : ENV NGINX_VERSION 1.17.9
  10. ---> Using cache
  11. ---> 0994368b154e
  12. Step 4/12 : ARG work_pwd=/data/html
  13. ---> Using cache
  14. ---> d447d5c7ee58
  15. Step 5/12 : USER root
  16. ---> Using cache
  17. ---> 7630d105f930
  18. Step 6/12 : RUN apt-get -yq update && apt-get install -y curl && ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
  19. ---> Running in 8f2f9c9cab24
  20. ...

查看构建的镜像

  1. [root@centos nginx]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. n 1 1d7f959d2796 2 minutes ago 152MB

启动镜像

  1. [root@centos nginx]# docker run n:1
  2. 127.0.0.1 - - [21/Nov/2020:09:17:13 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.64.0" "-"
  3. 127.0.0.1 - - [21/Nov/2020:09:17:18 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.64.0" "-"

查看容器状态

可以看到健康检查打上的healthy标签

  1. [root@centos ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 3bb7a0758d0c n:1 "nginx -g 'daemon of…" 46 seconds ago Up 45 seconds (healthy) 80/tcp, 8080/tcp silly_ptolemy

查看镜像的label

  1. [root@seliius21734 test]# docker image inspect n:1 --format "{{json .ContainerConfig.Labels}}"
  2. {"maintainer":"test@ericsson.com"}

进入容器并查看状态

  1. [root@centos ~]# docker exec -it silly_ptolemy bash
  2. root@3bb7a0758d0c:/data/html# ls
  3. index.html
  4. root@3bb7a0758d0c:/data/html# id
  5. uid=0(root) gid=0(root) groups=0(root)
  6. # 可以看到dockerfile中定义的动作workdir和copy动作都实现了

通过浏览器查看

1.后台运行容器n:1并将端口映射到8080端口
2.通过浏览器查看
image.png

总结

通过这里例子可以看到,我们可以对这个dockerfile继续改造。
准备好index.html, 然后指定路径。
这样我们来体会一个dockerfile构建自己的容器:一键启动后,网页就部署好了。
index.html:

  1. <h1>Test Docker Build</h1>

修改dockerfile:在构建的时候直接把index.html替换掉nginx默认目录下的index

  1. COPY index.html /usr/share/nginx/html/index.html

一键部署:

  1. root@18141d6b1875:/usr/share/nginx/html# exit
  2. exit
  3. [root@centos nginx]# vim Dockerfile
  4. [root@centos nginx]# ls
  5. Dockerfile index.html nginx
  6. [root@centos nginx]# docker rm -f nginx
  7. nginx
  8. [root@centos nginx]#
  9. [root@centos nginx]#
  10. [root@centos nginx]# docker build -t n:1 .
  11. Sending build context to Docker daemon 5.12kB
  12. Step 1/14 : FROM nginx:1.17.9
  13. ---> 5a8dfb2ca731
  14. Step 2/14 : LABEL maintainer="test@qq.com"
  15. ---> Using cache
  16. ---> 416c45116ea1
  17. Step 3/14 : ENV NGINX_VERSION 1.17.9
  18. ---> Using cache
  19. ---> 0994368b154e
  20. Step 4/14 : ARG work_pwd=/data/html
  21. ---> Using cache
  22. ---> d447d5c7ee58
  23. Step 5/14 : USER root
  24. ---> Using cache
  25. ---> 7630d105f930
  26. Step 6/14 : RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list
  27. ---> Using cache
  28. ---> ac050a1b0a87
  29. Step 7/14 : RUN sed -i s@/security.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list
  30. ---> Using cache
  31. ---> b408fda38344
  32. Step 8/14 : RUN apt-get -yq update && apt-get install -y curl && ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
  33. ---> Using cache
  34. ---> e8983a355809
  35. Step 9/14 : WORKDIR $work_pwd
  36. ---> Using cache
  37. ---> 2dd2d9a46a6a
  38. Step 10/14 : COPY index.html /usr/share/nginx/html/index.html
  39. ---> 6a37b65e0ba6
  40. Step 11/14 : EXPOSE 8080
  41. ---> Running in 3845ae6825a8
  42. Removing intermediate container 3845ae6825a8
  43. ---> f5215fec001f
  44. Step 12/14 : CMD ["nginx", "-g", "daemon off;"]
  45. ---> Running in 04f4fb65d4f3
  46. Removing intermediate container 04f4fb65d4f3
  47. ---> 5de25f38c4d5
  48. Step 13/14 : STOPSIGNAL SIGRTMAX
  49. ---> Running in 291143f1af33
  50. Removing intermediate container 291143f1af33
  51. ---> 99d9ac06c014
  52. Step 14/14 : HEALTHCHECK --interval=5s --timeout=3s CMD curl -fs http://localhost/ || exit 1
  53. ---> Running in beb56658c919
  54. Removing intermediate container beb56658c919
  55. ---> 98d416ae609e
  56. Successfully built 98d416ae609e
  57. Successfully tagged n:1
  58. [root@centos nginx]# docker run -d --name nginx -p 8080:80 n:1
  59. fe02a3f5efd54a688664aac3ffb27d8b84644ee41ac2ef22cee25fb58507d155

查看浏览器:
image.png

遇到的坑

Nginx容器中安装curl失败

由于很多镜像都是基于Ubuntu,所以dockfile用了apt-get。
但是国内的又访问或者很难访问到国外的服务器,导致下载curl失败。
所以需要修改source list中的uri
解决办法就是在构架的时候替换镜像源。在Dockerfile中添加两句语句:

  1. RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list
  2. RUN sed -i s@/security.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list

如何在docker容器中安装vim

1.首先需要进入容器

  1. [root@centos nginx]# docker exec -it nginx bash

2.更新apt-get

  1. root@8106885274d2:/# apt-get update

3.apt-get安装curl

  1. root@8106885274d2:/# apt-get install vim