docker踩坑记录

踩坑记录

1.1 后台启动容器,实际没有启动

现象: 后台启动centos,结果执行docker ps命令,容器没启动。
docker踩坑记录_第1张图片
原因: docker是以容器启动的,必须要有个前台进程,若是全部都是后台deamon守护进程,没有一个前台进程,则会自动停止容器。

解决方案:

  1. 去除-d,加上 -it 开启容器交互式终端
  2. 执行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<[email protected]>
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


解决方案:

  1. 将两个依赖的压缩包cp到dockerfile文件目录
  2. 修改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

后续遇到问题继续补充~

你可能感兴趣的:(docker,docker,容器,运维)