实际工作中,我们可能需要自己去创建一个docker镜像,下面给大家介绍如何创建docker镜像

1. 创建一个最简单的镜像

准备Dockerfile文件
[root@dockhost ~]# mkdir d1  # 创建一个空的目录,避免被别的文件打扰
[root@dockhost ~]# cd d1  # 切换到该目录
[root@dockhost d1]# vi Dockerfile  # 创建一个dockerfile文件,名称必须是Dockerfile

  1. FROM alpine:latest
  2. MAINTAINER yb
  3. CMD echo 'hello, this is my first image'

命令解释
FROM alpine:latest 
# alpine可以看成是一个基础镜像,它是一个极简版的linux系统。我们自定义的镜像一般都要通过FROM关键字指定一个基础镜像
MAINTAINER yb 
# 这个指定镜像的所有者,yb是我的名字
CMD echo 'hello, this is my first image' 
# CMD是command的简写,后面跟实际执行的命令

创建镜像
[root@dockhost d1]# docker build -t hello_docker . #-t后面跟镜像的名字,.表示当前目录下的所有文件

  1. Sending build context to Docker daemon 2.048 kB
  2. Step 1/3 : FROM alpine:latest
  3. Trying to pull repository docker.io/library/alpine ...
  4. latest: Pulling from docker.io/library/alpine
  5. e7c96db7181b: Pull complete
  6. Digest: sha256:769fddc7cc2f0a1c35abb2f91432e8beecf83916c421420e6a6da9f8975464b6
  7. Status: Downloaded newer image for docker.io/alpine:latest
  8. ---> 055936d39205
  9. Step 2/3 : MAINTAINER yb
  10. ---> Running in af8fa3cb5325
  11. ---> f728cbd10fa7
  12. Removing intermediate container af8fa3cb5325
  13. Step 3/3 : CMD echo 'hello, this is my first image'
  14. ---> Running in 7ac6db88f533
  15. ---> dd6668981af6
  16. Removing intermediate container 7ac6db88f533
  17. Successfully built dd6668981af6

运行镜像
[root@dockhost d1]# docker run hello_docker 
hello, this is my first image

查看镜像
[root@dockhost d1]# docker images

  1. REPOSITORY TAG IMAGE ID CREATED SIZE
  2. hello_docker latest dd6668981af6 About a minute ago 5.53 MB
  3. docker.io/alpine latest 055936d39205 2 weeks ago 5.53 MB

从docker build的输出和docker images的显示都可以看到在创建镜像hello_docker的同时还下载了基础镜像alpine

2. 将基础镜像换成centos,其余不变。来看有啥变化

[root@dockhost d1]# cd ..  # 切到上一层目录
[root@dockhost ~]# mkdir d2  # 创建一个空的目录,避免被别的文件打扰
[root@dockhost ~]# cd d2  # 切换到该目录
[root@dockhost d2]# vi Dockerfile  # 创建一个dockerfile文件,名称必须是Dockerfile

  1. FROM centos
  2. MAINTAINER yb
  3. CMD echo 'hello, this is my first image'

[root@dockhost d2]# docker build -t hello_docker2 .  # 创建镜像,名字改成hello_docker2
省略输出...

[root@dockhost d2]# docker run hello_docker2  # 运行镜像
hello, this is my first image

[root@dockhost d2]# docker images  # 查看镜像

  1. REPOSITORY TAG IMAGE ID CREATED SIZE
  2. hello_docker2 latest 1787753b5550 2 minutes ago 202 MB
  3. hello_docker latest dd6668981af6 10 minutes ago 5.53 MB
  4. docker.io/alpine latest 055936d39205 2 weeks ago 5.53 MB
  5. docker.io/centos latest 9f38484d220f 2 months ago 202 MB

可以看到因为基础镜像的不同,hello_docker与hello_docker2文件尺寸差别好大。具体该选择什么基础镜像呢。
如果是一个单功能的容器,而且自身对alpine比较熟悉,那就用alpine作为基础镜像,否则就使用centos或者ubuntu,根据自己所运行的操作系统来。

3. 接下来创建一个复杂的docker镜像

