- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Docker使用Dockerfile来创建镜像由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文学习Dcokerfile的基本命令,并且创建一个支持ssh服务的镜像. 。
1.Dockerfile 。
1.1基本案例 。
dockerfile可以说是docker的描述符,该文件定义了docker镜像的所能拥有哪些东西.基本格式如下
1
2
3
4
5
6
7
8
9
10
11
12
|
第一行指定该镜像基于的基础镜像(必须)
FROM java:8
维护者信息
MAINTAINER quding niudear@foxmail.com
镜像操作指令
RUN echo $JAVA_HOME
启动时操作的命令
CMD ./usr/sbin/nginx
|
该文件说明从Java8这个基础镜像创建一个新的镜像,输出Java路径,启动成功则启动nginx服务,这也是一个Dockerfile需要包含的操作步骤. 。
1.2指令详解 。
1.FROM:格式为 FROM <image>或FROM<image>:<tag>第一条指令必须是FROM指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次).
2.MAINTAINER:格式为MAINTAIER,指定维护者信息.
3.RUN:格式为RUN <command>或者RUN [“executable”,“param1”,“param2”]。前者将在shell终端中运行的命令,即/bin/sh–c;后者则使用exec执行。指定使用其他终端可以通过第二种方式实现,例如RUN[“/bin/bash”,“-c”,“echohello”]。每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\来换行。这实际上就是在容器构建时需要执行哪些指令,例如容器构建时需要下拉代码,但是默认启动的容器中是没有Git指令的,就需要下载,可以执行:RUN apt-get install -y git,然后RUN git clonexxxx 。
4.CMD:指定容器启动后执行的命令 。
命令格式为
sh格式: CMD <命令> 。
exec格式:CMD [“可执行文件”,”参数1”,”参数2”] 。
一般都是早就写好的脚本或者启动一个服务,例如:CMD[“/run.sh”]。注意:如果Dockerfile中指定了多条命令,只有最后一条会被执行。如果用户启动时候加了运行的命令,则会覆盖掉CMD指定的指令.
这里有一个问题,很多时候我们想要docker一直在后台运行,但是往往docker启动后就停止.原因就在于此. 。
比如执行CMD serice MySQL start,那么翻译过来的话是CMD ["sh","-c","serice mysql start"],那么对于docker来说CMD主进程为sh,那么sh执行完该命令就结束,所以导致docker停止.所以要改成直接启动文件形式CMD ["mysql","-g",""daemon off;],指定前台运行. 。
5.EXPOSE:告诉Docker服务端容器需要暴露的端口号,供互联系统使用。在启动容器时需要通过-P(注意是大写),Docker主机会自动分配一个端口转发到指定的端口;使用-p,则可以具体指定哪个本地端口映射过来。 例如:我在elasticsearch镜像的Dockerfile中指定了暴露出9200和9300端口,我可以在Dockerfile中写:EXPOSE 9200 9300 。
6.ENV:创建的时候给容器中加上个需要的环境变量。指定一个值,为后续的RUN指令服务 。
7.COPY:复制本地的文件或目录到容器中。目标路径不存在时,会自动创建.
8.ENTRYPOINT:配置容器启动后执行的命令,并且不可被docker run 提供的参数覆盖。 每个Dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个生效 。
9.VOLUME:创建一个挂在点,可以从本机或其他容器挂载的挂载点。意思就是从容器中暴露出一部分,和外界共享这块东西,一般放数据库的数据或者是代码。在容器启动运行的时候,如果需要将volume暴露的东西和本地的一个文件夹进行映射,想要通过本地文件直接访问容器中暴露的部分,可以在运行的时候进行映射:
10.USER:指定运行容器时的用户名或者UID,后续的RUN也会使用指定的用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户。 要临时获取管理员权限的时候要使用gosu,不推荐使用sudo。如果不指定,容器默认是root运行.
11.WORKDIR:定义工作目录,如果容器中没有此目录,会自动创建 。
创建指令docker build 路径,该命令会读取路径下的Dockerfile文件和其他文件,然后发送给服务端,由服务端创建镜像. 。
2.创建SSH服务镜像 。
2.1准备Java8环境 。
后续教程需要利用到Java8环境,因此先下载一个官方的Java8镜像作为基础镜像.直接执行如下命令.可以利用之前的教程,启动容器查看下java路径. 。
1
|
docker pull java:8
|
2.2编写Dockerfile 。
ssh服务主要是openssh-server来提供,因此需要在容器中安装该服务. 。
Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#显示该镜像是基于java8镜像
FROM java:8
#维护人信息
MAINTAINER quding niudear@foxmail.com
#更新源
RUN apt-get update
#安装软件
RUN apt-get
install
-y openssh-server
RUN
mkdir
-p
/var/run/sshd
RUN
mkdir
-p
/root/
.
ssh
#取消pam限制
RUN
sed
-ri
's/session required pam_loginuid.so/#session required pam_loginuid.so/g'
/etc/pam
.d
/sshd
#复制配置文件到相应位置
COPY authorized_keys
/root/
.
ssh
/authorized_keys
COPY run.sh
/run
.sh
#赋予脚本权限
RUN
chmod
755
/run
.sh
#开放端口
EXPOSE 22
#设置启动命令
CMD [
"/run.sh"
]
|
run.sh 。
1
2
|
#!/bin/bash
/usr/sbin/sshd
-D
|
拷贝本机的id_ras 。
1
2
|
cat
~/.
ssh
/id_rsa
.pub >authorized_keys
//
用来免密的
|
执行构建 。
1
|
docker build -t sshd:java .
|
构建成功后使用docker images即可查看,然后像上篇一样启动容器,暴露出端口,再使用ssh连接,和一般Linux系统就没什么差别了. 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://blog.csdn.net/u012706811/article/details/68950903?locationNum=5&fps=1 。
最后此篇关于Docker使用Dockerfile来创建镜像的文章就讲到这里了,如果你想了解更多关于Docker使用Dockerfile来创建镜像的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要将 OCI 镜像 list 转换为 Docker v2.2 镜像格式,反之亦然。但我找不到两者之间的任何区别,是否有任何实际区别或它们相同? 最佳答案 Docker 镜像 list V 2,模式
LNMP 是代表 Linux 系统下的 Nginx、Mariadb、PHP 相结合而构建成的动态网站服务器架构。下面使用docker制作分布式lnmp 镜像。 1、docker 分布式 lnmp
你好,我创建了一个基础镜像;但是,每当我运行 docker build . 时,我都看不到成功构建 我的 docker 文件 FROM centos:7 ARG user=john ARG home=
我想要我的 iPhone 应用程序中有一个功能,可以将图像转换为类似镜像的方式。 就像如果有一个左手举起的人的图像,那么转换后的图像必须有右手举起的同一个人。 任何代码或链接将不胜感激 预先感谢您的帮
我们希望将一个Elasticsearch集群放置在kubernetes集群的顶部(当前有2个节点,但是我们计划增加它)。 是否可以通过使集群中的每个节点包含相同数据的方式配置elasticsearch
我试图了解 docker 如何在文件系统上存储图像和图层。构建图像时,图层出现在 /var/lib/docker/image/overlay2/layerdb 中,图像出现在 /var/lib/doc
所以我最近开始使用 docker,因为我认为让我的网站 dockerised 会很好。我有一个 super 简单的 docker-compose.yml 文件,其中仅包含 wordpress:late
我有一个 docker 镜像,叫它 dockerimage/test。每次我更新它时,我都会增加一个标签,所以 dockerimage/test:1、dockerimage/test:2 等等。 当我
我开始使用 Docker,我发现我可以将主图像存储库放在不同的磁盘上(符号链接(symbolic link)/var/lib/docker 到其他位置)。 但是,现在我想看看是否有办法将它拆分到多个磁
显然应用程序打包和部署似乎有两种做法 创建 Docker 镜像并部署它 从头开始构建和部署应用程序。 我对如何使用选项 1) 感到困惑。前提是你获取一个 docker 镜像并在任何平台上重复使用它。但
我有一个 UIView具有透明背景和一些按钮。我想捕获 View 的绘图,将其缩小,然后在屏幕上的其他位置重新绘制(镜像)它。 (在另一个 View 之上。)按钮可以更改,因此它不是静态的。 最好的方
我正在为一个项目编写测试,我想测试和验证一个 docker 镜像构建。但我不想推送图像。 我希望图像构建在 CI(如 taskcluster)上并运行测试。 最佳答案 您需要使用 taskcluste
我想复制每个 html 页面中的代码,同时添加一些更改: 例子: Any text (even if includes :., 输出: Any text (even if includes :.,
我使用三星 ARM Cortex A9 Exynos4412 板。我在板上启动“linux + Qt”img。但是板上没有包管理器,也没有 make 、 gcc 命令。在/bin 文件中有文件 Bus
是否有可能以某种方式设置一个 git 存储库,该存储库像通常的 --mirror 一样用于 pull 入它,但在将从推送到另一个存储库时没有强制? 最佳答案 您可以像这样添加 --no-force 来
背景 最近在巡检过程中,发现harbor存储空间使用率已经达到了80%。于是,去看了一下各项目下的镜像标签数。发现有个别项目下的镜像标签数竟然有好几百个。细问之下得知,该项目目前处于调试阶段
以下均在centos 7进行的操作 docker安装 ? 1
我知道如何删除 N 天前创建的旧 Docker 镜像。 See here 但我真正想做的是删除过去 N 天未使用的旧 Docker 镜像。 目标是保留经常使用的图像,即使在我进行清理时没有容器实际使用
我有一个自定义的 docker 镜像,已经构建好了。没有可用的 Dockerfile。在容器内部,可以使用自定义用户,而不是 root,比如 test。此用户已附加到组 test。这是容器的默认用户。
我有一个开发数据库,我想将其提交到 docker 镜像中,然后推送到私有(private)存储库并用于本地开发和 CI 构建。 数据库保存为SQL备份,我可以通过将备份文件映射到官方镜像的/doc
我是一名优秀的程序员,十分优秀!