Skip to content

DockerFile

用来构建 docker 镜像的构建文件,是一段命令脚本!

dockerfile 指令

docker
FROM nginx:stable
VOLUME ["volume01","volume02"]
CMD echo "---DONE---"
CMD /bin/bash
指令描述
FROM构建的镜像基于哪个镜像
MAINTAINER镜像维护者姓名或邮箱地址
RUN构建镜像时运行的指令
CMD运行容器时执行的 shell 环境 新追加的命令会覆盖 CMD 命令
VOLUME指定容器挂载点到宿主机自动生成的目录或其他容器
USER为 RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
WORKDIR为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
EXPOSE声明容器的服务端口(仅仅是声明)
ENV设置容器环境变量
ADD拷贝文件或目录到容器中,如果是 URL 或压缩包便会自动下载或自动解压
COPY拷贝文件或目录到容器中,跟 ADD 类似,但不具备自动下载或解压的功能
ENTRYPOINT运行容器时执行的 shell 命令 可以追加

CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在 docker run 时运行。
  • RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

提示

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

docker build 从 Dockerfile 和“上下文”构建 Docker 映像。

bash
docker build  -t my-nginx:0.1 .

# 解释
--file, -f # Dockerfile 的名称(默认值为 'PATH/Dockerfile')
--tag, -t # 名称和标签(可选)采用“名称:标签”格式

实战测试

官方 centos:7 镜像做容器

bash
# 创建并启动容器
docker run -it centos:7 bash
# 进入容器使用ifconfig命令和vim命令
root@4b3fe87c029c:/# ifconfig
bash: ifconfig: command not found
root@4b3fe87c029c:/# vim
bash: vim: command not found

自己配置 dockerfile 脚本

docker
FROM centos:7
MAINTAINER bddxg<hallte@qq.com>
ENV MY_PATH /usr/local
WORKDIR $MY_PATH
RUN yum -y install vim && yum -y net-tools
EXPOSE 80
CMD echo "---DONE---"
CMD /bin/bash

通过脚本来构建镜像

bash
# docker build -f dockerfile路径 -t 镜像名:[tag] 打包项目路径(一般为当前目录".")
docker build -t bddxg/centos:0.1 .

[+] Building 102.0s (8/8) FINISHED
 => [internal] load build definition from Dockerfile                                                      0.0s
 => => transferring dockerfile: 519B                                                                      0.0s
 => [internal] load .dockerignore                                                                         0.0s
 => => transferring context: 2B                                                                           0.0s
 => [internal] load metadata for docker.io/library/centos:7                                               0.0s
 => [1/4] FROM docker.io/library/centos:7                                                                 0.0s
 => [2/4] WORKDIR /usr/local                                                                              0.0s
 => [3/4] RUN yum -y install vim                                                                        100.3s
 => [4/4] RUN yum -y install net-tools                                                                    1.2s
 => exporting to image                                                                                    0.4s
 => => exporting layers                                                                                   0.4s
 => => writing image sha256:8ca2de35bd62827d8f37ac2f8046f5e110668d2b4dfb3a2b3843d1c0aaefac0e              0.0s
 => => naming to docker.io/bddxg/centos:0.1                                                               0.0s

运行自己构建镜像的容器

docker 容器中没有 ifconfig 和 ping 命令的解决方案

bash
docker run -it bddxg/centos:0.1
# 使用ifconfig命令
[root@366c2bd9bc02 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 9  bytes 806 (806.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# 使用vim命令
[root@366c2bd9bc02 local]# vim
~
~                                                       VIM - Vi IMproved
~
~                                                        version 7.4.629
~                                                   by Bram Moolenaar et al.
~                                               Modified by <bugzilla@redhat.com>
~                                          Vim is open source and freely distributable
~
~                                                 Become a registered Vim user!
~                                        type  :help register<Enter>   for information
~
~                                        type  :q<Enter>               to exit
~                                        type  :help<Enter>  or  <F1>  for on-line help
~                                        type  :help version7<Enter>   for version info
~

docker history 查看镜像构建方式

bash
docker history 8ca2de35bd62

IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
8ca2de35bd62   57 minutes ago   CMD ["/bin/sh" "-c" "/bin/bash"]                0B        buildkit.dockerfile.v0
<missing>      57 minutes ago   CMD ["/bin/sh" "-c" "echo \"---DONE---\""]      0B        buildkit.dockerfile.v0
<missing>      57 minutes ago   EXPOSE map[80/tcp:{}]                           0B        buildkit.dockerfile.v0
<missing>      57 minutes ago   RUN /bin/sh -c yum -y install net-tools # bu…   69.7MB    buildkit.dockerfile.v0
<missing>      57 minutes ago   RUN /bin/sh -c yum -y install vim # buildkit    135MB     buildkit.dockerfile.v0
<missing>      58 minutes ago   WORKDIR /usr/local                              0B        buildkit.dockerfile.v0
<missing>      58 minutes ago   ENV MY_PATH=/usr/local                          0B        buildkit.dockerfile.v0
<missing>      58 minutes ago   MAINTAINER bddxg<hallte@qq.com>                 0B        buildkit.dockerfile.v0
<missing>      7 months ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      7 months ago     /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>      7 months ago     /bin/sh -c #(nop) ADD file:5b1e63a3cb041177b…   301MB

发布镜像到阿里云

登录阿里云进入控制台,进入容器镜像服务

选择个人实例,设置好容器发布登录密码,用于 docker 登录

依次配置命名空间和仓库名称后,就可以按照提示推送本地镜像了

部分电脑下会遇到这种情况:

bash
docker login --username=xxxxx registry.cn-hangzhou.aliyuncs.com
Password:
Error saving credentials: error storing credentials - err: exit status 1, out: `Post "http://ipc/registry/credstore-updated": dial unix Library/Containers/com.docker.docker/Data/backend.sock: connect: no such file or directory`

请检查你的 docker 服务/客户端是否启动

bash
# 对准备好的镜像进行重命名
docker tag 镜像id 远程仓库名称:[镜像版本号]
# 镜像推送
docker push 远程仓库名称:[镜像版本号]

去阿里云控制台查看