七、DockerFile

1.DockerFile介绍

dockerfile是用来构建docker镜像的文件!命令参数脚本!

构建步骤:

1 编写一个dockerfile文件
2 docker build 构建称为一个镜像
3 docker run运行镜像
4 docker push发布镜像(DockerHub 、阿里云仓库)

但是很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

官方既然可以制作镜像,那我们也可以!

2.DockerFile构建过程

基础知识:

1、每个保留关键字(指令)都是必须是大写字母
2、命令从上到下顺序执行
3#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!

Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!

Docker镜像逐渐成企业交付的标准,必须要掌握!

DockerFile:构建文件,定义了一切的步骤,源代码

DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。

Docker容器:容器就是镜像运行起来提供服务。

dockerfile常用命令

# DockerFile常用指令
FROM        # 基础镜像,一切从这里开始构建
MAINTAINER  # 镜像是谁写的, 姓名+邮箱
RUN         # 镜像构建的时候需要运行的命令
ADD         # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR     # 镜像的工作目录
VOLUME      # 挂载的目录
EXPOSE      # 保留端口配置
CMD         # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT  # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD     # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。
COPY        # 类似ADD,将我们文件拷贝到镜像中
ENV         # 构建的时候设置环境变量!

3.实战测试

创建一个自己的centos

由于官方镜像的centos中的yum源无法直接使用,这里使用fodora来测试

1.编写Dockerfile文件

[root@fedora ~]# vim dockerfile-fedora
[root@fedora ~]# cat dockerfile-fedora
FROM fedora
MAINTAINER charlie<2837384732@qq.com>

ENV MYPATH /uer/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo "hello world !"
CMD echo "-----end-----"
CMD /bin/bash

2、通过这个文件构建镜像

# 命令 docker build -f 文件路径 -t 镜像名:[tag] .
[root@fedora ~]# docker build -f dockerfile-fedora -t fedora-test:1.0 .
Sending build context to Docker daemon  22.06MB
Step 1/10 : FROM fedora
......
......
Successfully built 38c506ae8c48
Successfully tagged fedora-test:1.0
[root@fedora ~]# docker images
REPOSITORY            TAG              IMAGE ID       CREATED              SIZE
fedora-test           1.0              38c506ae8c48   About a minute ago   499MB
fedora                latest           b78af7a83692   6 months ago         153MB
centos                latest           5d0da3dc9764   9 months ago         231MB

3、 运行测试刚刚构建的镜像

[root@fedora ~]# docker run -it fedora-test:1.0
[root@12b99b6f3d56 local]# pwd
/uer/local
[root@12b99b6f3d56 local]# vim
[root@12b99b6f3d56 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 26  bytes 3135 (3.0 KiB)
        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

4、查看这个镜像的本地变更历史

[root@fedora ~]# docker history fedora-test:1.0 
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
38c506ae8c48   8 minutes ago    /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
0feb6a235f38   8 minutes ago    /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
89f3f4a51de7   8 minutes ago    /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
6eaa58d9f4b9   8 minutes ago    /bin/sh -c #(nop)  EXPOSE 80                    0B        
d61754097294   8 minutes ago    /bin/sh -c yum install -y net-tools             43.3MB    
4c89a289975a   9 minutes ago    /bin/sh -c yum install -y vim                   303MB     
42c9d6ec66fa   15 minutes ago   /bin/sh -c #(nop) WORKDIR /uer/local            0B        
4d9c09fb52b7   15 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/uer/local        0B        
697a92cc27ee   15 minutes ago   /bin/sh -c #(nop)  MAINTAINER charlie<283738…   0B        
b78af7a83692   6 months ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      6 months ago     /bin/sh -c #(nop) ADD file:f495e5783588b2180…   153MB     
<missing>      8 months ago     /bin/sh -c #(nop)  ENV DISTTAG=f35container …   0B        
<missing>      14 months ago    /bin/sh -c #(nop)  LABEL maintainer=Clement …   0B        

 CMD ENTRYPOINT区别

CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令

 测试cmd

# 编写dockerfile文件
[root@fedora ~]# touch cmd-test
[root@fedora ~]# vim cmd-test 
[root@fedora ~]# cat cmd-test 
FROM centos
CMD ["ls","-a"]
# 构建镜像
[root@fedora ~]# docker build -f cmd-test -t cmd-test:1.0 .
Sending build context to Docker daemon  22.06MB
Step 1/2 : FROM centos
......
Successfully built f433adf26614
Successfully tagged cmd-test:1.0
# 运行镜像
[root@fedora ~]# docker run cmd-test:1.0
.
..
.dockerenv
bin
......
......
var
# 想追加一个命令 -l 成为ls -al
[root@fedora ~]# docker run cmd-test:1.0 -l
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0001] error waiting for container: context canceled 
# cmd的情况下 -l 替换了CMD["ls","-l"]。 -l 不是命令所以报错

 测试ENTRYPOINT

