Dockerfile部署httpd服务

基本结构

Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义镜像。

Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。

Docker分为四部分:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时默认要执行的指令

例如:

[root@localhost ~]# mkdir nginx
[root@localhost ~]# ls
anaconda-ks.cfg  nginx
[root@localhost ~]# cd nginx/
[root@localhost nginx]# vi Dockerfile     // 这个D必须大写
[root@localhost nginx]# cat Dockerfile 
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: seancheng
# Command format: Instruction [arguments / command] ...

# 第一行必须指定基于的基础镜像
FROM ubuntu

# 维护者信息
LABEL MAINTAINER='seancheng xianshangxian@126.com'

# 镜像操作指令
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" >> /etc/apt/sources.list && \
    apt-get update && apt-get install -y nginx && \
    echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# 容器启动时默认要执行的指令
CMD /usr/sbin/nginx     // CMD是用来指定容器启动的时候要启动什么程序

其中,一开始必须指明所基于的镜像名称,接下来一般会说明维护者信息。
后面则是镜像操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像添加新的一层,并提交。
最后是CMD指令来指定运行容器时的操作指令。

创建镜像

编写完成Dockerfile后,可以通过docker build命令来创建镜像。

基本的格式为docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像。因此一般建议放置Dockerfile的目录为空目录。

另外,可以通过 .dockerignore 文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。

要指定镜像的标签信息,可以通过-t选项。

例如,指定Dockerfile所在路径为/tmp/docker_builder/,并且希望生成镜像标签为build_repo/first_image,可以使用下面的命令:

[root@localhost ~]# docker build nginx
[root@localhost ~]# docker tag 20282efe05a2 wjj200112/myapp:v0.1    // 给镜像取名字
[root@localhost ~]# docker images 
REPOSITORY        TAG       IMAGE ID       CREATED              SIZE
wjj200112/myapp   v0.1      20282efe05a2   About a minute ago   185MB
ubuntu            latest    ba6acccedd29   7 weeks ago          72.8MB
[root@localhost ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: wjj200112
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@localhost ~]# docker push wjj200112/myapp:v0.1
The push refers to repository [docker.io/wjj200112/myapp]
d9e2e47db2a4: Pushed 
2a270de0c211: Pushed 
b25637d4baf9: Pushed 
9f54eef41275: Mounted from library/ubuntu 
v0.1: digest: sha256:f2d48f46f446f793f172c71b7726b735526b13b3c1348d0f1ddff1c67d4f8bab size: 1155
[root@localhost ~]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
wjj200112/myapp   v0.2      d83c65c205bc   2 seconds ago   185MB
wjj200112/myapp   v0.1      20282efe05a2   9 minutes ago   185MB
ubuntu            latest    ba6acccedd29   7 weeks ago     72.8MB
[root@localhost ~]# docker push wjj200112/myapp:v0.2

// 使用新创建的镜像创建容器
[root@localhost ~]# docker run -d -p 80:80 --rm --name web wjj200112/myapp:v0.1
8961a99d111a427e6f5d677cd7c282aa8552798d49a4ef5081ccb34af6d95960
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                               NAMES
8961a99d111a   wjj200112/myapp:v0.1   "/bin/sh -c /usr/sbi…"   6 seconds ago   Up 5 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   web

指令

指令的一般格式为INSTRUCTION arguments,指令包括:

  • FROM
  • LABEL
  • MAINTAINER
  • RUN
  • CMD
  • EXPOSE
  • ENV
  • ADD
  • COPY
  • ENTRYPOINT
  • VOLUME
  • USER
  • WORKDIR
  • ONBUILD

目录结构

[root@localhost apache]# pwd
/root/apache
[root@localhost ~]# tree apache/
apache/
├── apr-1.7.0.tar.gz
├── apr-util-1.6.1.tar.gz
├── Dockerfile
└── httpd-2.4.48.tar.gz

Dockerfile编写

# 第一行必须指定基于的基础镜像
FROM centos

# 维护者信息
LABEL MAINTAINER='wjm @126.com'

# 下载所需的软件包
RUN yum -y install epel-release && yum -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++ make && yum -y groups mark install 'Development Tools'

# 传输解压后的包
ADD apr-1.7.0.tar.gz  /usr/src/
ADD apr-util-1.6.1.tar.gz /usr/src/
ADD httpd-2.4.48.tar.gz /usr/src/

# 编译安装、创建用户、修改配置文件
RUN cd /usr/src/apr-1.7.0 && ./configure --prefix=/usr/local/apr && make && make install && \
    cd /usr/src/apr-util-1.6.1 && ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install && \
    cd /usr/src/httpd-2.4.48 && ./configure --prefix=/usr/local/apache \
    --enable-so \
    --enable-ssl \
    --enable-cgi \
    --enable-rewrite \
    --with-zlib \
    --with-pcre \
    --with-apr=/usr/local/apr \
    --with-apr-util=/usr/local/apr-util/ \
    --enable-modules=most \
    --enable-mpms-shared=all \
    --with-mpm=prefork &&\
    make && make install && \
    useradd  -r -M -s  /sbin/nologin  apache && \
    sed -i 's/$RM "$cfgfile"/# $RM "$cfgfile"/g' /usr/src/apr-1.7.0/configure && \
    ln -s /usr/local/apache/include/ /usr/include/httpd && \
    sed -i 's/#ServerName www.example.com:80/ServerName www.example.com:80/g' /usr/local/apache/conf/httpd.conf

# 容器启动后要执行的程序
CMD ["-D","FOREGROUND"]
ENTRYPOINT ["/usr/local/apache/bin/apachectl"]

# 暴露端口
EXPOSE 80 443     //暴露端口,这里暴露的端口是不一定存在的
                                                                                                                                                                         

生成镜像、并启动成容器

[root@localhost ~]# docker build -t wjm1734321/httpd:v0.1 apache
[root@localhost ~]# docker images
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
wjm1734321/httpd   v0.1      8e69401ab000   6 minutes ago   732MB
mysql              latest    bbf6571db497   7 days ago      516MB
nginx              latest    f652ca386ed1   7 days ago      141MB
busybox            latest    d23834f29b38   9 days ago      1.24MB
centos             latest    5d0da3dc9764   2 months ago    231MB

//启动成容器
[root@localhost ~]# docker run -itd --name web -p 80:80 wjm1734321/httpd:v0.1
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS         PORTS                                        NAMES
9215a84d64f0   wjm1734321/httpd:v0.1   "/usr/local/apache/b…"   6 minutes ago   Up 6 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp   web

页面测试
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值