Docker镜像制作

制作镜像

本文介绍Docker基于容器(docker commit)和Dockerfile制作镜像。

基于容器制作

使用 **docker commit **命令完成制作;该方式不推荐,在生产环境中不适用。

Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>") #添加作者信息
  -c, --change list      Apply Dockerfile instruction to the created image #应用Dockerfile指令创建镜像
  -m, --message string   Commit message #添加镜像描述信息
  -p, --pause            Pause container during commit (default true) #创建镜像时停止容器;默认开启

演示

[root@docker ~]# docker start httpd
httpd
[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED      STATUS         PORTS     NAMES
c4a3ae50aaa3   httpd     "httpd-foreground"   3 days ago   Up 2 seconds   80/tcp    httpd
#这是我之前修改好的页面内容
[root@docker ~]# curl 172.17.0.2
Docker Web Test of 172.17.0.2

另起终端:

[root@docker ~]# docker commit -a "example@255.com" -m "Httpd V1" -p httpd httpd:v1
sha256:4e9db1d09cab22c1d0e710d448ab69c6f8cf0ab1d566dc18c645342551ad35fc
[root@docker ~]# docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
httpd        v1        4e9db1d09cab   8 seconds ago   144MB

验证是否可用

[root@docker ~]# docker stop httpd
httpd
[root@docker ~]# docker run -d -it --name web1 httpd:v1 
de1d9065bd9359db88ff8d3eab3a4508b883c6dd0e4eeace084450e5300ee025
[root@docker ~]# docker ps
CONTAINER ID   IMAGE      COMMAND              CREATED         STATUS         PORTS     NAMES
de1d9065bd93   httpd:v1   "httpd-foreground"   4 seconds ago   Up 3 seconds   80/tcp    web1
[root@docker ~]# docker inspect web1 | grep -i ipaddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
[root@docker ~]# curl 172.17.0.2
Docker Web Test of 172.17.0.2

Dockerfile及其指令

  1. Dockerfile 编写的基本结构 Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

  2. 一台主机可以有多个Dockerfile;要使用多个Dockerfile 创建镜像,可以在不同目录编写Dockerfile,然后在Dockerfile 所在的目录下构 建新的镜像。

    注意:Dockerfile 中所包含需要的内容;如COPY的文件、目录等,都需要在Dockerfile 同级目录下存在。

  3. docker build是基于dockerfile制作镜像的命令。

    1. 格式:

      docker build [OPTIONS] PATH | URL | -
      
    2. 选项:

      -t:指定要创建的目标镜像名

      -c,- cpu-shares int :CPU份额(相对权重)

      -m,- memory bytes:内存限制

      –build-arg:设置构建时变量,就是构建的时候修改ARG指令的参数

  4. dockerfile常用指令:

    1. FROM :指定基础镜像
    2. RUN : 执行命令
    3. MAINTAINER : 设置镜像制作者相关信息
    4. COPY : 将宿主机的文件在创建镜像时拷贝到容器引擎中
    5. ADD :类似于COPY但ADD 支持URL路径和tar文件
    6. WORKDIR :用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指令设定工作目录;可以是相对路径也可以是绝对路径。
    7. EXPOSE : 用于暴露容器端口供外部访问容器中的服务。
    8. ENV : 用于设置环境变量。
    9. CMD :类似于RUN,但CMD仅在容器创建完成后执行且若一个Dockerfile中存在多个CMD指令仅最后一个会被执行;使用CMD定义的命令在启动容器时,会被用户追加的指令所覆盖,而不会执行原本的CMD指令。
    10. ENTRYPOINT :类似于CMD,且不会被外部指令所覆盖。

演示-Dockerfile

FROM、RUN、MAINTAINER指令
[root@docker ~]# docker images
centos       latest    5d0da3dc9764   23 months ago    231MB

Dockerfile:

FROM centos:latest
MAINTAINER "apex@153.com"
RUN mkdir -p /data/html
COPY index.html /data/html

创建需要复制的文件

[root@docker ~]# echo "CentOS imgage Test Page" > imgfile/index.html 
[root@docker ~]# ll imgfile/
total 8
-rw-r--r--. 1 root root 93 Aug 21 00:33 Dockerfile
-rw-r--r--. 1 root root 24 Aug 21 00:35 index.html #需要复制到容器中的文件通常建议放在和Dockerfile同一目录下

测试:

[root@docker ~]# docker build -t centos:v1 ./imgfile/

image-20230820164202167

[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
centos       v1        67f0bf991434   About a minute ago   231MB
[root@docker ~]# docker image inspect centos:v1 | grep -i aut
        "Author": "\"apex@153.com\"",
[root@docker ~]# docker run -d -it --name centos1 centos:v1 /bin/bash
e4d3c514b8c942c077190e465fa31587b1b44e6cba3f08d31029249d7434ab4c
[root@docker ~]# docker ps
CONTAINER ID   IMAGE       COMMAND       CREATED         STATUS         PORTS     NAMES
e4d3c514b8c9   centos:v1   "/bin/bash"   4 seconds ago   Up 3 seconds             centos1
[root@docker ~]# docker exec -it centos1 /bin/bash
[root@e4d3c514b8c9 /]# cat /data/html/index.html 
CentOS imgage Test Page
CMD、ENTRYPOINT:

拉取镜像

[root@kvm web]# docker pull busybox

编写Dockerfile

FROM busybox:latest
MAINTAINER "APEX"
ENV web_doc=/data/html
RUN mkdir -p $web_doc && echo "WEB TEST BUSYBOX" > $web_doc/index.html
CMD /bin/httpd -f -h $web_doc

创建镜像

[root@kvm web]# docker build -t busybox:v1 ./

正常启动容器

[root@kvm web]# docker run -d --name web busybox:v1
[root@kvm web]# curl 172.17.0.2
WEB TEST BUSYBOX

追加参数启动

[root@kvm web]# docker run -d --name web busybox:v1 ls /
c0283a1b6f47969298a071b2594af264163e07d39feead39d30d4789ca7fb87e
[root@kvm web]# docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@kvm web]# curl 172.17.0.2

^C
[root@kvm web]#

我们可以看出来容器并未启动,所以也无法访问页面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值