什么是Dockerfile以及如何创建Docker镜像?

在开发Docker项目时,大部分时候,现有的Docker镜像不会满足您的需求。

这就是Dockerfile的用武之地;它将帮助您创建自定义的Docker镜像。因此,了解Dockerfile是很重要的。

什么是Dockerfile?

它是一个简单的文本文件,包含一组命令或指令。这些命令/指令依次执行,对基础镜像执行操作以创建新的Docker镜像。

注释命令+参数是Dockerfile语法中两种主要的行块。

注释语法

#用于注释的行块

command argument argument1 …..

命令+参数示例

#用于注释的行块

command argument argument1 …..

下面是您的工作流程。

  • 创建一个Dockerfile,并在其中指定创建Docker镜像的指令
  • 运行docker build命令,它将构建一个Docker镜像
  • 现在Docker镜像已准备就绪,使用docker run命令创建容器

基本命令

FROM –定义要使用并启动构建过程的基础镜像。

RUN –接收命令及其参数,并从镜像中运行它。

CMD –与RUN命令类似,但只在容器实例化之后执行。

ENTRYPOINT –在创建容器时,它指定镜像中的默认应用程序。

ADD –将文件从源复制到目标(在容器内部)。

ENV –设置环境变量。

如何使用Dockerfile创建Docker镜像?

首先,让我们创建一个Dockerfile。

姚伟斌@姚伟斌:~$ gedit Dockerfile

将下面的命令/指令放入其中并保存。

#将基础镜像设置为Ubuntu
FROM ubuntu

#更新存储库源列表并安装gnupg2
RUN apt-get update && apt-get install -y gnupg2

#添加软件包验证密钥
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

#将MongoDB添加到存储库源列表
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' > tee /etc/apt/sources.list.d/mongodb.list

#更新存储库源列表
RUN apt-get update

#安装MongoDB软件包(.deb)
RUN apt-get install -y mongodb

#创建默认数据目录
RUN mkdir -p /data/db

#公开默认端口
EXPOSE 27017

#默认端口来执行入口点(MongoDB)
CMD ["--port 27017"]

#设置默认容器命令
ENTRYPOINT usr/bin/mongodb

在这个Dockerfile中,将Ubuntu设置为基础镜像。然后,添加必要的命令和参数以安装MongoDB。将端口27017公开给MongoDB,并将默认容器命令设置为usr/bin/mongodb

接下来,我将运行它以创建一个Docker镜像。

运行Dockerfile

以下命令将在成功执行后创建一个名为姚伟斌_mongodb的Docker镜像。

姚伟斌@姚伟斌:~$ docker build -t 姚伟斌_mongodb .

发送构建上下文到Docker守护程序667.2MB

步骤1/9:来自ubuntu

最新版本:正在从library/ubuntu获取

7413c47ba209:Pull complete

0fe7e7cbb2e8:Pull complete

1d425c982345:Pull complete

344da5c95cec:Pull complete

摘要:sha256:c303f19cfe9ee92badbbbd7567bc1ca47789f79303ddcef56f77687d4744cd7a

状态:已下载较新的镜像以供ubuntu:latest使用

—> 3556258649b2

步骤2/10:RUN apt-get update && apt-get install -y gnupg2

—> 正在运行de3706328761

获取:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]

获取:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]

已获取16.9 MB,用时38秒(445 kB/s)

正在读取软件包列表…

正在读取软件包列表…

正在构建依赖树…

正在读取状态信息…

需要下载5187 kB的归档文件。

此操作后将使用15.8 MB额外的磁盘空间。

获取:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 readline-common all 7.0-3 [52.9 kB]

获取:2 http://archive.ubuntu.com/ubuntu bionic/main amd64 libreadline7 amd64 7.0-3 [124 kB]

获取:3 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libsqlite3-0 amd64 3.22.0-1ubuntu0.1 [497 kB]

获取:4 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libssl1.1 amd64 1.1.1-1ubuntu2.1~18.04.4 [1300 kB]

debconf:延迟软件包配置,因为未安装apt-utils

已获取5187 kB,用时12秒(416 kB/s)

正在选择未选择的软件包readline-common。

(正在读取数据库…当前已安装4040个文件和目录。)

正在准备解包…/00-readline-common_7.0-3_all.deb …

正在解包readline-common(7.0-3)…

正在选择未选择的软件包libreadline7:amd64。

正在准备解包…/01-libreadline7_7.0-3_amd64.deb …

