Dockfile自定义镜像
初识Dockerfile
Dockerfile 就是来构建docker镜像的构建文件!命令脚本!
通过这个脚本就可以生成镜像,镜像是一层一层的,脚本也是一个个的命令,每一个命令代表一层!
构建过程
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下顺序执行
- 每一个指令都会提交创建一个新的镜像层并提交
指令
指令 | 说明 |
---|---|
FROM | 基础镜像 一切从这里构建 |
MAINTAINER | 镜像是谁写的 姓名+邮箱 |
RUN | 镜像构建的时候需要运行的命令 |
ADD | 添加内容 |
WORKDIR | 镜像的工作目录 |
VOLUME | 挂载的目录 |
EXPOSE | 暴露端口 |
CMD | 指定这个容器启动的时候运行的命令 CMD只有最后一个会生效,可以被替代 |
ENTRYPOINT | 指定这个容器启动的时候运行的命令 可以追加命令 |
ONBUILD | 当构建一个被继承的Dockerfile , 这个时候就会运行ONBUILD指令 |
COPY | 类似ADD ,将我们文件拷贝到镜像中 |
ENV | 构建的时候设置环境变量 |
实战测试
官方Centos构建指令:https://github.com/CentOS/sig-cloud-instance-images/blob/b2d195220e1c5b181427c3172829c23ab9cd27eb/docker/Dockerfile
创建一个自己的centos
cd /home
mkdir dockerfile
vim mydockerfile_centos
cat mydockerfile_centos
dockerfile文件内容
FROM centos
MAINTAINER mpy<javaming@aliyun.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
通过文件构建镜像
# -f 代表文件路径 -t 镜像名和版本号
docker build -f mydockerfile_centos -t mycentos:0.1 .
# 查看镜像是否构建成功
docker images
docker run -it mycentos:0.1
# 查看镜像的构建过程
docker history 6c38062cecb7
我们平时拿到一个镜像通过docker history
命令 可以看看他是怎么构建的。
CMD和ENTRYPOINT的区别
CMD测试
# 编写dockerfile文件
vim dockerfile-cmd-test
# 文件内容
FROM centos
CMD ["ls","-a"]
# 运行之后 发现ls -a命令生效
docker build -f dockerfile-cmd-test -t mytest .
docker run mytest
# 追加命令 ls -al 但是发现报错 命令被替换为 -l 但是-l 不是命令所以报错
docker run mytest -l
ENTORYPOINT 测试
# 编写dockerfile文件
vim dockerfile-cmd-test2
# 文件内容
FROM centos
ENTORYPOINT ["ls","-a"]
# 运行之后 发现ls -a命令生效
docker build -f dockerfile-cmd-test2 -t mytest2 .
docker run mytest2
# 追加命令 ls -al 正确输出
docker run mytest -l
实战:TOMCAT镜像
- 准备Tomcat压缩包、jdk压缩包
jdk-8u11-linux-x64.tar.gz
apache-tomcat-9.0.54.tar.gz
- 编写dockerfile,官方命令
Dockerfile
,build
会自动寻找这个文件,就不需要-f
指定
touch readme.txt
vim Dockerfile
FROM centos
MAINTAINER mpy<javaming@aliyun.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.54.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.54
ENV CATALINA_PATH /usr/local/apache-tomcat-9.0.54
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.54/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.54/bin/logs/catalina.out
- 构建镜像
docker build -t diytomcat .
docker run -d -p 9090:8080 --name mpytomcat -v /Users/docker-study/tomcat/test:/usr/local/apache-tomcat-9.0.54/webapps/test -v /Users/docker-study/tomcat/logs:/usr/local/apache-tomcat-9.0.54/logs diytomcat
- 测试
docker exec -it f8cbc4531cb7 /bin/bash
# 查看发现启动失败
docker ps -a
docker logs d2680fcae466
发布镜像到DockerHub
- 注册自己的账号:https://hub.docker.com/
- 在服务器提交自己的镜像
# 提交失败 需要登陆
docker push diytomcat
denied: requested access to the resource is denied
docker login -u 用户名
Error saving credentials: error storing credentials - err: exit status 1, out:
Unable to obtain authorization for this operation.
切换普通用户登陆
docker login -u xxx -p password
An image does not exist locally with the tag: mpy/diytomcat
# 给镜像打tag
docker tag 4e294ae357ca mpy/diytomcat:1.0
docker push 772608160/diytomcat:1.0
这里要注意一个问题,给自己镜像命名的时候格式应该是: docker注册用户名/镜像名,比如我的docker用户名为 test123,那么我的镜像tag就为 test123/diytomcat,不然是push不上去的
发布镜像到阿里云容器服务
-
登陆阿里云 ,找到容器镜像服务
https://cr.console.aliyun.com/cn-shenzhen/instances -
创建个人实例 设置Registry登录密码
-
创建命名空间
-
创建镜像仓库、选择本地仓库
-
推送镜像
docker login --username=阿里云用户名 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/772608160/docker_images:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/772608160/docker_images:[镜像版本号]
- 查看镜像
Docker小结
Docker流程图
Docker命令