赞
踩
dockerfile是一个用来构建docker镜像文件的脚本命令文件,今天来初步学习dockerfile
官方很多镜像比如nginx,tomcat,mysql其实也是自己写的,我们也可以写一个这样的镜像,
从图中可以发现我们的主要流程是
开发一个应用---->DockerFIle---->打包为镜像---->上传到仓库---->下载镜像---->启动运行
dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建步骤:
1、编写DockerFile文件
2、docker build 构建镜像
3、docker run
我们可以先参考一下官方的dockerfile长什么样
https://hub.docker.com/_/centos
dockerfile具体内容
基础知识:
1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行
3、# 表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交
流程:
1、docker从基础镜像运行一个容器
2、执行一条指令并对容器做出修改
3、执行类似 docker commit 的操作提交一个新的镜像层
4、Docker再基于刚提交的镜像运行一个新容器
5、执行dockerfile中的下一条指令直到所有指令都执行完成!
说明:
从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。
DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可!
DockerFile:需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的内容 包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进 程和内核进程(当引用进行需要和系统服务和内核进程打交道,这时需要考虑如何设计 namespace的权 限控制)等等。
Docker镜像:在DockerFile 定义了一个文件之后,Docker build 时会产生一个Docker镜像,当运行 Docker 镜像时,会真正开始提供服务;
Docker容器:容器是直接提供服务的。
FROM # 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER # 镜像维护者的姓名混合邮箱地址
RUN # 容器构建时需要运行的命令
EXPOSE # 当前容器对外保留出的端口
WORKDIR # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV # 用来在构建镜像过程中设置环境变量
ADD # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY # 类似ADD,拷贝文件和目录到镜像中!
VOLUME # 容器数据卷,用于数据保存和持久化工作
CMD # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
ENTRYPOINT # 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发
加深印象的几个图
看这么多,咱自己写个吧
一般镜像都是由基础镜像改动来的,就是我们上面说的 FROM scratch(base镜像),然后再配置其他信息
咱有样学样,也写一个centos的DockerFile
我们先运行一个官方的centos,发现很多命令都没有
[root@feng /]# docker run -it centos
[root@fcf18fbe30b6 /]# vim
bash: vim: command not found
[root@fcf18fbe30b6 /]# ifconfig
bash: ifconfig: command not found
[root@fcf18fbe30b6 /]#
我们可以自己写一个有这些命令的镜像
DockerFile
FROM centos
MAINTAINER feng<feng9662@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----------end--------"
CMD /bin/bash
我们把该文件放在home下
[root@feng /]# cd home/ [root@feng home]# mkdir dockerfile-test [root@feng home]# ls ceshi ceshi666 dockerfile-test f1 idea redis test1.java test.java www [root@feng home]# vim mydocker-centos [root@feng home]# cat mydocker-centos M centos MAINTAINER feng<feng9662@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "----------end--------" CMD /bin/bash [root@feng home]#
docker build -f dockerfile地址 -t 新镜像名:tag .
别忽略了后面那个点
跑起来
[root@feng home]# docker build -f mydocker-centos -t mycentos:0.1 .
Sending build context to Docker daemon 16.53MB
Error response from daemon: Dockerfile parse error line 1: unknown instruction: M
[root@feng home]# docker build -f mydocker-centos -t mycentos:0.1 .
Sending build context to Docker daemon 16.53MB
Step 1/10 : FROM centos
.........
[root@feng home]# docker run -it mycentos:0.1 [root@e7c0576aa706 local]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.18.0.3 netmask 255.255.0.0 broadcast 172.18.255.255 ether 02:42:ac:12:00:03 txqueuelen 0 (Ethernet) 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 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1 (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 [root@e7c0576aa706 local]# vim [root@e7c0576aa706 local]#
可以看到刚才不支持的命令现在都支持了
写了dockerfile给大家一起用~
这里我们需要先注册一个DockerHub的账号
注册完成后
[root@feng home]# docker login --help Usage: docker login [OPTIONS] [SERVER] Log in to a Docker registry. If no server is specified, the default is defined by the daemon. Options: -p, --password string Password --password-stdin Take the password from stdin -u, --username string Username #可以看到我这里登录失败 [root@feng home]# docker login -u nicerfeng Password: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout [root@feng home]# cd .. [root@feng /]# cd etc/ [root@feng etc]# cd docker [root@feng docker]# ls daemon.json key.json [root@feng docker]# vi daemon.json #如果登陆失败,吧daemon.json中的mirror加入国内镜像 ## ##{ ## "registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"] ##} ##修改后重启docker服务 [root@feng docker]# service docker restart Redirecting to /bin/systemctl restart docker.service [root@feng docker]# docker login -u nicerfeng Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded #登陆成功 [root@feng docker]#
[root@feng docker]# docker push mycentos:0.1
The push refers to repository [docker.io/library/mycentos]
ea5891ca9288: Preparing
512dd52bc170: Preparing
eb29745b8228: Preparing
denied: requested access to the resource is denied
[root@feng docker]#
#可以看到这里把咱拒绝了,因为我们的镜像没账号信息,要把tag加上即可
加上容器id的tag,即可上传
[root@feng docker]# docker tag d7c8a9d0f0b2 nicerfeng/mycentos:0.1
[root@feng docker]# docker push nicerfeng/mycentos:0.1
The push refers to repository [docker.io/nicerfeng/mycentos]
ea5891ca9288: Pushing [===> ] 930.3kB/14.27MB
512dd52bc170: Pushing [> ] 549.4kB/57.18MB
eb29745b8228: Pushing [> ] 3.838MB/215.3MB
首先进入阿里云控制台,搜索容器镜像服务
点击左侧命名空间,创建一个命名空间
创建镜像仓库
进入该仓库,查看详情
按照上面阿里云官网的说明登录即可
[root@feng ~]# docker login --username=冯半仙 registry.cn-beijing.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@feng ~]#
这里的密码在刚才的页面设置
[root@feng ~]# docker tag d7c8a9d0f0b2 registry.cn-beijing.aliyuncs.com/snicker_feng/feng-test:v1.1
[root@feng ~]# docker push registry.cn-beijing.aliyuncs.com/snicker_feng/feng-test:v1.1
The push refers to repository [registry.cn-beijing.aliyuncs.com/snicker_feng/feng-test]
ea5891ca9288: Pushing [=====> ] 1.561MB/14.27MB
512dd52bc170: Pushing [=> ] 1.663MB/57.18MB
eb29745b8228: Pushing [> ] 544.8kB/215.3MB
成功上传~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。