正在选择未选择的软件包dirmngr。

Setting up libnpth0:amd64 (1.5-3) …

Setting up libksba8:amd64 (1.3.5-2) …

Setting up gnupg-l10n (2.2.4-1ubuntu1.2) …

处理触发器期间出现问题:libc-bin(2.27-3ubuntu1)…

正在删除中间容器de3706328761

—> a32533894ed1

步骤3/10:RUN apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv 7F0CEB10

—> 正在运行69c4dba38983

警告:不应解析apt-key输出(stdout不是终端)

正在执行:/tmp/apt-key-gpghome.MuT5BDWwKZ/gpg.1.sh –keyserver hkp://keyserver.ubuntu.com:80 –recv 7F0CEB10

gpg: 密钥5F8F93707F0CEB10:已导入公钥“Totally Legit Signing Key ”

gpg: 密钥9ECBEC467F0CEB10:由于缺少密钥,未检查1个签名

gpg: 密钥9ECBEC467F0CEB10:已导入公钥“Richard Kreuter ”

gpg: 总共处理数量:2

gpg: 导入的数据:2

正在删除中间容器69c4dba38983

—> cffbe06c1b50

步骤4/10:RUN echo ‘deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' > tee /etc/apt/sources.list.d/mongodb.list

—> 正在运行40630fd7b0a9

正在删除中间容器40630fd7b0a9

—> a1bd9d8d7e51

步骤5/10:RUN apt-get update

—> 正在运行750717d9c0ea

获取:1 http://archive.ubuntu.com/ubuntu bionic InRelease

获取:2 http://archive.ubuntu.com/ubuntu bionic-updates InRelease

获取:3 http://security.ubuntu.com/ubuntu bionic-security InRelease

获取:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease

已获取软件包列表…

正在删除中间容器750717d9c0ea

—> 397d6501db58

步骤6/10:RUN apt-get install -y mongodb

—> 正在运行88609c005e73

读取软件包列表…

正在构建依赖树…

正在读取状态信息…

将会安装下列新包:

libboost-filesystem1.65.1 libboost-iostreams1.65.1

libboost-program-options1.65.1 libboost-system1.65.1 libgoogle-perftools4

libpcap0.8 libpcrecpp0v5 libsnappy1v5 libstemmer0d libtcmalloc-minimal4

libunwind8 libyaml-cpp0.5v5 mongo-tools mongodb mongodb-clients

mongodb-server mongodb-server-core

升级:0 个,新安装:17 个,要删除:0 个,未安装:0 个。

需要下载53.7 MB/53.7 MB的归档文件。

此操作将使用218 MB额外的磁盘空间。

获取:1 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 mongodb-clients amd64 1:3.6.3-0ubuntu1.1 [20.2 MB]

获取:2 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 mongodb-server-core amd64 1:3.6.3-0ubuntu1.1 [20.3 MB]

获取:3 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 mongodb-server all 1:3.6.3-0ubuntu1.1 [12.6 kB]

获取:4 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 mongodb amd64 1:3.6.3-0ubuntu1.1 [9968 B]

已获取53.7 MB,用时10秒(5485 kB/s)

正在选择未选择的软件包libpcap0.8:amd64。

(正在读取数据库…当前已安装4390个文件和目录。)

正在选择未选择的软件包mongodb-clients。

Preparing to unpack …/13-mongodb-clients_1%3a3.6.3-0ubuntu1.1_amd64.deb …

正在解包mongodb-clients(1:3.6.3-0ubuntu1.1)…

正在选择未选择的软件包mongodb-server-core。

Preparing to unpack …/14-mongodb-server-core_1%3a3.6.3-0ubuntu1.1_amd64.deb …

正在解包mongodb-server-core(1:3.6.3-0ubuntu1.1)…

正在选择未选择的软件包mongodb-server。

Preparing to unpack …/15-mongodb-server_1%3a3.6.3-0ubuntu1.1_all.deb …

正在解包mongodb-server(1:3.6.3-0ubuntu1.1)…

正在选择未选择的软件包mongodb。

Preparing to unpack …/16-mongodb_1%3a3.6.3-0ubuntu1.1_amd64.deb …

正在解包mongodb(1:3.6.3-0ubuntu1.1)…

正在设置mongodb-server-core(1:3.6.3-0ubuntu1.1)…

正在设置mongo-tools(3.6.3-0ubuntu1)…

