Docker重点——Dockerfile学习

一、Dockerfile创建镜像理论

  • Dockerfile是由一组指令组成的文件

  • Dockerfile结构四部分 基础镜像信息 维护者信息 镜像操作指令 容器启动时执行指令

  • Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以““号开头的注释

二、常用的 Dockerfile 操作指令

  • 在编写 Dockerfile 时,有严格的格式需要遵循:第一行必须使用 FROM 指令指明所基于的镜像名称;之后使用 MAINTAINER 指令说明维护该镜像的用户信息;然后是镜像操作相关指令,如 RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。最后使用 CMD 指令指定启动容器时要运行的命令操作。

指令含义
FROM 镜像指定新镜像所基于的镜像,第一条指令必须为FROM 指令,每创建一个镜像就需要一条 FROM 指令
MAINTAINER 名字说明新镜像的维护人信息
RUN 命令在所基于的镜像上执行命令,并提交到新的镜像中
CMD[“要运行的程序”,“参数 1”,“参数 2”]启动容器时要运行的命令或者脚本,Dockerfile 只能有一条CMD 命令。如果指定多条命令,只执行最后一条命令
EXPOSE 端口号指定新镜像加载到 Docker 时要开启的端口
ENV 环境变量 变量值设置一个环境变量的值,会被后面的 RUN 使用
ADD 源文件/目录 目标文件/目录将源文件复制到目标文件,源文件要与 Dockerfile 位于相同目录中,或者是一个 URL
COPY 源文件/目录 目标文件/目录将本地主机上的文件/ 目录复制到目标地点, 源文件/ 目录要与Dockerfile 在相同的目录中
VOLUME [“目录”]在容器中创建一个挂载点
USER 用户名/UID指定运行容器时的用户
WORKDIR 路径为后续的 RUN、CMD、ENTRYPOINT 指定工作目录
ONBUILD 命令指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK健康检查

三、基于Dockerfile创建镜像实验

 # 书写Dockerfile镜像生成文件
 vim Dockerfile
 # Dockerfile生成镜像
 docker build -t  镜像名:标签  Dockerfile位置路径
 docker build -t nginx:centos7 .
 # 查看镜像
 docker images 
 # 创建容器
 docker run -dit --name ngixn nginx:centos7

3.1 Dockerfile创建实操

1.定制基于centos:7.6.1810的nginx服务镜像

 # 编辑Dockerfile镜像生成文件
 vim /root/Dockerfile
 # 第一行必须指明基于的基础镜像
 FROM centos:7.6.1810
 COPY nginx-1.15.2.tar.gz /root
 RUN yum -y install pcre-devel zlib-devel gcc gcc-* make
 RUN tar zxf /root/nginx-1.15.2.tar.gz -C /usr/src
 Run cd /usr/src/nginx-1.15.2 \ 
 && ./configure --prefix=/usr/local/nginx \
 && make && make install \
 && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
 ​
 EXPOSE 80
 ​
 CMD ["nginx","-g","daemon off;"]
 ​
 # 将Dockerfile文件生成镜像
 docker build -t nginx:centos7 .
 # 创建容器
 docker run -itd --name nginx -P nginx:centos7 
 22fa42371543e822d394e52f85b4f8beb98292607ee67b2ca54ede26c933d92e
 # 查看容器
 docker ps
 CONTAINER ID   IMAGE    COMMAND    CREATED      STATUS     PORTS         NAMES
 22fa42371543   nginx:centos7   "nginx -g 'daemon of…"   9 seconds ago   Up 8 seconds   0.0.0.0:49153->80/tcp, :::49153->80/tcp   nginx
 ​

2.创建基于centos:7.6.1810的可ssh登陆的容器

 ​
 #第一行必须指明基于的基础镜像
 FROM centos:7.6.1810
 #作者信息(可选)MAINTAINER name
 #镜像的操作指令
 RUN yum -y install initscripts openssh-server \
 && mkdir -p /sshd \
 && echo "root:123456" | chpasswd \
 && echo '#!/bin/bash' > /sshd/run.sh \
 #生成主机密钥
 && echo '/usr/sbin/sshd-keygen -A' >>/sshd/run.sh \
 && echo '/usr/sbin/sshd -D' >>/sshd/run.sh \
 && chmod -R 755 /sshd/run.sh
 #取消pam限制
 RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
 #开放端口
 EXPOSE 22
 ​
 CMD ["/sshd/run.sh"]
 # 将Dockerfile文件生成镜像
 docker build -t ssh:centos7 .
 # 创建容器
 docker run -itd --name ssh -P nginx:centos7 

