踩坑记录
1.1 后台启动容器,实际没有启动
现象: 后台启动centos,结果执行docker ps命令,容器没启动。
原因: docker是以容器启动的,必须要有个前台进程,若是全部都是后台deamon守护进程,没有一个前台进程,则会自动停止容器。
解决方案:
- 去除-d,加上 -it 开启容器交互式终端
- 执行
docker run -d centos /bin/bash -c "while true;echo test;"
,通过bash执行死循环shell语句,将容器进程卡主
1.2 dockerfile中 ADD和COPY命令中的宿主机文件都需要在dockerfile同级目录
现象:
编辑dockerfile文件构建tomcat镜像,其中存在ADD
指令,执行build构建命令后,提示文件不存在。
# pwd /root/docker/test/dockerfiletest
# dockerfiletest文件目录:/root/docker/test/dockerfiletest
[root@centos7 dockerfiletest]# cat dockerfile-tomcattest
FROM centos
MAINTAINER wl<wl@126.com>
ENV WORKPATH /usr/local
WORKDIR $WORKPATH
ADD /root/apache-tomcat-9.0.85.tar.gz /usr/local/ #apache-tomcat-9.0.85.tar.gz没在dockerfiletest文件目录,导致出现
ADD /root/jdk-8u391-linux-x64.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_391
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.85
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.85
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib
EXPOSE 8080
CMD $CATALINA_HOME/bin/startup.sh && tail -f $CATALINA_HOME/logs/catalina.out
解决方案:
- 将两个依赖的压缩包cp到dockerfile文件目录
- 修改dockerfile文件,将压缩包文件路径 改为当前目录下
ADD apache-tomcat-9.0.85.tar.gz /usr/local/ ADD jdk-8u391-linux-x64.tar.gz /usr/local/
1.3 dockerfile中存在EXPOSE port,在启动容器时还是需要-p 添加端口映射
现象:
dockerfile存在EXPOSE 8080,但是docker run时未添加-p 端口映射,导致访问宿主机端口时访问不到。
解决方案:
在docker run中还是需要添加-p 端口映射,如:docker run -p 8080:8080 ...
1.4 执行docker run -p 8080:8080,出现iptables failed
错误
现象:
docker: Error response from daemon: driver failed programming external connectivity on endpoint tomcat01
(0a7c671209ed49c4e0c1dbff28f9d43e2155ba219bb609afc3892b4f4912d9b2):
(iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9090 -j DNAT --to-destination \
172.17.0.2:8080 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).
原因:
- 当centos7 firewall 被清掉时, firewall的底层是使用iptables进行数据过滤,建立在iptables之上,这可能会与 Docker 产生冲突。
- 当 firewalld 启动或者重启的时候,将会从 iptables 中移除 DOCKER 的规则,从而影响了 Docker 的正常工作。
解决方案:
Linux 开启firewall 防火墙,并重启docker,systemctl restart docker