正在设置mongodb-clients(1:3

让我们检查一下Docker镜像是否以名称姚伟斌_mongodb创建。

姚伟斌@姚伟斌:~$ docker images

REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE

姚伟斌_mongodb          latest              095d17727ca0        3 minutes ago       325MB

ubuntu                     latest              3556258649b2        4 days ago          64.2MB

mean_express               latest              35dcb3df9806        6 days ago          923MB

mean_angular               latest              9f8d61db600c        6 days ago          1.29GB

在容器中运行Docker镜像姚伟斌_mongodb

姚伟斌@姚伟斌:〜$ docker run –name mongo_container -i -t 姚伟斌_mongodb

2019-07-27T19:38:23.734+0000 I CONTROL [initandlisten] MongoDB starting :pid = 6 port = 27017 dbpath = / data / db 64位主机=b0095c1e5536

2019-07-27T19:38:23.735+0000 I CONTROL [initandlisten] db version v3.6.3

2019-07-27T19:38:23.735+0000 I CONTROL [initandlisten] git version: 9586e557d54ef70f9ca4b43c26892cd55257e1a5

2019-07-27T19:38:23.736+0000 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.1.1 11 Sep 2018

2019-07-27T19:38:23.739+0000 I CONTROL [initandlisten] allocator: tcmalloc

2019-07-27T19:38:23.739+0000 I CONTROL [initandlisten] modules: none

2019-07-27T19:38:23.739+0000 I CONTROL [initandlisten] build environment:

2019-07-27T19:38:23.739+0000 I CONTROL [initandlisten] distarch: x86_64

2019-07-27T19:38:23.739+0000 I CONTROL [initandlisten] target_arch: x86_64

2019-07-27T19:38:23.739+0000 I CONTROL [initandlisten] options: {}

2019-07-27T19:38:23.745+0000 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=2038M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),

2019-07-27T19:38:24.733+0000 I CONTROL [initandlisten]

2019-07-27T19:38:24.734+0000 I CONTROL [initandlisten] ** 警告:未启用数据库的访问控制。

2019-07-27T19:38:24.735+0000 I CONTROL [initandlisten] ** 读取和写入数据和配置的访问是不受限制的。

2019-07-27T19:38:24.736+0000 I CONTROL [initandlisten] ** 警告:您正在以root用户身份运行此进程,这是不推荐的。

2019-07-27T19:38:24.736+0000 I CONTROL [initandlisten]

2019-07-27T19:38:24.736+0000 I CONTROL [initandlisten] ** 警告:此服务器绑定到localhost。

2019-07-27T19:38:24.737+0000 I CONTROL [initandlisten] ** 远程系统将无法连接到此服务器。

2019-07-27T19:38:24.737+0000 I CONTROL [initandlisten] ** 使用–bind_ip

启动服务器以指定服务器应从中提供响应的IP地址,或者使用–bind_ip_all绑定到所有接口。如果要启用此行为,请使用–bind_ip 127.0.0.1启动服务器以禁用此警告。

2019-07-27T19:38:24.738+0000 I CONTROL [initandlisten]

2019-07-27T19:38:24.739+0000 I STORAGE [initandlisten] createCollection:admin.system.version使用提供的UUID:4b8b509d-633a-46c1-a302-cb8c82b0d5d3

2019-07-27T19:38:24.788+0000 I COMMAND [initandlisten] 设置featureCompatibilityVersion为3.6

2019-07-27T19:38:24.818+0000 I STORAGE [initandlisten] createCollection:local.startup_log使用生成的UUID:6c1c0366-4b1b-4b92-9fcd-d18acc126072

2019-07-27T19:38:24.862+0000 I FTDC [initandlisten] 初始化全时间诊断数据捕获,目录为:/ data / db / diagnostic.data

2019-07-27T19:38:24.866+0000 I NETWORK [initandlisten] 在端口27017上等待连接

打开一个新的终端并检查mongo_container是否正在运行。

姚伟斌@姚伟斌:~$ docker ps

CONTAINER ID        IMAGE               COMMAND                    CREATED             STATUS              PORTS              NAMES

b0095c1e5536        姚伟斌_mongodb   "/bin/sh -c usr/bin/…"    35 seconds ago      Up 33 seconds       27017/tcp          mongo_container

如您所见,从姚伟斌_mongodb镜像创建的容器正在运行。

希望这给您关于dockerfile及其好处的一个想法。您还可以查看此文档Dockerfile best practices以了解更多信息。

类似文章