1、关于 Docker
docker官网:http://www.docker.com
docker中文网站:https://www.docker-cn.com/
Docker Hub 仓库官网: https://hub.docker.com/
Docker 的基本组成:镜像(image)
、容器(container)
、仓库(repository)
。
-
Docker 镜像(Image)就是一个只读的模板
。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。 -
Docker 利用容器(Container)独立运行的一个或一组应用,容器是用镜像创建的运行实例
。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。 -
仓库(Repository)是集中存放镜像文件的场所
。仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签 tag。- 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
- 最大的公开仓库是 Docker Hub ( https://hub.docker.com/ ),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云 等。
Docker 架构图 :
需要正确的理解仓储/镜像/容器这几个概念 :
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖,打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
-
image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
-
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
-
至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。
文章来源:https://www.toymoban.com/news/detail-606691.html
2、Docker常用命令
2.1、帮助命令
docker version
docker info
# 帮助命令
docker --help
# 示例:
[root@hecs-100612 ~]# docker search --help
Usage: docker search [OPTIONS] TERM
Search Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results
--no-trunc Don't truncate output
2.2、镜像命令
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
2.2.1、docker images
# 列出本地主机上的镜像,基本语法
docker images [选项]
# 使用示例:
[root@hecs-100612 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zim-gateway 1.0 74763166937f 6 days ago 536MB
kdvolder/jdk8 latest b83ae7c076b1 5 years ago 488MB
# 常用选项
-a : 列出本地所有的镜像(含中间映像层)
-q : 只显示镜像ID
-digests : 显示镜像的摘要信息
--no-trunc : 显示完整的镜像信息
# 使用示例:
[root@hecs-100612 ~]# docker images -aq
74763166937f
b83ae7c076b1
列名 | 说明 |
---|---|
REPOSITORY | 表示镜像的仓库源 |
TAG | 镜像的标签 |
IMAGE ID | 镜像ID |
CREATED | 镜像创建时间 |
SIZE | 像大小 |
2.2.2、docker serch
# 查找镜像,查询网站: https://hub.docker.com
docker search [OPTIONS] 镜像名字
# 使用示例
[root@hecs-100612 ~]# docker search jdk8
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
circleci/jdk8 This image is for internal use 2
dockette/jdk8 My Oracle Java 8 Dockerfile 4 [OK]
eclipse/ubuntu_jdk8 Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, … 14 [OK]
eclipse/centos_jdk8 CentOS, JDK8, Maven 3, git, curl, nmap, mc, … 5 [OK]
列名 | 说明 |
---|---|
NAME | 镜像仓库源的名称 |
DESCRIPTION | 镜像的描述 |
OFFICIAL | 是否 docker 官方发布 |
AUTOMATED | 自动构建 |
STARS | 类似 Github 里面的 star,表示点赞、喜欢的意思 |
docker search命令的一些常用选项包括:
–automated:只列出自动化构建类型的镜像。
–no-trunc:显示完整的镜像描述,不截断。
-f <过滤条件>:列出符合过滤条件的镜像。
–limit:限制搜索结果的数量,默认为25。
–no-trunc:禁止截断输出。
–stars:只显示收藏数不小于指定值的镜像,需要与–filter选项一起使用。
–filter:根据给定条件过滤输出,例如:–filter stars=3 表示只显示收藏数不小于3的镜像。
–format:使用模板格式化显示输出,例如:–format “{{.Repository}} {{.Tag}}” 表示只显示镜像仓库和标签。
2.2.3、docker pull
# 下载镜像,不指定tag,就是默认 tag: latest
docker pull 镜像名字[:TAG]
# docker pull tomcat 等价于 docker pull tomcat:lastest
2.2.4、docker rmi
# 删除单个镜像
docker rmi -f 镜像ID
# 删除多个镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG
# 删除全部镜像
docker rmi -f $(docker images -qa)
2.2.5、docker build
# 使用 docker build 指令的前提条件是,先创建一个 Dockerfile 文件,注意命令最后有一个 .
docker build -t [创建的镜像名称]:[创建镜像的TAG] .
# 参数说明:
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
# 使用示例
docker build -t runoob/centos:6.7 .
注意:
docker build -t [创建的镜像名称]:[创建镜像的TAG] .
# 这里最后的 . 是上下文路径。
# 上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
# 如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
# 由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
2.2.6、docker tag
# 为镜像设置新的tag 标签,使用 docker tag 命令后,会新增一个镜像ID相同的镜像,只是 tag 不同。
docker tag 镜像ID 镜像名称:镜像新的tag
# 使用示例
docker tag 860c279d2fec runoob/centos:dev
2.2.7、docker commit
# docker commit 指令:提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
# 案例演示:
# 第一步:从Hub上下载tomcat镜像到本地并成功运行
docker pull tomcat
# 第二步:运行
# 说明: -p 主机端口:docker容器端口。 -i:交互。 -t:终端。
# 说明:-P : 随机分配端口。 示例: docker run -it -p tomcat
docker run -it -p 8080:8080 tomcat
# 第三步:对正在运行的 tomcat 做一些定制化的处理
# 第四步: commit 类似通过正在运行的容器实例,创建了一个镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名TAG]
# 第五步:docker images 发现第四步新建的镜像新增了。
2.3、容器命令
有镜像才能创建容器,这是根本前提。
2.3.1、docker run
# 新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 使用示例:
# /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
# 说明: -i: 交互式操作。 -t: 终端。 ubuntu: ubuntu 镜像。
docker run -it ubuntu /bin/bash
# 启动守护式容器 【重要】
docker run -d 容器名
# 后台运行示例:后台运行的,我们可以过 -d 指定容器的运行模式。
docker run -itd --name ubuntu-test ubuntu /bin/bash
# -v:将宿主机的某个目录挂载到容器的某个目录
-v <宿主机目录>:<容器目录>
# 示例:将宿主机上的/data目录挂载到容器的/app/data目录
docker run -v /data:/app/data <其他选项> <镜像名>
docker run -v myvolume:/data/myvolume -itd mycontainer
-e :传入变量。
# 示例:创建容器并传入变量并查看变量
docker run -itd --name ubuntu-test ubuntu -e TEST=123456 ubuntu
docker exec ubuntu-test echo $TEST
# –restart :容器挂了之后尝试重启
# 容器挂了之后一直尝试重启
docker run -itd --name ubuntu-test ubuntu --restart alway
# 容器挂了之后重启3次失败就放弃
docker run -itd --name ubuntu-test ubuntu --restart on-failure:3 ubuntu
2.3.2、docker ps
# 列出当前所有正在运行的容器
docker ps [OPTIONS]
# 示例:
[root@hecs-100612 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14462adc03d8 zim-gateway:1.0 "nohup java -jar -se…" 7 days ago Up 3 days 0.0.0.0:80->80/tcp, :::80->80/tcp heuristic_colden
6159d8db8d92 679faa80fdd0 "nohup java -jar -se…" 7 days ago Exited (143) 7 days ago serene_haslett
2.3.3、docker start
# docker start 启动一个已停止的容器
docker start 容器ID或者容器名
2.3.4、docker restart
# 重启容器
docker restart 容器ID或者容器名
2.3.5、docker stop
# 停止容器
docker stop 容器ID或者容器名
2.3.6、docker kill
# 强制停止容器
docker kill 容器ID或者容器名
2.3.7、docker rm
# docker rm 和 docker rmi 是有区别的,不要混淆使用
# 删除已停止的容器
docker rm [选项] 容器ID
# 删除多个容器
docker rm -f $(docker ps -a -q)
# 常用选项说明:
-f :通过 SIGKILL 信号强制删除一个运行中的容器。
-l :移除容器间的网络连接,而非容器本身。
-v :删除与容器关联的卷
2.3.8、docker export
# 如果要导出本地某个容器,可以使用 docker export 命令
# 使用示例:导出容器 1e560fca3906 快照到本地文件 ubuntu.tar
docker export 1e560fca3906 > ubuntu.tar
[root@hecs-100612 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14462adc03d8 zim-gateway:1.0 "nohup java -jar -se…" 7 days ago Up 3 days 0.0.0.0:80->80/tcp, :::80->80/tcp heuristic_colden
[root@hecs-100612 ~]# docker export 14462adc03d8 > /usr/zim-gateway.tar
[root@hecs-100612 ~]# ls /usr
bin etc games include lib lib64 zim-gateway.tar
2.3.9、docker import
# 可以使用 docker import 从容器快照文件中再导入为镜像.
docker import
# 使用示例:将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1
$ cat /usr/ubuntu.tar | docker import - test/ubuntu:v1
# 也可以通过指定 URL 或者某个目录来导入,例如:
$ docker import http://example.com/exampleimage.tgz example/imagerepo
2.3.10、docker logs
# 查看容器日志 【重要】
docker logs -f -t --tail 2 容器ID
# 参数说明
-t :是加入时间戳
-f :跟随最新的日志打印
--tail 数字 : 显示最后多少条
# 使用示例:
[root@hecs-100612 usr]# docker logs -f -t --tail 10 14462adc03d8
2023-08-24T01:26:18.986356898Z nohup: ignoring input and appending output to 'nohup.out'
2023-08-27T03:42:55.015537717Z nohup: ignoring input and appending output to 'nohup.out'
2.3.11、docker top
# 查看容器内运行的进程 【重要】
docker top 容器ID
# 使用示例:
[root@hecs-100612 usr]# docker top 14462adc03d8
UID PID PPID C STIME TTY TIME CMD
root 45762 45741 0 Aug27 pts/0 00:24:17 java -jar -server -Xms256m -Xmx256m -Duser.timezone=GMT+8 -Dspring.config.location=bootstrap.yml zim-gateway-1.0-SNAPSHOT.jar > /dev/null 2>&1 &
2.3.12、docker inspect
# 查看容器内部细节 【重要】
docker inspect 容器ID
2.3.13、docker cp
# 从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
2.3.14、进入容器
# 在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
docker attach 容器ID
# 或 docker exec:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止。
docker exec 容器ID
# 使用示例:
docker exec -it 243c32535da7 /bin/bash
# docker attach 和 docker exec 都是进入正在运行的容器并以命令行交互,两者区别:
# attach 直接进入容器启动命令的终端,不会启动新的进程
# exec 是在容器中打开新的终端,并且可以启动新的进程
2.3.15、退出容器
# 方式一: 使用 exit(Esc 键):退出容器,且容器停止
# 方式二: 使用 Ctrl + P + Q : 退出容器,且容器不停止
2.3.16、容器后台启动说明
说明:
1、使用镜像centos:latest以后台模式启动一个容器。
docker run -d centos
2、再用命令:docker ps -a 进行查看, 会发现容器已经退出。
原因:
1、docker容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为空闲,就会自行退出。
2、容器运行的命令如果不是那些一直挂起的命令( 运行top,tail、循环等),就是会自动退出
3、这个是 docker 的机制问题。
解决办法:
1、使用交互模式后台启动(推荐),命令:docker run -dit centos /bin/bash
2、启动死循环进程(不推荐),命令:docker run -d centos /bin/sh -c “while true; do echo hello world; sleep 1; done”
3、Docker容器数据卷
3.1、创建容器数据卷
Docker 容器数据卷,有点类似我们Redis里面的rdb和aof文件。容器数据卷是一种用于持久化存储数据的机制。它允许容器内的数据在容器被删除、重启或迁移时保留下来,以确保数据的持久性和可靠性。
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
Docker 容器数据卷 作用:
- ① 容器的持久化
- ② 容器间继承+共享数据
使用Docker数据卷,我们可以在创建容器时将一个目录或文件挂载到容器的指定路径上,使得容器内的应用程序可以访问和操作这个挂载的目录或文件。这样,无论容器被删除,还是新的容器替换了旧的容器,数据卷都会被保留下来,不会丢失。
# 方式一:通过命令行创建Docker数据卷,示例:
docker volume create myvolume
# 方式二:通过Dockerfile创建Docker数据卷,示例:
FROM nginx:latest
VOLUME /var/app/logs
# 运行通过 Dockerfile build 生成的镜像。如果 run 命令没有设置容器数据卷默认的宿主机绝对目录,
# 那会默认生成一个 宿主机的路径 一般在 /var/lib/docker/volumes/随机字符串/_data/
# 方式三:创建容器时挂载Docker数据卷
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
# 多个容器数据卷
docker run -it -v /宿主机绝对路径目录1:/容器内目录1 -v /宿主机绝对路径目录2:/容器内目录2 镜像名
# 创建容器时挂载Docker数据卷,示例:
# myvolume 是创建的数据卷名称,可随意命名。
# /data/myvolume 是数据卷在容器内的挂载路径,可以根据实际情况自定义。
docker run -d -v myvolume:/data/myvolume mycontainer
# 通过命令行,创建容器卷,并且容器内的文件设置只读
docker run -itd -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
3.2、容器建传递共享
# 容器传递共享
--volumes-form
# 运行 zzyy/centos 镜像,取名 dc01
docker run -it -v /usr/myvolume1:/dataVolumeContainer1 -v /usr/myvolume2:/dataVolumeContainer2 --name dc01 zzyy/centos
# 再运行 zzyy/centos 镜像,取名 dc02
docker run -it --name dco2 --volumes-from dc01 zzyy/centos
# 再运行 zzyy/centos 镜像,取名 dc03
docker run -it --name dco3 --volumes-from dc01 zzyy/centos
-
总体介绍
-
以上一步新建的镜像zzyy/centos为模板并运行容器dc01/dc02/dc03
-
它们已经具有容器卷
-
/dataVolumeContainer1
-
/dataVolumeContainer2
-
-
-
容器间传递共享(–volumes-from)
-
先启动一个父容器dc01 命令: docker run -it --name dc01 zzyy/centos
- 在dataVolumeContainer2新增内容
-
dc02/dc03继承自dc01
-
命令: docker run -it --name dco2 --volumes-from dc01 zzyy/centos
-
命令: docker run -it --name dco3 --volumes-from dc01 zzyy/centos
- dc02/dc03分别在dataVolumeContainer2各自新增内容
-
-
回到dc01可以看到02/03各自添加的都能共享了
-
删除dc01(docker rm -f dc01),dc02修改dataVolumeContainer2 里面的内容后,dc03 依旧可访问dataVolumeContainer2 目录内修改的内容
-
删除dc02后,dc03依旧可以访问 dataVolumeContainer2 内容
-
新建dc04继承dc03后再删除dc03,dc04 依旧可以访问 dataVolumeContainer2 内容
-
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
-
4、DockerFile
-
Dockerfile 是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
-
构建容器三步骤
-
编写 Dockerfile 文件
-
docker build
-
docker run
-
4.1、DockerFile构建过程
-
Dockerfile内容基础知识
-
1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
-
2:指令按照从上到下,顺序执行
-
3:#表示注释
-
4:每条指令都会创建一个新的镜像层,并对镜像进行提交
-
-
Docker执行Dockerfile的大致流程
-
(1)docker从基础镜像运行一个容器
-
(2)执行一条指令并对容器作出修改
-
(3)执行类似docker commit的操作提交一个新的镜像层
-
(4)docker再基于刚提交的镜像运行一个新容器
-
(5)执行dockerfile中的下一条指令直到所有指令都执行完成
-
4.2、DockerFile保留字指令
4.2.1、LABEL
LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
# 应用示例:添加镜像的作者
LABEL org.opencontainers.image.authors="tom"
4.2.2、FROM 和 RUN
FROM:定制的镜像都是基于 FROM 的镜像。
RUN:用于执行后面跟着的命令行命令。RUN 是在 docker build 时运行。
# FROM 和 RUN 应用示例:
# 这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
# RNU 有两种格式(shell格式 和 exec格式):
# shell 格式:<命令行命令> 等同于,在终端操作的 shell 命令。
RUN <命令行命令>
# exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
# exec 格式示例: 等价于 RUN ./test.php dev offline
# RUN ["./test.php", "dev", "offline"]
# Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
# 以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
# 以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
4.2.3、COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。(上下文目录,详见 docker build 命令处)
# COPY 命令格式
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
# [--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
# <源路径>:源文件或者源目录,可以是通配符表达式,通配符规则要满足Go的filepath.Match 规则。
# 例如: COPY hom* /mydir/ 或 COPY hom?.txt /mydir/
# <目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
4.2.4、ADD
ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
ADD 的优点 | ADD 的缺点 |
---|---|
在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。 | 在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。 |
4.2.5、CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。启动容器时。
- RUN 是在 docker build 时运行。构建镜像时。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
# CMD 执行格式一:
CMD <shell 命令>
# CMD 执行格式二:推荐使用
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
# 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
CMD ["<param1>","<param2>",...]
# 实际上在运行的过程中格式一,也会自动转换成格式二运行,并且默认可执行文件是 sh。
4.2.6、ENTRYPOINT
类似于 CMD 指令,ENTRYPOINT 不会被 docker run (启动容器)的命令行参数指定的指令所覆盖,且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
# ENTRYPOINT 使用格式
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
# 使用示例:假设已通过 Dockerfile 构建了 nginx:test 镜像:
### =================== Dockerfile 开始 =================
FROM nginx
# 定参
ENTRYPOINT ["nginx", "-c"]
# 变参 ,一般是变参才会使用 CMD
CMD ["/etc/nginx/nginx.conf"]
### =================== Dockerfile 结束 =================
# 上面的 DockerFile 构建镜像后,启动容器
# 1、不传参运行
docker run nginx:test
# 容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/nginx.conf
# 2、传参运行:容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
docker run nginx:test -c /etc/nginx/new.conf
# 容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/new.conf
4.2.7、ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
# 两种使用格式:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
# 使用示例:设置 NODE_VERSION = 7.2.0 然后在后续的指令中可以通过 $NODE_VERSION 引用:
ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
4.2.8、VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
- 避免重要的数据,因容器重启而丢失,这是非常致命的。
- 避免容器不断变大。
# 使用格式: 路径1、路径2 是针对容器的
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
4.2.9、EXPOSE
EXPOSE 仅仅只是声明端口。
作用:
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
# 使用格式:
EXPOSE <端口1> [<端口2>...]
4.2.10、WORKDIR
WORKDIR 用来指定工作目录。其指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
# 使用格式
WORKDIR <工作目录路径>
4.2.11、USER
# 用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
# 使用格式:
USER <用户名>[:<用户组>]
4.2.12、HEALTHCHECK
# 用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
# 如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK NONE
# 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
HEALTHCHECK [选项] CMD <命令>
4.2.13、ONBUILD
用于延迟构建命令的执行。 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
# 使用格式:
ONBUILD <其它指令>
4.2.14、部署项目Dockerfile示例
FROM kdvolder/jdk8
LABEL authors="zim"
# 在容器内创建一个名为"/usr/micro_software/zim-gateway/"的工作目录
RUN mkdir "/zim-gateway"
# #暴露端口
EXPOSE 80
# #创建着陆点 登录进入的目录
WORKDIR "/zim-gateway"
# #复制新的目录运行程序 这里 COPY 的路径是 jar源路径与相应的 Dockerfile 文件的相对路径,否则会报错
COPY ./zim-gateway-1.0-SNAPSHOT.jar /zim-gateway/zim-gateway-1.0-SNAPSHOT.jar
# # 复制配置文件 这里源路径也是 相对路径
COPY ./bootstrap.yml /zim-gateway/bootstrap.yml
# #挂载日志目录
VOLUME /zim-gateway
# # 切换指定位置
RUN cd /zim-gateway
# #运行我的jar包
CMD ["nohup","java","-jar","-server","-Xms256m","-Xmx256m","-Duser.timezone=GMT+8","-Dspring.config.location=bootstrap.yml","zim-gateway-1.0-SNAPSHOT.jar",">","/dev/null","2>&1","&"]
################# build容器 ###########################
# docker build -t zim-gateway:1.0 .
################# 启动容器 ###################
# docker run -itd -p 80:80 --restart=always -v /usr/micro_software/zim-gateway/:/zim-gateway/ zim-gateway:1.0
## -i 是让容器的标准输入保持打开状态
## -t 为docker分配一个伪终端并绑定到容器的标准输入上
## -d 表示后台运行容器,可不加前台运行然后ctrl+q+p退出前台
## -p 指定映射端口
## -v 路径映射,主机路径:容器内路径
## 最后是image名称:版本号
## -Duser.timezone=GMT+8 设置日志中的时间
## 这里 zim-gateway-1.0-SNAPSHOT.jar bootstrap.yml Dockerfile 三个文件都放在同一个目录文件夹中
4.2.15、保留字指令列表
序号 | Dockerfile 指令 | 说明 |
---|---|---|
1 | FROM | 指定基础镜像,当前新镜像是基于哪个镜像的,用于后续的指令构建。 |
2 | MAINTAINER | 指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令) |
3 | LABEL | 添加镜像的元数据,使用键值对的形式。 |
4 | RUN | 在构建过程中在镜像中执行命令。(容器构建时需要运行的命令) |
5 | CMD | 指定一个容器启动时要运行的命令。(可以被覆盖)(Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换) |
6 | ENTRYPOINT | 指定一个容器启动时要运行的命令。(不可被覆盖)(ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数) |
7 | EXPOSE | 声明容器运行时监听的特定网络端口。(当前容器对外暴露出的端口) |
8 | ENV | 在容器内部设置环境变量。(用来在构建镜像过程中设置环境变量) |
9 | ADD | 将文件、目录或远程URL复制到镜像中。(将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL和解压tar压缩包) |
10 | COPY | 将文件或目录复制到镜像中。(类似ADD,拷贝文件和目录到镜像中) |
11 | VOLUME | 为容器创建挂载点或声明卷。(容器数据卷,用于数据保存和持久化工作) |
12 | WORKDIR | 设置后续指令的工作目录。(指定在创建容器后,终端默认登陆的进来工作目录) |
13 | USER | 指定后续指令的用户上下文。 |
14 | ARG | 定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。 格式:ARG <参数名>[=<默认值>] |
15 | ONBUILD | 当该镜像被用作另一个构建过程的基础时,添加触发器。(当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发) |
16 | STOPSIGNAL | 设置发送给容器以退出的系统调用信号。 |
17 | HEALTHCHECK | 定义周期性检查容器健康状态的命令。 |
18 | SHELL | 覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。 |
教程
.文章来源地址https://www.toymoban.com/news/detail-606691.html
到了这里,关于Docker系列 1 - 镜像和容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!