实战: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实验软件
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指令,最后一个生效 |
构建镜像命令 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/Dockerfile4、构建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.iniQA 一个有问题的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+坚果云+阿里云oss | https://www.jianguoyun.com/p/DXS6qiIQvPWVCRiS0qoE |
| 02 实战:定制宇宙中最美的typora主题皮肤 | https://www.jianguoyun.com/p/DeUK9u0QvPWVCRib0qoE |
| 03 玩转vscode | https://www.jianguoyun.com/p/DZe8gmsQvPWVCRid0qoE |
| 04 陈果的幸福哲学课 | https://www.jianguoyun.com/p/Db0kM7gQvPWVCRj2q6YE |
好了,关于Dockerfile实验就到这里了,感谢大家阅读,最后贴上我女神的photo,祝大家生活快乐,每天都过的有意义哦,我们下期见!



