Dockfile自定义镜像

初识Dockerfile

Dockerfile 就是来构建docker镜像的构建文件!命令脚本!

通过这个脚本就可以生成镜像,镜像是一层一层的,脚本也是一个个的命令,每一个命令代表一层!

构建过程

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行从上到下顺序执行
  3. 每一个指令都会提交创建一个新的镜像层并提交
    image

指令

指令 说明
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

image

创建一个自己的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镜像

  1. 准备Tomcat压缩包、jdk压缩包

jdk-8u11-linux-x64.tar.gz
apache-tomcat-9.0.54.tar.gz

  1. 编写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

image

  1. 构建镜像
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

  1. 测试
docker exec -it f8cbc4531cb7 /bin/bash 
# 查看发现启动失败
docker ps -a 
docker logs d2680fcae466

image

发布镜像到DockerHub

  1. 注册自己的账号:https://hub.docker.com/
  2. 在服务器提交自己的镜像
# 提交失败 需要登陆
docker push diytomcat 

denied: requested access to the resource is denied

image

docker login -u 用户名

Error saving credentials: error storing credentials - err: exit status 1, out: Unable to obtain authorization for this operation.

image

切换普通用户登陆

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不上去的

发布镜像到阿里云容器服务

  1. 登陆阿里云 ,找到容器镜像服务
    https://cr.console.aliyun.com/cn-shenzhen/instances

  2. 创建个人实例 设置Registry登录密码

  3. 创建命名空间

  4. 创建镜像仓库、选择本地仓库

  5. 推送镜像

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:[镜像版本号]
  1. 查看镜像
    image

Docker小结

Docker流程图
image

Docker命令
image

posted @ 2021-10-26 13:00  狻猊的主人  阅读(160)  评论(0编辑  收藏  举报