跳到主要内容

1、Dockerfile

Dockerfile

img

目录

[toc]

1、Dockerfile概述

Docker通过Dockerfile自动构建镜像,Dockerfile是一个包含用于组建镜像的文本文件,由一条一条的指令组成。

2、Dockerfile常用指令

指令描述
FROM构建新镜像是基于哪个镜像
LABEL标签 (LABEL 打标签,写不写都行的;)
RUN构建镜像时运行的Shell命令 (通过 换行符:&& \,可以运行多行shell命令)
COPY拷贝文件或目录到镜像中
ADD解压压缩包并拷贝
ENV设置环境变量
USER为RUN、CMD和ENTRYPOINT执行命令指定运行用户
EXPOSE声明容器运行的服务端口(EXPOSE 80 :事声明一个80端口,不是实际暴露;
声明容器监听的端口号为 12445。这主要是为了文档和开发目的,实际暴露端口是在运行容器时通过 docker run -p 参数来实现的。
WORKDIR为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录;
CMD运行容器时默认执行,如果有多个CMD指令,最后一个生效。

3、构建镜像命令

构建镜像命令
Usage: docker build [OPTIONS] PATH | URL | - [flags]
Options:
-t, --tag list ### 镜像名称
-f, --file string ### 指定Dockerfile文件位置


docker build -t shykes/myapp . #.代表当前路径,如果你的dockerfile文件名默认为Dockerfile,那也是可以不用指定-f的;
docker build -t shykes/myapp -f /path/Dockerfile
docker build -t shykes/myapp http://www.example.com/Dockerfile

4、案例

构建Nginx镜像

(1)源码编译

💘 实战:构建Nginx镜像-2023.1.7(测试成功)

img

  • 实验环境
docker 20.10.12
  • 实验软件

链接:https://pan.baidu.com/s/1m2dtWTyRcJwuSdq1kZyy5g?pwd=bjbw 提取码:bjbw 2022.2.28-Dockerfile实验软件

img

前言

nginx:一般可以部署一些前端的静态文件;

tomcat:一般可以部署一些java的war包;(tomcat也可以处理静态程序的;)

1、准备测试软件

[root@docker ~]###ll -h dockerfile.zip 
-rw-r--r-- 1 root root 46M Aug 13 2021 dockerfile.zip
[root@docker ~]###unzip dockerfile.zip
[root@docker ~]###cd dockerfile
[root@docker dockerfile]###ls
java nginx php tomcat
[root@docker dockerfile]###ls nginx/
Dockerfile nginx-1.15.5.tar.gz nginx.conf php.conf
[root@docker dockerfile]###ls tomcat/
apache-tomcat-8.5.43.tar.gz Dockerfile ROOT.war

2、编写Dockerfile

[root@docker dockerfile]#cd nginx/
[root@docker nginx]#cat Dockerfile
FROM centos:7
LABEL maintainer www.ctnrs.com
RUN yum install -y gcc gcc-c++ make \
openssl-devel pcre-devel gd-devel \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/*

ADD nginx-1.15.5.tar.gz /
RUN cd nginx-1.15.5 && \
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module && \
make -j 4 && make install && \
mkdir /usr/local/nginx/conf/vhost && \
cd / && rm -rf nginx* && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/nginx/sbin
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

3、构建镜像

[root@docker nginx]#docker build -t nginx:v1.15.5 .

4、查看构建好的镜像

[root@docker nginx]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1.15.5 e7c217225044 16 seconds ago 379MB

5、利用构建好的镜像跑一个容器并测试

[root@docker nginx]###docker run  -d --name web -p 90:80  nginx:v1.15.5
be3545d300b0dcaf25004d693f1bd7d460a4b0e4f0937d4a5494a59aa5f16c16
[root@docker nginx]###docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
be3545d300b0 nginx:v1.15.5 "nginx -g 'daemon of…" 4 seconds ago Up 3 seconds 0.0.0.0:90->80/tcp, :::90->80/tcp web

img

可以看到,容器正常启动了,nginx的版本是1.15.5

⚠️ 需要注意的是,上面构建时的Dockerfile里,我们nginx的工作目录是/usr/local/nginx

img

因此,我们这里可以使用-v选项进行挂载我们本地的index.html文件进行再次测试:

[root@docker ~]###docker run  -d --name web2 -p 91:80 -v /opt/wwwroot/:/usr/local/nginx/html  nginx:v1.15.5
8863661b6378beb85c80a00e805aa7dd828ec3be62766cd9082f9173567d444c
[root@docker ~]###docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8863661b6378 nginx:v1.15.5 "nginx -g 'daemon of…" 4 seconds ago Up 2 seconds 0.0.0.0:91->80/tcp, :::91->80/tcp web2
be3545d300b0 nginx:v1.15.5 "nginx -g 'daemon of…" 7 minutes ago Up 7 minutes 0.0.0.0:90->80/tcp, :::90->80/tcp web

img

测试结束。😘

(2)yum安装

💘 实战:构建Nginx镜像-2023.1.7(测试成功)

img

  • 实验环境
docker 20.10.12
  • 实验软件(无)

1、编写Dockerfile文件

[root@docker ~]#mkdir dockerfile
[root@docker ~]#cd dockerfile/
[root@docker dockerfile]#vim Dockerfile
FROM centos:7
RUN yum install -y epel-release && \
yum install -y nginx

CMD ["nginx", "-g", "daemon off;"]

说明:

centos:latest ###这里centos默认是8版本了

通过 换行符:&& \,可以运行多行shell命令
\ 表示换行输入

在容器里面我们不会直接使用systemctl start nginx这个命令的,因为systemctl 在容器里用不了,除非在docker run时使用特权模式。

可以参考nginx官方里面是如何下CMD的:

CMD ["nginx" "-g" "daemon off;"]
-g是用来设置全局参数的
daemon off这个命令意思是让nginx关闭后台启动,让它放在前台启动

->你就记住这一点就好了:将你的项目打包到镜像中,任何应用程序都是以前台去启动的,你记住这一原则就行了。

默认源里不包含nginx,因此需要先安装epel-release源;

2、构建镜像

[root@docker dockerfile]#docker build -t nginx:v1 .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7
---> eeb6ee3f44bd
Step 2/3 : RUN yum install -y epel-release && yum install -y nginx
---> Running in 794db4e7cd48
……
Installed:
epel-release.noarch 0:7-11

Complete!
……
Installed:
nginx.x86_64 1:1.20.1-9.el7
Complete!
Removing intermediate container 794db4e7cd48
---> 2801c711323d
Step 3/3 : CMD ["nginx" "-g" "daemon off;"]
---> Running in e8924270560a
Removing intermediate container e8924270560a
---> 16240f02952c
Successfully built 16240f02952c
Successfully tagged nginx:v1

3、测试

#查看刚才构建好的镜像
[root@docker dockerfile]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 3d50b4f28bb0 23 seconds ago 470MB

#创建index.html测试文件
[root@docker dockerfile]#mkdir /opt/wwwroot
[root@docker dockerfile]#echo loveyou > /opt/wwwroot/index.html

#此时启动刚才那个镜像,进行访问测试
[root@docker dockerfile]#docker run -d --name web -p 90:80 -v /opt/wwwroot/:/usr/share/nginx/html nginx:v1
94e95711e146f7f1ae0435ce4b95b0a556624032ae77408d59f5af00b01cfe52
[root@docker dockerfile]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94e95711e146 nginx:v1 "nginx -g 'daemon of…" 6 seconds ago Up 4 seconds 0.0.0.0:90->80/tcp, :::90->80/tcp web

img

测试结束。😘

构建Tomcat镜像

💘 实战:构建Tomcat镜像-2023.1.7(测试成功)

img

  • 实验环境
docker 20.10.12
  • 实验软件

链接:https://pan.baidu.com/s/1m2dtWTyRcJwuSdq1kZyy5g?pwd=bjbw 提取码:bjbw 2022.2.28-Dockerfile实验软件

img

1、准备测试软件

[root@docker ~]###ll -h dockerfile.zip 
-rw-r--r-- 1 root root 46M Aug 13 2021 dockerfile.zip
[root@docker ~]###unzip dockerfile.zip
[root@docker ~]###cd dockerfile
[root@docker dockerfile]###ls
java nginx php tomcat
[root@docker dockerfile]###ls nginx/
Dockerfile nginx-1.15.5.tar.gz nginx.conf php.conf
[root@docker dockerfile]###ls tomcat/
apache-tomcat-8.5.43.tar.gz Dockerfile ROOT.war

2、编写Dockerfile

[root@docker ~]###cd dockerfile/tomcat/
[root@docker tomcat]###ls
apache-tomcat-8.5.43.tar.gz Dockerfile ROOT.war
[root@docker tomcat]###cat Dockerfile
FROM centos:7
MAINTAINER www.ctnrs.com

ENV VERSION=8.5.43

RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
yum clean all && \
rm -rf /var/cache/yum/*

ADD apache-tomcat-${VERSION}.tar.gz /usr/local/
RUN mv /usr/local/apache-tomcat-${VERSION} /usr/local/tomcat && \
sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/tomcat/bin

WORKDIR /usr/local/tomcat

EXPOSE 8080
CMD ["catalina.sh", "run"]

3、构建镜像

[root@docker tomcat]###docker build -t tomcat:v1 .

4、测试

###查看构建好的镜像
[root@docker tomcat]###docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat v1 7e71034c3c6e 45 seconds ago 460MB

###启动一个容器
[root@docker tomcat]###docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6227fe6fedeb tomcat:v1 "catalina.sh run" 2 seconds ago Up 1 second 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp naughty_lumiere
8863661b6378 nginx:v1.15.5 "nginx -g 'daemon of…" 12 minutes ago Up 12 minutes 0.0.0.0:91->80/tcp, :::91->80/tcp web2
be3545d300b0 nginx:v1.15.5 "nginx -g 'daemon of…" 19 minutes ago Up 19 minutes 0.0.0.0:90->80/tcp, :::90->80/tcp web

img

我们进到这个容器里修改下内容,再次测试下

[root@docker tomcat]###docker exec -it 6227fe6fedeb bash
[root@6227fe6fedeb tomcat]### cd webapps/ROOT/
[root@6227fe6fedeb ROOT]### pwd
/usr/local/tomcat/webapps/ROOT
[root@6227fe6fedeb ROOT]### ls
RELEASE-NOTES.txt asf-logo-wide.svg bg-middle.png bg-upper.png index.jsp tomcat.css tomcat.png
WEB-INF bg-button.png bg-nav.png favicon.ico tomcat-power.gif tomcat.gif tomcat.svg
[root@6227fe6fedeb ROOT]### echo "<h1>loveer</h1>" > index.jsp
[root@6227fe6fedeb ROOT]### exit
exit

img

再次用-v选项测试

[root@docker tomcat]###docker run -d -p 8082:8080  -v /opt/wwwroot/:/usr/local/tomcat/webapps/ROOT tomcat:v1
794a9532d1a5f44506ac259f295dfb6e3715ca530f34332e70244e7c81a98044
[root@docker tomcat]###docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
794a9532d1a5 tomcat:v1 "catalina.sh run" 3 seconds ago Up 2 seconds 0.0.0.0:8082->8080/tcp, :::8082->8080/tcp condescending_vaughan
6227fe6fedeb tomcat:v1 "catalina.sh run" 5 minutes ago Up 5 minutes 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp naughty_lumiere
8863661b6378 nginx:v1.15.5 "nginx -g 'daemon of…" 18 minutes ago Up 18 minutes 0.0.0.0:91->80/tcp, :::91->80/tcp web2
be3545d300b0 nginx:v1.15.5 "nginx -g 'daemon of…" 25 minutes ago Up 25 minutes 0.0.0.0:90->80/tcp, :::90->80/tcp web

img

测试结束。😘

构建java/php镜像

次案例测试省略。

[root@docker ~]###cd dockerfile
[root@docker dockerfile]###ls
java nginx php tomcat
[root@docker dockerfile]###ls java/
Dockerfile hello.jar
[root@docker dockerfile]###ls php/
Dockerfile php-5.6.36.tar.gz php-fpm.conf php.ini

一条命令一个文件编译打包镜像构建推送

img

img

案例:把宿主机某个目录挂载到容器下

Dockerfile里如何复制当前cert目录 到容器内/etc/nginx目录下呢?

在 Dockerfile 中,你可以使用 COPY 指令将当前目录(或指定目录)的内容复制到容器内的指定目录。以下是一个详细示例,展示了如何将当前目录下的 cert 目录复制到容器的 /etc/nginx 目录下。

假设你的项目结构如下:

myproject/
├── Dockerfile
├── cert/
│ ├── blog.onedayxyy.cn.pem
│ ├── blog.onedayxyy.cn.key
└── other_files/

你希望将 myproject/cert 目录下的所有文件复制到容器内的 /etc/nginx/cert 目录。你可以在 Dockerfile 中这样写:

# 使用一个基础镜像(这里以nginx为例)
FROM nginx:latest

# 复制当前目录下的cert目录 到容器的 /etc/nginx 目录下
COPY cert /etc/nginx/cert

# 如果有其他配置文件需要复制,可以继续添加 COPY 指令
# 例如复制nginx.conf文件
# COPY nginx.conf /etc/nginx/nginx.conf

# 启动 Nginx 服务
CMD ["nginx", "-g", "daemon off;"]

在这个 Dockerfile 中:

  1. FROM nginx:latest:使用最新版本的 Nginx 镜像作为基础镜像。
  2. COPY cert /etc/nginx/cert:将当前目录下的 cert 目录及其内容复制到容器的 /etc/nginx/cert 目录。
  3. CMD ["nginx", "-g", "daemon off;"]:以前台模式启动 Nginx 服务。

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

img

🍀 微信公众号

《云原生架构师实战》

img

🍀 语雀

https://www.yuque.com/xyy-onlyone

https://www.yuque.com/xyy-onlyone/exkgza?# 《语雀博客》

img

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

img

🍀 知乎

https://www.zhihu.com/people/foryouone

img

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

img

1