# 编写Dockerfile文件
[root@fedora ~]# touch entrypoint-test
[root@fedora ~]# vim entrypoint-test 
[root@fedora ~]# cat entrypoint-test 
FROM centos
ENTRYPIONT ["ls","-a"]
# 构建镜像
[root@fedora ~]# docker build -f entrypoint-test -t entrypoint-test:1.0 .
......
......
Successfully built 561367223508
Successfully tagged entrypoint-test:1.0
# 运行测试,此时和CMD命令一致
[root@fedora ~]# docker run entrypoint-test:1.0
......
......
tmp
usr
var
# 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的
# 追加“-l”,可以正常执行
[root@fedora ~]# docker run entrypoint-test:1.0 -l
total 16
......
......
drwxrwxrwt.   1 root root  202 Sep 15  2021 tmp
drwxr-xr-x.   1 root root  100 Sep 15  2021 usr
drwxr-xr-x.   1 root root  176 Sep 15  2021 var

Dockerfile中很多命令都十分相似,我们需要了解它们的区别,最好的学习方式就是对比他们然后测试效果! 

4.实战:Tomcat镜像

 1、准备镜像文件

准备tomcat jdk到当前目录,编写好readme.txt

[root@fedora ~]# touch readme.txt
[root@fedora ~]# ls
apache-tomcat-10.0.22.tar.gz  Dockerfile  jdk-18_linux-x64_bin.tar.gz  readme.txt

 2、编写dokerfile

[root@fedora ~]# vim Dockerfile
[root@fedora ~]# cat Dockerfile 
FROM centos
MAINTAINER charlie<2837384732@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-18_linux-x64_bin.tar.gz /usr/local/
ADD apache-tomcat-10.0.22.tar.gz /usr/local/
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk-18.0.1.1
ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib
EXPOSE 8080
CMD /usr/local/apache-tomcat-10.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-10.0.22/logs/catalina.out

3、构建镜像 

因为dockerfile命名使用默认命名 因此不用使用-f 指定文件

[root@fedora ~]# docker build -t tomcat-test .
Sending build context to Docker daemon  216.3MB
Step 1/12 : FROM centos
 ---> 5d0da3dc9764
