Appearance
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 远程仓库名称:[镜像版本号]
去阿里云控制台查看