使用nginx来做测试,从官网下载nginx源码包 http://nginx.org/en/download.html
[root@dockhost ~]# mdkir mydocker
[root@dockhost ~]# cd mydocker
上传安装包到mydocker目录下

准备Dockerfile
[root@docker mydocker]# vi Dockerfile

  1. # base image
  2. FROM centos
  3.  
  4. # MAINTAINER
  5. MAINTAINER yb
  6.  
  7. # put nginx-1.16.0.tar.gz into /usr/local/src and unpack nginx
  8. ADD nginx-1.16.0.tar.gz /usr/local/src
  9.  
  10. # running required command
  11. RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
  12. RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
  13. RUN useradd -M -s /sbin/nologin nginx
  14.  
  15. # mount a dir to container
  16. VOLUME ["/data"]
  17.  
  18. # change dir to /usr/local/src/nginx-1.16.0
  19. WORKDIR /usr/local/src/nginx-1.16.0
  20.  
  21. # execute command to compile nginx
  22. RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
  23.  
  24. # add path
  25. ENV PATH /usr/local/nginx/sbin:$PATH
  26.  
  27. # expose port
  28. EXPOSE 80
  29.  
  30. # add cmd
  31. ENTRYPOINT ["nginx"]
  32.  
  33. CMD ["-g","daemon off;"]

创建镜像
docker build -t centos_nginx:v1 .

运行镜像
docker run -d -p80:80 centos_nginx:v1

打开网页:输入http://10.40.16.61:80/ #其中10.40.16.61我docker运行的主机

命令解释
FROM 选择一个基础镜像
MAINTAINER 镜像作者
ADD 添加文件或目录,类似的命令还有COPY,不过ADD功能更加强大,该命令还能拷贝远程的文件到容器中,比如ftp上的文件,而且能自动解压
RUN 执行命令
VOLUME 给docker添加一个卷组,卷组的含义类似于给操作系统挂载一个磁盘
WORKDIR 切换Docker的目录
ENV 设置环境变量
EXPOSE 暴露端口
ENTRYPOINT 容器入口
CMD 参数,上面例子中ENTRYPOINT+CMD = nginx -g "daemon off;",运行该镜像最后就会执行此条命令

文章参考:https://www.cnblogs.com/jsonhc/p/7767669.html
建议大家跟着上面的文章走一遍,可以理解很多命令到底是做什么的。我这里贴出一些我看该篇文章的个人疑惑点,以及好的解答。
1.daemon on | off是干什么的?
参考:https://www.cnblogs.com/weifeng1463/p/10277178.html
意思文章讲的很清楚了,如果想让nginx运行,你必须设置成daemon off

2.如何进入到container中?
docker exec -it e09423b0c114 /bin/bash  # e09423b0c114是容器id
退出就直接使用exit

