Docker系列 1 - 镜像和容器

这篇具有很好参考价值的文章主要介绍了Docker系列 1 - 镜像和容器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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系列 1 - 镜像和容器,docker,容器,运维

需要正确的理解仓储/镜像/容器这几个概念 :

       Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖,打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

  • image 文件生成的容器实例,本身也是一个文件,称为镜像文件。

  • 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器

  • 至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。

 

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镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
Docker系列 1 - 镜像和容器,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、容器命令

有镜像才能创建容器,这是根本前提。

Docker系列 1 - 镜像和容器,docker,容器,运维

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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker 保存镜像、容器与导入镜像容器

    可以通过以下步骤将Docker镜像导出到另一台计算机上: 在本地计算机上使用以下命令将Docker镜像保存为tar文件: 其中,image-name是要导出的Docker镜像的名称。 将保存的tar文件传输到另一台计算机上,可以使用scp命令或其他文件传输工具。 在目标计算机上使用以下命令将tar文

    2024年02月13日
    浏览(46)
  • docker导出镜像、容器打镜像

    有两种方法,一种是通过容器,一种是通过镜像 1 首先使用 docker ps -a 查看本机上的所有容器 2 导出镜像 使用 docker export 命令根据容器 id 将镜像导成一个文件 上面命令执行之后,我们便可以通过 ls 命令在当前目录下发现 image.tar 3 导入镜像 使用 docker import 命令将这个镜像导

    2024年02月03日
    浏览(56)
  • Docker容器------镜像,容器基础命令

    目录  一,docker镜像  1,查看docker版本  2,获取镜像 2.1查看下载到本地的所有镜像   2.2 获取镜像信息 2.3 添加镜像标签(上传镜像到仓库)   2.4 镜像导出  2.5 镜像导入  2.6 ,删除镜像  2.7 上传镜像 ​编辑 二,docker 容器操作 1,查看容器 2,容器创建----docker create  

    2024年02月05日
    浏览(53)
  • [Docker]二.Docker 镜像,仓库,容器介绍以及详解

    通俗来讲:镜像相当于VM虚拟机中的ios文件,容器相当于虚拟机系统,仓库相当于系统中的进程或者执行文件,容器是通过镜像创建的 Docker 镜像就是一个 Linux 的文件系统( Root FileSystem ),这个文件系统里面包含可以运行在 Linux 内核的程序以及相应的数据,这里要强调一下镜像的两

    2024年02月03日
    浏览(54)
  • Docker容器:docker镜像的创建及dockerfile

    创建镜像有三种方法:基于现有镜像创建、基于本地模板创建及基于dockerfile创建 1.1 启动镜像 1.2 生成新镜像 2.1 OPENVZ 下载模板 2.2 导入容器生成镜像 3.1 dockerfile结构及分层 (1)dockerfile结构大致分为4个部分 基础镜像信息 维护者信息 镜像操作指令 容器启动时执行指令 Dockerfil

    2024年02月11日
    浏览(57)
  • docker:容器打包成镜像

    简介 :docker的优势在于,安装部署完成后,将已经运行成功的容器重新打包出新的镜像,即可实现一次构建,处处使用。这需要依赖于docker commit命令 和 docker load来配合完成。 历史攻略: Docker:简介和常用命令分类 sanic:通过dockerfile部署 操作步骤 :以sanic:通过dockerfile部

    2024年02月11日
    浏览(47)
  • Docker删除镜像和容器

    首先需要停止所有的容器(只停止单个时把后面的变量改为image id即可) docker stop $(docker ps -a -q) 删除所有的容器(只删除单个时把后面的变量改为image id即可) docker rm $(docker ps -a -q) 查看host中的镜像 docker images 删除指定id的镜像 docker rmi 想要删除untagged images,也就是那些id为

    2024年02月16日
    浏览(100)
  • docker根据镜像生成容器

    要根据 Docker 镜像生成容器,可以使用 docker run 命令。 在上述命令中,你需要将 镜像名称 替换为你想要生成容器的 Docker 镜像的名称。这将使用指定的镜像创建一个新的容器,并启动该容器。 然而,通常情况下,你可能还需要为容器指定其他选项,如端口映射、环境变量、

    2024年02月07日
    浏览(50)
  • docker删除镜像及容器

    清理服务器相关无用docker镜像及容器。 要删除 Docker 中的镜像,可以使用 docker rmi 命令。请注意,删除镜像前请确保不再需要它,并且已经停止了使用该镜像的所有容器。否则,需要首先删除使用该镜像的容器。 以下是删除镜像的步骤: 确定要删除的镜像的名称或 ID。可以

    2024年02月07日
    浏览(49)
  • docker 打包镜像或容器

    因为某台服务器需要部署Tomcat,但是该服务武器不能连接外网,所以需要先pull拉一下镜像包,如果已经有了现有的镜像就不需要拉取了,直接从第二部开始就行。 具体操作步骤如下: 使用到的命令: docker commit :从容器创建一个新的镜像 OPTIONS说明: -a :提交的镜像作者; -c

    2024年02月02日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包