3.创建基于centos:7.6.1810的lnmp平台容器

 vim Dockerfile
 # 基础镜像
 FROM centos:7.6.1810
 ## 配置nginx源
 COPY nginx.repo /etc/yum.repos.d/
 ## 初始化RPM数据库并安装nginx
 RUN yum -y install nginx
 ## 修改 nginx 配置文件,使之支持 php
 RUN sed -i '/^user/s/nginx/nginx\ nginx/g' /etc/nginx/nginx.conf
 COPY default.conf /etc/nginx/conf.d/default.conf
 ## 安装 mariadb 和 php
 RUN rpm --rebuilddb && yum -y install mariadb-server mariadb-devel mariadb php-mysql php php-fpm
 ## 修改php-fpm配置文件
 RUN sed -i '/^user/s/apache/nginx/g' /etc/php-fpm.d/www.conf
 RUN sed -i '/^group/s/apache/nginx/g' /etc/php-fpm.d/www.conf
 ## 声明Mariadb的用户以及密码
 ENV MARIADB_USER root
 ENV MARIADB_PASS 123456
 ## 支持中文
 ENV LC_ALL en_US.UTF-8
 ## 添加并运行脚本
 ADD db_init.sh /root/db_init.sh
 RUN chmod 775 /root/db_init.sh
 RUN /root/db_init.sh
 ADD run.sh /root/run.sh
 RUN chmod 775 /root/run.sh
 ADD index.php /usr/share/nginx/html/index.php
 ## 开放的端口
 EXPOSE 80
 EXPOSE 3306
 EXPOSE 443
 EXPOSE 9000
 ## 每次创建容器运行此脚本
 CMD ["/root/run.sh"]
 ​
 ## default.conf文件
 cat default
 server {
     listen       80;
     server_name  localhost;
 ​
     location / {
         root   /usr/share/nginx/html;
         index index.php index.html index.htm;
         }
 ​
     error_page   500 502 503 504  /50x.html;
     location = /50x.html {
         root   /usr/share/nginx/html;
     }
 ​
     location ~ \.php$ {
         root           html;
         fastcgi_pass   127.0.0.1:9000;
         fastcgi_index  index.php;
         fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
         include        fastcgi_params;
     }
 ​
 }
 ​
 ## db_init.sh文件
 cat db_init.sh
 #!/bin/bash
 mysql_install_db --user=mysql
 sleep 3
 mysqld_safe &
 sleep 3
 mysqladmin -u "$MARIADB_USER" password "$MARIADB_PASS"
 mysql -u "$MARIADB_USER" -p"$MARIADB_PASS" -e "use mysql;grant all privileges on *.* to '$MARIADB_USER'@'%' identified by '$MARIDB_PASS' with grant option;"
 mysql -u "$MARIADB_USER" -p"$MARIADB_PASS" -e "grant all privileges on *.* to '$MARIADB_USER'@'localhost' identified by '$MARIDB_PASS';"
 h=$(hostname)
 mysql -u "$MARIADB_USER" -p"$MARIADB_PASS" -e "use mysql;update user set password=password('$MARIDB_PASS') where user='$MARIADB_USER' and host='$h'"
 ​
 ## run.sh文件
 cat run.sh
 #!/bin/bash
 mysqld_safe &
 /usr/sbin/nginx &
 /usr/sbin/php-fpm
 ​
 ## index.php文件
 <?php
 echo date("Y-m-d H:i:s")."<br />\n";
 $link=mysql_connect("localhost","root","123456");
 if(!$link) echo "FAILD!";
 else echo "MySQL is OK!";
 phpinfo();
 ?>
 ​
 ## nginx.repo文件
 cat nginx.repo
 [nginx-stable]
 name=nginx stable repo
 baseurl=http://nginx.org/packages/centos/7/$basearch/
 gpgcheck=1
 enabled=1
 gpgkey=https://nginx.org/keys/nginx_signing.key
 ​
 ​
 # 将Dockerfile文件生成镜像
 docker build -t lnmp:centos7 .
 ​
 # 创建容器
 docker run -dit --name lnmp lnmp:centos7
 ​

4 .创建基于centos:7.6.1810的httpd容器并挂载httpd日志文件

 # 创建dockerfile文件
 vim Dockerfile
 FROM centos:7.6.1810
 RUN yum -y install httpd 
 COPY run.sh /root/run.sh
 RUN chmod +x /root/run.sh
 EXPOSE 80 
 CMD ["/root/run.sh"]
 ​
 # /root/run.sh脚本
 vim run.sh 
 #!/bin/bash
 /usr/sbin/httpd
 ping 172.16.10.1
 ​
 # 将Dockerfile文件生成镜像
 docker build -t httpd:centos7 .
 ​
 # 创建容器并挂载容器httpd日志
 mkdir /root/httpd/log
 docker run -dit -v /root/httpd/log:/var/log/httpd --name httpd -P httpd:centos7

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值