栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

实战:Dockerfile构建镜像-2022.2.28

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

实战:Dockerfile构建镜像-2022.2.28


实战:Dockerfile构建镜像-2022.2.28 目录

文章目录

实战:Dockerfile构建镜像-2022.2.28目录实验环境实验软件1、Dockerfile概述2、Dockerfile常用指令3、构建镜像命令4、构建Nginx镜像

 案例演示:构建Nginx镜像(测试成功) 5、构建Tomcat镜像

 案例演示:构建Tomcat镜像(测试成功) 6、构建`java/php`镜像QA

 一个有问题的demo 关于我最后

实验环境
docker 20.10.12
实验软件

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

1、Dockerfile概述

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

指令描述
FROM构建新镜像是基于哪个镜像
LABEL标签 (LABEL 打标签,写不写都行的;)
RUN构建镜像时运行的Shell命令 (通过 换行符:&& ,可以运行多行shell命令)
COPY拷贝文件或目录到镜像中
ADD解压压缩包并拷贝
ENV设置环境变量
USER为RUN、CMD和ENTRYPOINT执行命令指定运行用户
EXPOSE声明容器运行的服务端口 #EXPOSE 80 :事声明一个80端口,不是实际暴露;
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 /path
# docker build -t shykes/myapp http://www.example.com/Dockerfile
4、构建Nginx镜像  案例演示:构建Nginx镜像(测试成功)

 课件内容

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;"]

 查看本实验需要用到的软件

[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

 查看本次nginx镜像Dcokerfile内容

[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;"]

 直接构建镜像

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

 查看构建好的镜像

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

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

[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

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

⚠️

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

因此,我们这里可以使用-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

实验结束,完美。

5、构建Tomcat镜像  案例演示:构建Tomcat镜像(测试成功)

 课件内容

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"]

 查看本实验需要用到的软件

[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

 查看本次Tomcat镜像Dcokerfile内容

[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"]

 直接构建镜像

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

 测试

#查看构建好的镜像
[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

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

[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 "loveer" > index.jsp 
[root@6227fe6fedeb ROOT]# exit
exit

 再次用-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

实验结束,完美。

6、构建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
QA  一个有问题的demo

 编写Dockier文件

[root@docker admin]#mkdir dockerfile
[root@docker admin]#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源;

 开始构建镜像

[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

 测试

#查看刚才构建好的镜像
[root@docker dockerfile]#docker images
REPOSITORY                                                     TAG       IMAGE ID       CREATED        SIZE
nginx                                                          v1        16240f02952c   2 hours ago    437MB

#创建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
fa0a5ea6f4150495141a4a8bcda61c73fde1753d6f045ef9046a15dfa31c4aa2
[root@docker dockerfile]#docker ps -a
ConTAINER ID   IMAGE      COMMAND                   CREATED         STATUS                       PORTS     NAMES
fa0a5ea6f415   nginx:v1   "/bin/sh -c '["nginx…"   7 seconds ago   Exited (127) 6 seconds ago             web

⚠️ 奇怪:#疑问:。。。。。我这个为什么退出了呢。。。。;但老师这个却是正常的。。。。好无语啊。。。。。

 自己拉取官方Nginx镜像是没任何问题的。。。

[root@docker dockerfile]#docker run  -d --name web1 -p 91:80 -v /opt/wwwroot/:/usr/share/nginx/html nginx
24f155006ac6ab2042bc7bb62fbfd992dbeffc88a6a669510057c5b2ed6e0c01
[root@docker dockerfile]#docker ps 
ConTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                NAMES
24f155006ac6   nginx     "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   0.0.0.0:91->80/tcp   web1
[root@docker dockerfile]#curl  127.0.0.1:91
loveyou

 是官方nginx里面什么变动了吗。。。。。好奇怪啊 。。。。。

关于我

我的博客主旨:我希望每一个人拿着我的博客都可以做出实验现象,先把实验做出来,然后再结合理论知识更深层次去理解技术点,这样学习起来才有乐趣和动力。并且,我的博客内容步骤是很完整的,也分享源码和实验用到的软件,希望能和大家一起共同进步!

各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人免费帮您解决问题:

    个人微信二维码:x2675263825 (舍得), qq:2675263825。

    个人博客地址:www.onlyonexl.cn

    个人微信公众号:云原生架构师实战

    个人csdn

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

    个人已开源干货

    名称链接
    01 实战:打造一款王者云笔记:typora+坚果云+阿里云osshttps://www.jianguoyun.com/p/DXS6qiIQvPWVCRiS0qoE
    02 实战:定制宇宙中最美的typora主题皮肤https://www.jianguoyun.com/p/DeUK9u0QvPWVCRib0qoE
    03 玩转vscodehttps://www.jianguoyun.com/p/DZe8gmsQvPWVCRid0qoE
    04 陈果的幸福哲学课https://www.jianguoyun.com/p/Db0kM7gQvPWVCRj2q6YE
最后

​ 好了,关于Dockerfile实验就到这里了,感谢大家阅读,最后贴上我女神的photo,祝大家生活快乐,每天都过的有意义哦,我们下期见!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/748104.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号