docker入门与docker file介绍
原文地址
docker常用命令
docker file 详解
- https://blog.csdn.net/m0_46090675/article/details/121846718?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166745827216782427492149%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166745827216782427492149&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-121846718-null-null.142v62pc_rank_34_queryrelevant25,201v3control_1,213v1t3_control1&utm_term=dockerfile&spm=1018.2226.3001.4187
入门
基础命令
-
启动docker
- systemctl start docker
-
关闭docker
- systemctl stop docker
-
重启docker
- systemctl restart docker
-
docker设置随服务启动而自启动
- systemctl enable docker
-
查看docker运行状态
- systemctl status docker
-
查看docker 版本信息
- docker version 、docker info
-
docker帮助命令
- docker help
docker镜像命令
-
查看自己服务器中docker镜像列表
- docker images
-
搜索镜像
- docker search 镜像名
-
搜索STARS>9000的mysql 镜像
- docker search --filter=STARS=9000 mysql
-
拉取镜像,拉取latest版本
- docker pull 镜像名
-
拉取指定版本
- docker pull 镜像名:tag
-
运行镜像
- docker run 镜像名
-
运行指定版本
- docker run 镜像名:Tag
-
删除一个镜像
- docker rmi -f 镜像名/镜像ID
-
删除多个镜像
- docker rmi -f 镜像名/镜像ID 镜像名/ID
-
删除全部镜像 -a意思为显示全部,-q意思为只展示ID
- docker rmi -f $
-
强制删除镜像
- docker image rm 镜像名称/镜像ID
-
保存镜像
- docker save 镜像名/镜像ID -o 保存的目录
-
加载镜像
- docker load -i 镜像保存文件位置
- 任何装 docker 的地方加载镜像保存文件,使其恢复为一个镜像
-
镜像标签
-
有的时候呢,我们需要对一个镜像进行分类或者版本迭代操作,比如我们一个微服务已经打为docker镜像,但是想根据环境进行区分为develop环境与alpha环境,这个时候呢,我们就可以使用Tag,来进对镜像做一个标签添加,从而行进区分;版本迭代逻辑也是一样,根据不同的tag进行区分
-
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
- docker tag 源镜像名:TAG 想要生成新的镜像名:新TAG
- 如果忽略tag则会为镜像默认打上latest tag
-
-
查看正在运行的容器列表
- docker ps
-
查看所有容器,包含正在运行的,停止的
- docker ps -a
-
运行容器
-
docker run -it -d --name 要取得别名 镜像名:TAG /bin/bash
- -it 表示与容器进行交互式启动
- -d 表示可后台运行容器(守护式运行)
- --name 给要运行的容器起的名字
- /bin/bash 交互路径
-
-
实战:启动一个redis 把它的别名取为redis001 并交互式运行 需要的命令 —我这里指定版本号为5.0.5
-
docker pull redis:5.0.5
- 拉取镜像
-
docker run -it -d --name redis001 redis:5.0.5 /bin/bash
- 运行
-
docker ps
-
查看运行的容器
-
发现看到了 redis 使用了6379 端口 那么我们在关闭防火墙或开启了安全组的情况下 是否可以进行访问呢?
-
为了 区分 咱们使用linux 命令 查看一下
-
netstat -untlp
-
惊讶的发现,我们redis容器启动占用的 6379端口netstat 没有显示出来?什么情况?赶紧使用 redis desktop manger 连接测试一下
- 因为:占用的6379端口 仅仅是在容器中内部本身的端口,与宿主机的6379端口并无联系,我们通过宿主机Ip:6379访问此redis示例,那自然是找不到的哟!
-
补充
-
每一个 Docker容器都是独立和安全的应用平台(我们可以理解为,每一个docker容器都相当于在我们的服务器上占用资源然后开辟了属于自己的一个空间(也可以理解为服务器))
-
默认情况下,我们是无法通过宿主机(安装docker的服务器)端口来直接访问容器的 ,因为docker容器自己开辟空间的端口与宿主机端口没有联系…
-
如果外部想要访问容器,那必须得让容器中的端口与宿主机的端口建立联系绑定起来,这个正式的概念叫做 容器端口映射
-
具体步骤
-
docker stop 容器名/容器ID
- 首先停止容器
-
docker rm -f 容器名/容器ID
- 然后删除容器
-
-p 宿主机端口:容器端口
-
建立容器端口与服务器端口映射
-
docker run -it -d --name redis001 -p 8888:6379 redis:5.0.5 /bin/bash
- -p 8888:6379 解析 将容器内部的 6379端口与docker 宿主机(docker装在哪台服务器 哪台服务器就是宿主机)8888 端口进行映射 那通过外部访问宿主机8888端口 即可访问到 docker 容器 6379 端口了
- docker run -itd --name redis002 -p 8888:6379 redis:5.0.5 /bin/bash
-
-
-
-
那么容器端口映射有没有什么限制呢?
- 有的,虽说每个容器之间,环境都是隔离的,但是宿主机每个端口都是一个,8888端口被redis002容器绑定了,那么其他所有的容器都不可以使用8888这个端口了!!!
-
-
-
-
-
-
进入容器
-
docker exec -it 容器名/容器ID /bin/bash
- 推荐这种方式
-
docker attach 容器名/容器ID
-
-
退出容器
-
exit
- 直接退出 未添加 -d(持久化容器)时,执行此命令,容器会被关闭
-
ctrl + p + q
- 优雅退出 --- 无论是否添加-d参数,执行此命令容器都不会被关闭
-
-
停止容器
- docker stop 容器名/容器ID
-
重启容器
- docker restart 容器名/容器ID
-
启动容器
- docker start 容器名/容器ID
-
kill容器
- docker kill 容器名/容器ID
-
容器文件拷贝 —无论容器是否开启 都可以进行拷贝
-
docker cp 容器ID/名称:文件路径 要拷贝到外部的路径 | 要拷贝到外部的路径 容器ID/名称:文件路径
-
从容器内 拷出
- docker cp 容器ID/名称: 容器内路径 容器外路径
-
从外部 拷贝文件到容器内
- docker cp 容器外路径 容器ID/名称: 容器内路径
-
-
查看容器日志
- docker logs -f --tail=需要查看文件末尾的行数 默认all 容器ID
-
设置容器开机自启动
-
添加参数--restart=always 便表示,该容器随docker服务启动而自动启动
-
docker run -itd --name redis002 -p 8888:6379 --restart=always redis:5.0.5 /bin/bash
-
方法一、担心数据丢了,这说明你在跑容器的时候没有进行数据挂载吧???
-
数据挂载?
-
就是将容器内的数据与外部宿主机文件绑定起来,类似一个双持久化,当容器删除时,宿主机文件数据目录仍在,下次启动容器只要将数据目录指向宿主机数据所在位置即可恢复!
-
命令:-v 宿主机文件存储位置:容器内文件位置
- -v命令可以多次使用,即一个容器可以同时挂载多个文件
- -v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置
-
docker run -it -d -p 6379:6379 --name redis505 --restart=always -v /var/lib/redis/data:/data -v /var/lib/redis/conf/:/usr/local/etc/redis/redis.conf redis:5.0.5 --requirepass "password"
-
-
-
方法二:不想删容器,又想让这个容器设置开机自启动,那么我们修改其启动配置即可!
- docker update --restart=always 容器ID/容器名称
- docker container update --restart=always 容器ID/容器名称
- 如上,虽然不删容器就设置了自启动需求满足了,但是,危不危险,这个容器有没有需要数据恢复的情况?自己考量吧!!!
-
-
更换容器名
- docker rename 容器ID/容器名称 新容器名
镜像提交与运维
-
构建一个新的镜像
- docker commit -m=”提交信息“ -a=”作者信息“ 容器名/容器ID 提交后的镜像名:TAG
-
我们拉取一个tomcat镜像 并持久化运行 且设置与宿主机进行端口映射
-
docker pull tomcat
-
docker run -itd -p 8080:8080 --name /bin/bash
-
访问 咱的端口 发现访问404 这是因为咱配置了阿里云镜像后 所拉取得镜像都是最基础班的 仅仅包含其容器必要数据 例如 容器中 vim vi ll 命令都没有
-
咱们的webapps 下一个文件都没有 ,访问肯定404罗
- cd /usr/local/tomcat
- ls
-
不断查看 发现咱 webapps.dist 下是有文件的 我们把它拷贝的webapps 下 然后打包成一个新的镜像 后 访问查看是否进入到首页 不进入404页面
- cp -r webapps.dist/* webapps
- exit
- docker commit -a="leilei" -m "第一次打包镜像,打包后直接访问还会404吗" 容器id tom:1.0
-
为了区分 咱停止并删除之前tomcat 的容器
- docker stop 容器id
- docker rm -f 容器id
- docker ps -a
-
运行自己打包的容器
- docker run -d -it -p 6500:8080 --name lei tom:1.0 /bin/bash
- 访问6500 端口进入到了 tomcat 首页 说明 咱commit 镜像成功了
-
-
-
docker 运维命令
-
可能有时候发布会遇到如下错误:
-
docker: write /var/lib/docker/tmp/GetImageBlob325372670: no space left on device
-
这个错误是docker在写入的时候报错无机器无空间
-
查看docker工作目录
- sudo docker info |grep ”Docker Root Dir“
-
查看docker磁盘占用总体情况
- du -hs /var/lib/docker/
-
查看docker的磁盘使用具体情况
- docker system df
-
-
删除无用的容器和镜像
-
删除异常停止的容器
- docker rm
docker ps -a |grep Exited | awk '{print $1}'
- docker rm
-
删除名称或标签为none的镜像
- docker rmi -f
docker images |grep '<none>' | awk '{print $3}'
- docker rmi -f
-
-
清除所有无容器使用的镜像
- docker system prune -a
- 注意,此命令只要是镜像无容器使用(容器正常运行)都会被删除,包括容器临时停止
-
查找大文件
- find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr
-
查找指定docker使用目录下大于指定大小文件
- find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr |grep '/var/lib/docker/overlay2/*'
- ex:我这里是查找 /var/lib/docker/overlay2/* 开头的且大于100m的文件
-
docker file
一、Dockerfile(制作镜像脚本化)
-
1.1 什么是Dockerfile
-
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。
-
dockerfile 用于指示 docker image build 命令自动构建Image的源代码
-
是纯文本文件
-
示例
- docker build -f /path/Dockerfile
-
-
1.2 为什么要使用Dockerfile
-
问题:在dockerhub中官方提供很多镜像已经能满足我们的所有服务了,为什么还需要自定义镜像
- 核心作用:日后用户可以将自己应用打包成镜像,这样就可以让我们应用进行容器运行.还可以对官方镜像做扩展,以打包成我们生产应用的镜像。
-
完整镜像结构图
-
Dockerfile的格式
-
两种类型的行
- 以#开头的注释行
- 以专用”指令(instruction)“开头的指令行
-
由Image Builder顺序执行各指令,从而完成Image构建
-
-
二、docker build工作原理
-
语法
- docker build [选项] <上下文路径/URL/->
-
上下文
-
Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具
- Docker 的引擎提供了一组 REST API(Docker Remote API) ,而如 docker 命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,从而完成各种功能。
- 一切都是使用的远程调用形式在服务端(Docker 引擎)完成
-
docker build 命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的
-
那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢?
- 构建的时候,用户会指定构建镜像上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎
- Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件
-
为什么会有人误以为.·是指定 Dockerfile 所在目录呢?
- 因为在默认情况下,如果不额外指定 Dockerfile 的话,会将上下文目录下的名为 Dockerfile 的文件作为 Dockerfile
- 实际上 Dockerfile 的文件名并不要求必须为 Dockerfile,而且并不要求必须位于上下文目录中,比如可以用 -f …/Dockerfile 参数指定某个文件作为 Dockerfile
- 当然,一般大家习惯性的会使用默认的文件名 Dockerfile,以及会将其置于镜像构建上下文目录中。
-
-
三、 Dockerfile常用指令
-
官网地址
-
FROM
-
指定构建新image是使用的基础image,通常必须是dockerfile的第一个有效指令,但其前面也可以出现ARG指令
-
指定基础镜像,必须为第一个命令
-
格式
- FROM
- FROM
:
- FROM
@
- FROM
-
示例
- FROM mysql:5.6
-
注:
- tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
-
-
MAINTAINER(新版即将废弃)
-
维护者信息
-
格式:
-
MAINTAINER <name>
-
-
示例:
-
MAINTAINER bertwu
-
MAINTAINER [email protected]
-
MAINTAINER bertwu <[email protected]>
-
-
-
LABEL
-
附加到image之上的元数据,键值格式
-
用于为镜像添加元数据
-
格式:
-
LABEL <key>=<value> <key>=<value> <key>=<value> ...
-
-
示例:
- LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
-
注:
- 使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据
- 之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
-
-
ENV
-
以键值格式设定环境变量,可悲气候的指令所调用,且基于新生成的image运行的image运行的container中也会存在这些变量
-
设置环境变量
-
格式:
-
ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
-
ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
-
-
示例:
-
ENV myName John Doe
-
ENV myDog Rex The Dog
-
ENV myCat=fluffy
-
-
-
RUN
-
以FROM中定义的image为基础环境有运行指定命令,生成结果将作为新image的一个镜像层,并可由后续指令所使用
-
构建镜像时执行的命令
-
RUN用于在构建镜像时执行命令,其有以下两种命令执行方式:
-
shell执行
-
格式:
-
RUN <command>
-
-
-
exec执行
-
格式:
-
RUN ["executable", "param1", "param2"]
-
示例:
-
RUN ["executable", "param1", "param2"]
-
-
-
-
-
注:
- RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像
- 可以在构建时指定--no-cache参数,如:docker build --no-cache
-
-
CMD
-
基于改dockerfile生成的image运行container时,CMD能够指定容器中默认运行的程序,因而其可应该定义一次
-
构建镜像后调用,也就是在容器启动时才进行调用。
-
格式:
-
CMD ["executable","param1","param2"] (执行可执行文件,优先)
-
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
-
-
示例:
- CMD echo "This is a test." | wc -l
-
CMD ["/usr/bin/wc","--help"]
-
注:
- CMD不同于RUN
- CMD用于指定在容器启动时所要执行的命令
- 而RUN用于指定镜像构建时所要执行的命令
-
-
ENTRYPOINT
-
类似于CMD指令的功能,但不能被命令行指定要运行的应用程序覆盖,且与CMD共存时,CMD的内容将作为该指令中定义的成都的参数
-
配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
-
格式:
- ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
-
ENTRYPOINT command param1 param2 (shell内部命令)
-
示例:
- FROM ubuntu
ENTRYPOINT ["ls", "/usr/local"]
CMD ["/usr/local/tomcat"] - 之后,docker run 传递的参数,都会先覆盖cmd,然后由cmd 传递给entrypoint ,做到灵活应用
- FROM ubuntu
-
注:
- ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,
- 而docker run命令中指定的任何参数,都会被当做参数再次传递给CMD。
- Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,
- 而只执行最后的ENTRYPOINT指令。
- 通常情况下, ENTRYPOINT 与CMD一起使用,ENTRYPOINT 写默认命令,当需要参数时候 使用CMD传参
-
-
WORKDIR
-
为RUN、CMD、ENTRYPOINT、COPY和ADD等指令指定工作目录
-
工作目录,类似于cd命令
-
格式:
-
WORKDIR /path/to/workdir
-
-
示例:
-
WORKDIR /a (这时工作目录为/a)
-
WORKDIR b (这时工作目录为/a/b)
-
WORKDIR c (这时工作目录为/a/b/c)
-
-
注:
- 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
- 在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
-
-
ADD
-
与COPY指令的功能相似,但ADD额外也支持使用URL指定的资源作为源文件
-
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
-
格式:
-
ADD <src>... <dest>
-
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
-
-
示例:
-
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
-
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
-
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
-
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
-
-
-
COPY
- 复制主机上或者前一阶段构建结果中(需要使用--from选项)文件或目录生成新的镜像层
- 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
-
VOLUME
-
指定基于新生成的image运行container时期望作为volume使用的目录
-
用于指定持久化目录(指定此目录可以被挂载出去)
-
格式:
-
VOLUME ["/path/to/dir"]
-
-
示例:
-
VOLUME ["/data"]
-
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
-
-
注:
-
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
- 1 卷可以容器间共享和重用
- 2 容器并不一定要和其它容器共享卷
- 3 修改卷后会立即生效
- 4 对卷的修改不会对镜像产生影响
- 5 卷会一直存在,直到没有任何容器在使用它
-
-
-
EXPOSE
-
指定基于新生成的image运行container时期望暴露的端口,但实际暴露与否取决于docker run命令的选项,支持tcp和udp协议
-
指定于外界交互的端口
-
格式:
-
EXPOSE <port> [<port>...]
-
-
示例:
-
EXPOSE 80 443
-
EXPOSE 8080
-
EXPOSE 11211/tcp 11211/udp
-
-
注:
- EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
- 如果没有暴露端口,后期也可以通过-p 8080:80方式映射端口,但是不能通过-P形式映射
-
-
USER
-
为dockerfile中该指令后面的RUN、CMD和ENTRYPOINT指令中要运行的应用程序指定运行者身份UID,以及一个可选的GID
-
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
-
格式:
- USER user
- USER user:group
- USER uid
- USER uid:gid
- USER user:gid
- USER uid:group
-
示例:
-
USER www
-
-
注:
- 使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。
- 镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
-
-
ARG
-
定义专门用于build过程中的变量,但仅对该指定之后的调用生效,其值可由命令行选项“--build-arg”进行传递
-
用于指定传递给构建运行时的变量(给dockerfile传参),相当于构建镜像时可以在外部为里面传参
-
格式:
-
ARG <name>[=<default value>]
-
-
示例:
-
ARG site
ARG build_user=www
From centos:7
ARG parameter
VOLUME /usr/share/nginx
RUN yum -y install $parameter
EXPOSE 80 443
CMD nginx -g "daemon off;" -
可以这如下这样灵活传参
- docker build --build-arg=parameter=net-tools -t nginx:01 .
-
-
-
ONBUILD
-
触发器,生效于由该dockerfile构建出新的image被用于另一个dockerfile中的FROM指令作为基础镜像时
-
用于设置镜像触发器
-
格式:
- ONBUILD [INSTRUCTION]
-
示例:
- ONBUILD ADD . /app/src
- ONBUILD RUN /usr/local/bin/python-build --dir /app/src
-
注:
- NNBUID后面跟指令,当当前的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
-
-
STOPSIGNAL
- 用于通知container终止的系统调用信号
-
HEALTHCHECK
- 定义检测容器应用的健康状态的具体方法
-
SHELL
- 为容器定义运行时使用的默认shell程序,LInux系统默认使用["/bin/sh","-c"],windows默认使用["cmd",'/S','/C']
四、制作镜像
-
如果有多个RUN,自上而下依次运行,每次运行都会形成新的层,建议&& 放入一行运行
-
如果有多个CMD,只有最后一个运行
-
如果有多个Entrypoint,只有最后一个运行
-
如果CMD和entrypoint共存,只有entrypoint运行,且最后的CMD会当做entrypoint的参数
-
镜像制作分为两个阶段
- docker build阶段 基于dockerfile制作镜像 (RUN,用于此阶段的运行命令)
- docker run阶段 基于镜像运行容器 (CMD,基于image run容器时候,需要运行的命令)
- docker build 基于第一阶段的镜像被别人from制作新镜像 (entrypoint 或onbuild 基于镜像重新构建新镜像时候在此阶段运行的命令)
-
4.1 源码编译制作nginx镜像
-
This my first nginx Dockerfile
-
Version 1.0
Base images 基础镜像
FROM centos
MAINTAINER 维护者信息
MAINTAINER bertwu
ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
EXPOSE 映射端口
EXPOSE 80
CMD 运行以下命令
CMD ["nginx"]
- 编译镜像
- docker build -f 脚本文件名(默认dockerfile可以省略) -t 镜像名字 .(表示当前路径)
- 示例
- docker build -f dockerFile -t mynginx:0.1.0 .
-
4.2 制作简单镜像
- root@ubuntu:~# mkdir myapp
root@ubuntu:~/myapp# vim Dockerfile # 编写Dockerfile
FROM alpine:3.15
LABEL Maintainer="bertwu [email protected]"
ADD hosts /etc/hosts
- root@ubuntu:~# mkdir myapp
root@ubuntu:~/myapp# vim hosts # 编写文件
root@ubuntu:~/myapp# cat hosts
127.0.0.1 localhost
127.0.0.1 localhost.localdomain
172.100.100.100 xxx.com
root@ubuntu:~/myapp# docker image build . # 构建镜像
Sending build context to Docker daemon 3.072kB
Step 1/3 : FROM alpine:3.15
---> c059bfaa849c
Step 2/3 : LABEL Maintainer="bertwu [email protected]"
---> Running in 63324216f4ec
Removing intermediate container 63324216f4ec
---> bb69e6b659a2
Step 3/3 : ADD hosts /etc/hosts
---> 0d6e00e31ce6
Successfully built 0d6e00e31ce6
root@ubuntu:~/myapp# docker image tag 0d6e00e31ce6 myapp:1.0 # 添加标签
root@ubuntu:~/myapp# docker image ls # 查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
myapp 1.0 0d6e00e31ce6 About a minute ago 5.59MB
root@ubuntu:~/myapp# docker image inspect myapp:1.0 | grep -i maint
"Maintainer": "bertwu [email protected]"
"Maintainer": "bertwu [email protected]"
-
4.3 自作1.1版本
- root@ubuntu:~/myapp# vim repositories
https://mirrors.aliyun.com/alpine/v3.15/main
https://mirrors.aliyun.com/alpine/v3.15/community
- root@ubuntu:~/myapp# vim repositories
root@ubuntu:~/myapp# cat Dockerfile
FROM alpine:3.15
LABEL Maintainer="bertwu [email protected]"
ADD repositories /etc/apk/repositories # 添加自己指定的repositories
RUN apk update &&
apk add nginx bash # 安装nginx与bash
root@ubuntu:~/myapp# docker run --name myapp -it --rm myapp:1.1 /bin/bash # 制作镜像
bash-5.1# which nginx
/usr/sbin/nginx
bash-5.1#
bash-5.1# nginx -v
nginx version: nginx/1.20.2
bash-5.1#
bash-5.1# cat /etc/apk/repositories
https://mirrors.aliyun.com/alpine/v3.15/main
https://mirrors.aliyun.com/alpine/v3.15/community
-
4.4 构建centos镜像
-
下面通过编写Dockerfile文件来制作Centos镜像,并在官方镜像的基础上添加vim和net-tools工具。首先在/home/dockfile 目录下新建文件Dockerfile。然后使用上述指令编写该文件。
-
Dockerfile
[root@localhost dockerfile]# cat Dockerfile
FROM centos:7
MAINTAINER bertwu [email protected]
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim net-tools
EXPOSE 80
CMD /bin/bash -
逐行解释该Dockerfile文件的指令:
- FROM centos:7 该image文件继承官方的centos7
- ENV MYPATH /usr/local:设置环境变量MYPATH
- WORKDIR $MYPATH:直接使用上面设置的环境变量,指定/usr/local为工作目录
- RUN yum -y install vim && net-tools:在/usr/local目录下,运行yum -y install vim和yum -y install net-tools命令安装工具,注意安装后的所有依赖和工具都会打包到image文件中
- EXPOSE 80:将容器80端口暴露出来,允许外部连接这个端口
- CMD:指定容器启动的时候运行命令
-
下面执行build命令生成image文件,如果执行成功,可以通过docker images来查看新生成的镜像文件。
- docker build -t mycentos:1.0 .
-
可以使用 docker history 镜像id 查看镜像构建过程
- docker history e0316e2ed3a5
-
进入容器,看看是否能够执行ifconfig 及vim命令
- docker run -it mycentos:1.0
-
-
4.5 构建springboot应用
- cat Dockerfile
FROM openjdk:8-jre # jar包基于jdk ,war包基于tomcat
WORKDIR /app
ADD demo-0.0.1-SNAPSHOT.jar app.jar # 将上下文中 jar包复制到 /app目录下,并且重命名为app.jar
EXPOSE 8081 # 暴露端口
ENTRYPOINT[ "java" , "-jar" ] # 启动应用固定命令
CMD["app.jar"] # 动态传递jar包名
details/121846718