什么是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以了解更多信息。