写在正文前
本博客是作者看了书籍《Docker技术入门与实战》后,在ubuntu虚拟机内进行实战操作后,发现了一些实际操作问题后,有感而发所写的,若有侵权,请联系博主协商解决。
实验环境:Win10宿主机上的ubuntu虚拟机,已安装Docker【如何安装Docker可查看其它教程】
Docker中有两种创建容器的方法:基于Docker commit命令和基于Dockerfile创建。
本博客选择基于Dockerfile的模式。
Dockerfile的基础镜像源自这篇博客。
1 创建工作目录
首先创建一个工作目录,叫做apache_ubuntu_blog,并进入其中:
ag@ubuntu:~/studyDocker$ mkdir apache_ubuntu_blog && cd apache_ubuntu_blog
ag@ubuntu:~/studyDocker/apache_ubuntu_blog$
接着创建Dockerfile文件与run.sh文件:
ag@ubuntu:~/studyDocker/apache_ubuntu_blog$ touch Dockerfile run.sh
ag@ubuntu:~/studyDocker/apache_ubuntu_blog$ ls
Dockerfile run.sh
再创建一个sample文件夹:
ag@ubuntu:~/studyDocker/apache_ubuntu_blog$ mkdir sample
ag@ubuntu:~/studyDocker/apache_ubuntu_blog$ ls
Dockerfile run.sh sample
2 编写run.sh脚本和创建web文本文件
脚本文件run.sh用来启动ssh服务和Apache服务,内容如下:
ag@ubuntu:~/studyDocker/apache_ubuntu_blog$ cat run.sh
#! /bin/bash
/usr/sbin/sshd &
exec apache2 -D FOREGROUND
在sample目录下创建index.html文件,内容为:
ag@ubuntu:~/studyDocker/apache_ubuntu_blog$ cat sample/index.html
<! DOCTYPE html>
<html>
<body>
<p>Hello, Docker!<p>
</body>
</html>
3 编写Dockerfile
Dockerfile文件用来创建Docker镜像,其内容如下:
FROM sshd:blog
MAINTAINER AlaGeek (24******03@qq.com)
#设置环境变量,所有的操作都是非交互式的
ENV DEBIAN_FRONTEND noninteractive
#安装apache,以及tzdata【安装tzdata是为了后面的更改时区需要】
RUN apt-get -yq install apache2 && apt-get install -yq tzdata && rm -rf /var/lib/apt/lists/*
#更改系统的时区设置,默认的ubuntu设置会对apache服务产生不好的影响
RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
#添加脚本,设置权限
ADD run.sh /run.sh
RUN chmod 755 /*.sh
#将sample里的示例放入app文件夹中,删除apache的/var/www/html下的文件,并将app文件夹软链接到该目录下
RUN mkdir -p /var/lock/apache2 && mkdir -p /var/run/apache2 && mkdir -p /app && rm -rf /var/www/html && ln -s /app /var/www/html
COPY sample/ /app
#设置apache相关变量
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_SERVERADMIN admin@localhost
ENV APACHE_SERVERNAME localhost
ENV APACHE_SERVERALIAS docker.localhost
ENV APACHE_DOCUMENTROOT /var/www
#开放80端口,将app设置为工作目录
EXPOSE 80
WORKDIR /app
#设置自启动命令
CMD ["/run.sh"]
4 创建镜像
在apache_ubuntu_blog目录下执行命令【注意命令最后有一个 “.” ,表示Dockerfile文件在当前目录下】:
ag@ubuntu:~/studyDocker/apache_ubuntu_blog$ docker build -t apache:blog .
执行成功的标志如下:
Successfully built 031b4a3170f7
Successfully tagged apache:blog
说明apache:blog镜像已经创建完毕,它的ID为031b4a3170f7,也可用docker images命令查看镜像:
ag@ubuntu:~/studyDocker/apache_ubuntu_blog$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
apache blog 031b4a3170f7 4 days ago 263MB
5 测试
使用如下命令,基于apache:blog镜像启动一个容器:
ag@ubuntu:~/studyDocker/apache_ubuntu_blog$ docker run -d -P apache:blog
637c34831faa7efaa28457cf44321724f719c386fd4bed218867bd16a6f73711
产生的字符串是该容器的ID,使用docker ps命令查看端口映射情况:
ag@ubuntu:~/studyDocker/apache_ubuntu_blog$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
637c34831faa apache:blog "/run.sh" 34 seconds ago Up 33 seconds 0.0.0.0:32772->22/tcp, 0.0.0.0:32771->80/tcp youthful_noether
下面对该容器进行测试:
ag@ubuntu:~/studyDocker/apache_ubuntu_blog$ curl 127.0.0.1:32771
<! DOCTYPE html>
<html>
<body>
<p>Hello, Docker!<p>
</body>
</html>
返回页面正是sample文件夹下的index.html文件,测试成功。
这里需要注意的是,容器启动后,有两个端口映射,22端口对应的是SSH服务,80端口对应的是Apache服务,因此测试的时候要选择80端口对应的端口。