3.如何查找docker的VOLUME对应主机的目录?
docker inspect e09423b0c114  # e09423b0c114是容器id
返回是一个json字符串,找"Mounts"键
"Mounts": [
     {
         "Type": "volume",
         "Name": "4d0ff619cee2a21a75af2bea3fe7aa30d4f9fc0bf4612c48c8dced96234cec3e",
         "Source": "/var/lib/docker/volumes/4d0ff619cee2a21a75af2bea3fe7aa30d4f9fc0bf4612c48c8dced96234cec3e/_data",
         "Destination": "/data",
         "Driver": "local",
         "Mode": "",
         "RW": true,
         "Propagation": ""
     }

4.在文章的v7中,应该是先建一个image再运行。但是我运行了之后发现打不开nginx,目前尚不清楚dockerfile里面有onbuild,nginx就不运行,这个先标注,等将来弄明白了再改这段。大家可以忽略这段。

4. Dockerfile语法总结

FROM 指定基础镜像
RUN 执行命令
COPY 添加文件
ADD 添加文件
EXPOSE 暴露端口
WORKDIR 指定路径
MAINTAINER 维护者
ENV 设定环境变量
ENTRYPOINT 容器入口
CMD 执行参数
USER 指定用户
VOLUMN 添加卷组

Docker - 创建镜像(二)的更多相关文章

  1. Docker 创建镜像、修改、上传镜像

    Docker 创建镜像.修改.上传镜像 –创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 一.创建镜像 创建镜像有很多方法,用户可以从 Do ...

  2. Docker创建镜像以及私有仓库

    Docker的安装及镜像.容器的基本操作详见博客https://blog.51cto.com/11134648/2160257下面介绍Docker创建镜像和创建私有仓库的方法,详细如下: 创建镜像 创 ...

  3. Docker创建镜像文件并在容器中运行

    1.如何创建镜像文件 首先找到Docker ToolBox安装的路径,在路径下直接新建Dockerfile文件 在Dockerfile文件里写入的内容为: FROM docker/whalesay:l ...

  4. docker 创建镜像,并推送到私有仓库

    创建镜像 创建  Dockerfile 镜像命名规则:registyr_url / namespace / depart / name : version 用这个规则创建的镜像,可直接推送到私有仓库 ...

  5. dockerfile创建镜像(二)

    ENTRYPOINT 两种格式: ENTRYPOINT [“executable”, “param1”, “param2”] ENTRYPOINT command param1 param2 (she ...

  6. Docker创建镜像 并推拉Harbor

    创建镜像 一.根据dockerfile创建镜像 文件详解 1.mkdir dockerfile/lib/centos7base/ 创建目录 2.创建Dockerfile vim Dockerfile ...

  7. docker 创建镜像

    docker:/root# docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official bui ...

  8. docker创建镜像

    手动创建: docker run -d -p mynginx:v2 nginx rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest- ...

  9. docker创建镜像及push镜像出错问题

    docker build  出错 Got permission denied while trying to connect to the Docker daemon socket at unix:/ ...

随机推荐

  1. JavaScript-----12.对象

    1. 对象 万物皆对象,但是对象必须是一个具体的事物.例如:"明星"不是对象,"周星驰"是对象:"苹果"不是对象"这个苹果&quo ...

  2. C#冒泡算法

    冒泡算法:先看代码吧,我不喜欢先说一大堆,看不懂了再说 class Program { static void Main(string[] args) { , , , , , }; ; i <a ...

  3. 当面试官要你介绍一下MQ时,该怎么回答?

    一.为什么要使用MQ消息中间件? 一个用消息队列的人,不知道为啥用,有点尴尬.没有复习这点,很容易被问蒙,然后就开始胡扯了. 回答:这个问题,咱只答三个最主要的应用场景,不可否认还有其他的,但是只答三 ...

  4. ASP.NET中使用附文本框插件

    使用附文本选项框插件步骤 Newtonsoft.Json 改变js的配置文件的url 最后一定要关闭页面中的 ValidateRequest=false

  5. ASP.NET Core 3.0 gRPC 配置使用HTTP

    前言 gRPC是基于http/2,是同时支持https和http协议的,我们在gRPC实际使用中,在内网通讯场景下,更多的是走http协议,达到更高的效率,下面介绍如何在 .NET Core 3.0 ...

  6. PlayJava Day014

    今日所学: /* 2019.08.19开始学习,此为补档. */ 1.Random生成的随机数是伪随机数,因为只要两个Random对象的种子相同,而且方法的调用顺序也相同,则产生的随机数相同. Ran ...

  7. 从0系统学Android-2.4 Activity 的生命周期

    本系列文章,参考<第一行代码>,作为个人笔记 更多内容:更多精品文章分类 本系列持续更新中.... 2.4 Activity 的生命周期 掌握 Activity 的生命周期对于开发者来说是 ...

  8. QJsonObject与QString转化封装

    经常使用QT的同学可能会发现有时候需要json字符串和json对象之间的转换,今天他来了,直接上代码: QString InfoBase::JsonToString(const QJsonObject ...

  9. 安装SQL数据库时遇到问题。需要更新以前的visual studio 2010实例

    安装SQL数据库时遇到问题.需要更新以前的visual studio 2010实例此计算机安装了需要service pack 1更新的visual 2010,必须安装此更新才能成功安装选择的SQL s ...

  10. SQL Server通过函数把逗号分隔的字符串拆分成数据列表的脚本-干货

    CREATE FUNCTION [dbo].[Split](@separator VARCHAR(64)=',',@string NVARCHAR(MAX))  RETURNS @ResultTab ...