......
Successfully built efd70b9f3c8c
Successfully tagged tomcat-test:latest
[root@fedora ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
tomcat-test           latest    efd70b9f3c8c   8 seconds ago   566MB
centos                latest    5d0da3dc9764   9 months ago    231MB

4run镜像

[root@fedora ~]# docker run -d -p 8080:8080 --name tomcat-test \
-v /root/tomcat/test/:/usr/local/apache-tomcat-10.0.22/webapps/test \
-v /root/tomcat/tomcatlogs/:/usr/local/apache-tomcat-10.0.22/logs \
tomcat-test

[root@fedora ~]# docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                       NAMES
25c48fcaeb16   tomcat-test   "/bin/sh -c '/usr/lo…"   6 seconds ago   Up 4 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   tomcat-test

5、访问测试

[root@fedora ~]# curl localhost:8080
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/10.0.22</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
    </head>
......
......

6、发布项目

(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)

在test目录下写好相应文件

[root@fedora test]# pwd
/root/tomcat/test
[root@fedora test]# ls
index.jsp  WEB-INF
[root@fedora test]# cat index.jsp 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test pages</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("---my test web logs---");
%>
</body>
</html>
[root@fedora test]# cat WEB-INF/web.xml 
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>

发现:项目部署成功,可以直接访问!

我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行! 

5.发布自己的镜像

1、官方地址 https://hub.docker.com

2、确定你的账号可以登录

3、登录

# 查看docekr login帮助信息
[root@fedora ~]# 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
# 使用自己的Docker Hub账号密码登录
[root@fedora ~]# docker login -u simplerude
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

4、提交 push镜像 

[root@fedora ~]# docker push tomcat-test
Using default tag: latest
The push refers to repository [docker.io/library/tomcat-test]
318bde1168ac: Preparing 
da9566abf460: Preparing 
cd1d11968130: Preparing 
74ddd0ec08fa: Preparing 
denied: requested access to the resource is denied
# 发现push不上去,因为如果没有前缀的话默认是push到 官方的library
# 解决方法
# 第一种 build的时候添加你的dockerhub用户名,然后再push就可以放到自己的仓库了
docker build -t simplerude/tomcat-test:1.0 .  # 就是重新构建,前面带上用户名
# 第二种 使用docker tag  # 然后再次push
docker tag 容器id simplerude/tomcat-test:1.0  # 再次push
[root@fedora ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED             SIZE
tomcat-test           latest    efd70b9f3c8c   About an hour ago   566MB
centos                latest    5d0da3dc9764   9 months ago        231MB

[root@fedora ~]# docker tag efd70b9f3c8c simplerude/tomcat-test:1.0
[root@fedora ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED             SIZE
tomcat-test              latest    efd70b9f3c8c   About an hour ago   566MB
simplerude/tomcat-test   1.0       efd70b9f3c8c   About an hour ago   566MB
centos                   latest    5d0da3dc9764   9 months ago        231MB

[root@fedora ~]# docker push simplerude/tomcat-test:1.0
The push refers to repository [docker.io/simplerude/tomcat-test]
318bde1168ac: Pushed 
da9566abf460: Pushed 
cd1d11968130: Pushed 
74ddd0ec08fa: Pushed 
1.0: digest: sha256:0f43c0e0fb5ad06857317edc236c5f2b016d9db2cc9dc9564835cb257c7668ec size: 1161

 提交的时候也是按照层级进行提交的!

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

1.登录阿里云

2.产品-->容器与中间件-->容器镜像服务ACR-->管理控制台

3.创建命名空间-->创建镜像仓库

4.官方的操作指南极其详细

 操作指南
1. 登录阿里云Docker Registry

$ docker login --username=charliebrown registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。

2. 从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/simplerude/simplerude:[镜像版本号]

3. 将镜像推送到Registry
$ docker login --username=charliebrown registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/simplerude/simplerude:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/simplerude/simplerude:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。

5. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ docker images
REPOSITORY                                                         TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
registry.aliyuncs.com/acs/agent                                    0.7-dfb6816         37bb9c63c8b2        7 days ago          37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816

使用 "docker push" 命令将该镜像推送至远程。
$ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
测试
[root@fedora ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
alpine                latest    c059bfaa849c   7 months ago    5.58MB

[root@fedora ~]# docker tag c059bfaa849c registry.cn-hangzhou.aliyuncs.com/simplerude/alpine:1.0
[root@fedora ~]# docker images
REPOSITORY                                            TAG       IMAGE ID       CREATED         SIZE
registry.cn-hangzhou.aliyuncs.com/simplerude/alpine   1.0       c059bfaa849c   7 months ago    5.58MB
alpine                                                latest    c059bfaa849c   7 months ago    5.58MB

[root@fedora ~]# docker push registry.cn-hangzhou.aliyuncs.com/simplerude/alpine:1.0
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/simplerude/alpine]
8d3ac3489996: Pushed 
1.0: digest: sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3 size: 528

 

6.小结

回顾

posted @ 2022-06-24 21:24  CharlieBrown  阅读(172)  评论(0编辑  收藏  举报
标题