发现对DockerFile理解不深刻,于是又撸了下Docker视频,在此记录一下。
DockerFile
DockerFile文件主要命令:
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,例如:tomcat镜像,这个tomcat压缩包,添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOST # 保留端口配置
CMD # 指定这个容器启动时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动时候要运行的命令,可追加命令
ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行ONBUILD指令,触发指令
COPY # 类似ADD,将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量
通过DockerFile构建镜像:
docker build -f DockerFile文件路径 -t 镜像名:[tag]
# build成功提示
successfully built xxx
successfully tagged xxx:xxx
# 查看镜像构建过程
docker history 镜像ID
注意点
命令区分
ENTRYPOINT和CMD的区别:
使用ENTRYPOINT时在docker run时候可以直接追加命令,但是CMD无法追加命令,具体区别如下展示:
准备2个DockerFile
DockerFile1
FROM centos
CMD ["ls","-a"]
DockerFile2
FROM centos
ENTRYPOINT ["ls","-a"]
分别根据DockerFile构建镜像,构建完成后分别执行以下命令
docker run 镜像ID -l
此时会出现两个结果:DockerFile中命令为CMD的,会存在如下报错:
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
而DockerFile中命令为ENTRYPOINT的可正常将详细信息返回
total 7420
drwxrwxrwx 1 root root 28 Nov 7 10:15 .
drwxr-xr-x 1 root root 6 Mar 7 20:55 ..
drwxrwxrwx 1 root root 20 Nov 7 10:15 bin
-rw-rw-rw- 1 root root 240 Nov 7 09:33 get_arch.sh
-rw-rw-rw- 1 root root 235 Nov 7 09:33 install_argocd_cli.sh
-rw-rw-rw- 1 root root 405 Nov 7 09:33 install_buildx.sh
-rw-rw-rw- 1 root root 157 Nov 7 09:33 install_glab.sh
-rw-rw-rw- 1 root root 195 Nov 7 09:33 install_golangci_lint.sh
-rw-rw-rw- 1 root root 701 Nov 7 09:33 install_helm_push_plugin.sh
-rw-rw-rw- 1 root root 385 Nov 7 09:33 install_kind.sh
-rw-rw-rw- 1 root root 387 Nov 7 09:33 install_kubectl.sh
-rw-rw-rw- 1 root root 175 Nov 7 09:33 install_mc.sh
-rw-rw-rw- 1 root root 389 Nov 7 09:33 install_nerdctl.sh
-rw-rw-rw- 1 root root 321 Nov 7 09:33 install_node.sh
-rw-rw-rw- 1 root root 1174 Nov 7 09:33 install_protoc.sh
-rw-rw-rw- 1 root root 575 Nov 7 09:33 install_shell_check.sh
-rw-rw-rw- 1 root root 280 Nov 7 09:33 install_trivy.sh
-rw-rw-rw- 1 root root 216 Nov 7 09:33 install_yq.sh
-rw-r--r-- 1 root root 7528755 Dec 8 2021 nerdctl-0.12.1-linux-amd64.tar.gz
drwxr-xr-x 1 root root 30 Nov 7 10:06 pkg
drwxrwxrwx 2 root root 6 May 29 2022 src
-rw-rw-rw- 1 root root 3590 Nov 7 09:33 verify_helm_standard.sh
查看运行容器,发现ENTRYPOINT的容器中-l命令被成功追加
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
515aa735d276 930bc4c286ee "ls -a -l" 9 minutes ago Exited (0) 9 minutes ago suspicious_easley
214e25784108 930bc4c286ee "ls -a" 9 minutes ago Exited (0) 9 minutes ago stoic_allen
Docker网络
结论:
- Docker使用的是linux的桥接,宿主机中是一个Docker容器的网桥docker0
- 所有容器在不指定网络的情况下,都是docker0路由的
- docker会给我们的容器分配一个默认的可用IP。容器与容器之间的通信是通过docker0
- Docker中的所有网络接口都是虚伪的。虚拟的转发效率高(内网传递文件)
- 删除容器,对应的一对网桥就没了
- 通过–link可用解决网络连通问题
# 自定义docker网络,跨网络
docker network create xxx2
docker network commect xxx1 xxx2
文章评论