学会Docker之Dockerfile文件构建镜像及容器一篇就够了!!!

一:Dockerfile文件的概要

在之前博客中编写了一个简单的apache镜像。
注意:ADD命令还有解压的意义

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

二:构建ssh服务镜像

用docker exec 命令登录容器是不需要密码,存在一定的危险性。为了提高安全性,构建ssh密钥服务镜像,来新建一个容器。

  • 先创建目录sshd,存放Dockerfile文件
mkdir sshd
cd sshd/

构建镜像ssh

vi Dockerfile 

FROM centos:7
MAINTAINER this is ssh

#更新容器的yum源
RUN yum -y update

#安装ssh和其他服务软件包
RUN yum install -y openssh* net-tools lsof telnet passwd

#修改root用户密码
RUN echo "123456" | passwd --stdin root

#设置不使用ssh服务端的pam模块
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config

#创建非对称秘钥
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

#关闭pam.d机制里的ssh会话模块
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^ /#/' /etc/pam.d/sshd

#创建ssh工作目录并放通权限
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh

#开通端口
EXPOSE 22

#开启sshd服务,容器的centos7镜像里没有systemctl命令,故不能用服务的方式启动
CMD ["/usr/sbin/sshd","-D"]
  • 生成镜像
docker build -t sshd:new .   #(.)当前目录
  • 启动容器并修改root密码
docker run -d -P sshd:new      # -P指随机分配一个端口映射
  • 登录测试
docker ps -a  #查看端口
ssh localhost -p 32768   #可以通过ssh端口登录容器,提高安全性。

在这里插入图片描述

三:构建systemctl 镜像

容器的 centos7镜像里没有systemctl命令,故不能使用此命令管理服务。

  • 先创建目录,存放Dockerfile文件
mkdir /systemctl
cd /systemctl
  • 编写文件
vi Dockerfile 
#基于ssh服务搭建systemctl服务
FROM sshd:new
#基于容器  
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i== \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm- f /lib/systemd/system/multi-user.target.wants/*; \
rm -f /etc/systemd/system/*.wants/*; \
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*; \
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME ["/sys/fs/cgroup"]
CMD ["/usr/sbin/init"]

登录测试,systemctl命令可以tab补齐并使用。
在这里插入图片描述

四:构建nginx镜像

  • 先创建目录,存放Dockerfile文件
mkdir nginx
cd nginx/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值