首页 » docker » 正文

Dockerfile的使用,创建Apache镜像

前面《CentOS7下docker拉取并使用CentOS》中我们pull了一个纯净镜像,如果要部署网站、安装一些软件的话, 有啥办法?

一.Dockerfile

1、硬来

利用attach进入,各种yum,各种安装 (你会发现好多权限问题)

2、利用Dockerfile

我们来看一下如何利用Dockerfile创建一个镜像


Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。

参考链接:https://docs.docker.com/engine/reference/builder/

二.创建Apache镜像

1.创建Dockerfile

接下来我们创建一个空文件夹,CD进入。然后创建一个文件叫做Dockerfile(注意大小写),插入内容如下:
我们先从最简单的开始:

2.docker build命令

用于读取Dockerfile创建镜像

当然也可以指定Dockerfile

通过 可以看到出现了一个新镜像叫做centos 只不过标签变成了 httpd

三.启动容器

1.尝试启动

8080是宿主机端口,80是docker容器端口

-d, –detach Run container in background and print container ID
-p, –publish list Publish a container’s port(s) to the host

注意上面的参数
这时你会发现根本启动不出

eg:

这时我们换参数: (以交互式方式进入,能启动了)

接下来我们使用exec来交互一下(或者用attach)

进入容器后,你可以执行

不出意外你会发现一个错误:

eg:

为什么没有权限呢?这个跟docker对容器的权限控制有关,这里就不展开细讲了。

2.解决方法

在启动容器时:执行 命令 ,容器启动之后执行这个命令

为什么要加 呢?因为在docker的centos容器启动的时候并没有被启动,所以这里我们要手工给他启动一下
这里就不加-i -t 了,因为你加了 -i -t 也启动不了 bash,无法交互式运行

–privileged 参数,给容器加特权,否则交互式方式进入容器无法操作一些譬如修改内核、修改系统参数、甚至启动服务等

参考链接:https://docs.docker.com/engine/reference/commandline/run/#capture-container-id-cidfile

看github上的一个 问题提交
https://github.com/moby/moby/issues/7459
以及redhat上的一个参考文档
https://developers.redhat.com/blog/2014/05/05/running-systemd-within-docker-container/

eg:

现在就可以通过http://ip:8080/ 访问容器的http服务了。

现在不能attach进入容器,进入了你就卡在那里,无法进入,无法退出 (被迫重启QwQ)

3.Dockerfile的解决方案

那这些能否在Dockerfile里直接搞定呢?

eg:

至此,启动成功!

4.如何进入容器并与容器交互(交互式方式进入)呢?

直接看我操作吧

四.容器和宿主机之间的数据共享

如果你已经在Dockerfile里加了 可以这样写

The -v flag mounts the current working directory into the container. The -w lets the command being executed inside the current working directory, by changing into the directory to the value returned by pwd. So this combination executes the command using the container, but inside the current working directory.

译文:

标志将当前工作目录挂载到容器中。 让命令在当前工作目录内执行,通过将目录更改为由 返回的值。 但是,这个组合执行使用容器的命令,仅作用于当前工作目录内。

参考链接:https://docs.docker.com/engine/reference/commandline/run/#mount-volume–v-read-only

发表评论

正在加载验证码......

请先完成验证