
image.png
这节我们要实现下面一些内容

image.png
我们根据上节课的镜像(centos) docker run -i -t centos(上节课这样加入镜像到容器)

image.png
下面我们创建一个新的镜像也叫centos 只不过tag名称不一样
通过Dockerfile方式创建(官方推荐的方式)
Dockerfile可以简单为一个配置文件 可以在我们构建镜像的时候放入一些命令
官方文档地址如下
下面我们使用Dockerfile构建镜像 先看个案例

image.png
接下来进行操作
比如我们想在纯净的centos镜像里安装apache
首先创建个空文件夹build
mkdir build
cd build
vim Dockerfile
加入如下内容

image.png
保存退出
FROM 表示从一个已有的纯净的镜像创建一个新的镜像 RUN 表示在创建镜像的时候执行的命令 EXPOSE 80表示暴露80端口
cat Dockerfile

image.png
根据Dockerfile创建一个新的镜像
使用docker build命令 用于读取Dockerfile创建镜像

image.png
接下来在xshell中执行
docker build -t centos:httpd .
其中-t指定镜像名称(centos) httpd是tag名称 最后面有个点. 必须要有 代表当前文件夹
运行如下

image.png
下载了一些相关的依赖和httpd(apache)
下面执行docker images

image.png
出现如下镜像 就是我们使用Dockerfile创建的镜像
镜像创建好了 下一步 我们使其以容器的方式启动

image.png
xshell中执行
运行如下(创建了个容器)

image.png
执行docker ps 查看正在运行的镜像

image.png
发现刚刚的容器并没有运行
docker ps -a

image.png
说明容器没有启动(已经创建了)
接下来执行如下

image.png
说明myhttpd还没有启动(实际上是启动后自动关闭了)
为了解决容器启动不出 我们首先把创建的这个容器删掉
docker rm myhttpd

image.png

image.png
接下来使用交互式命令
docker run -i -t -p 8080:80 --name myhttpd centos:httpd
运行如下

image.png
进入到root下面了(可以启动了)
查看httpd状态

image.png
发现没有权限
执行ps -ef | grep httpd

image.png
发现容器里面httpd的进程没有被启动
接下来ctrl+d退出交互式命令
docker ps

image.png
下面我们解决下为什么启动不了

image.png
接下来执行如下命令
首先删除刚创建的容器
接着执行下面命令
docker run --privileged -d -p 8080:80 --name myhttpd centos:httpd /usr/sbin/init
--privileged 表示给容器加特权 否则交互式方式进入容器无法操作(灭有权限) /usr/sbin/init 表示容器启动成功后执行的进程(由于centos启动容器的时候并没有执行,所以需要手动执行一次init进程)

image.png
执行docker ps

image.png
可以发现启动成功了新的容器 myhttpd
这个容器跟上节课的纯净的容器有很多区别
纯净的容器里面COMMAND指向命令 /bin/bash
而新的容器 指向/usr/sbin/init
新创建的容器有端口 并且将宿主机的8080端口(虚拟机)映射到了容器的80端口
容器的80端口通过Dockerfile文件暴露出80端口的(而不是通过防火墙放行)
接下来进入容器操作一些内容怎么办呢
执行下面命令
docker exec -i -t myhttpd /bin/bash

image.png
以上就通过bash方式进入了容器
执行systemctl status httpd查看httpd状态

image.png
以上就是在容器中启动centos然后安装apache暴露端口 启动网站的基本过程
接下来在浏览器输入http://192.168.31.125:8080/

image.png
可以看见apache给我们配置的默认网站
上面我们启动容器 启动apache服务加入一堆参数
那么能不能直接在Dockerfile中干这些事呢

image.png
需要先停掉新启动的容器 在删除容器 在删除镜像
docker stop myhttpd docker rm myhttpd
docker rmi centos:httpd 删除镜像
然后修改Dockerfile文件
加入如下
CMD /usr/sbin/init 这相当于
docker run --privileged -d -p 8080:80 --name myhttpd centos:httpd /usr/sbin/init
最后执行的进程参数
修改后保存
再次执行
docker build -t centos:httpd .
docker run --privileged -d -p 8080:80 --name myhttpd centos:httpd
查看容器是否启动成功 并且网站是否能够正常运行
最后了解下查看容器的日志

image.png