一: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/