目录
- 一、Docker镜像分层
- 二、Docker镜像创建
- (1)基于已有镜像创建
- 编写模板
- (2)基于本地模板创建
- 编写模板
- (3)基于Dockerfile创建
- 编写模板
- 例:Apache镜像创建
- 例:SSH镜像创建
- 例:Systemctl镜像创建
一、Docker镜像分层
- Dockerfile中的每个指令都会创建一个新的镜像层
- 镜像层将被缓存和复用
- 当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
- 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
- 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件
二、Docker镜像创建
Docker镜像
- 应用发布的标准格式
- 支撑一个Docker容器的运行
Docker镜像的创建方法
- 基于已有镜像创建
- 基于本地模板创建
- 基于Dockerfile创建
(1)基于已有镜像创建
编写模板
docker commit 选项 容器ID/名称 仓库名:[标签]
-m:说明信息
-a:作者信息
-p:生成过程中停止容器运行
'创建一个容器'
docker create it 镜像名 /bin/bash
docker commit -m "new" -a "docker" 镜像id 新的镜像名称
(2)基于本地模板创建
编写模板
'使用wget导入本地镜像'
wget URL路径
cat 镜像文件 | docker import - docker:new
'导入成功查看'
docker images | greo new
(3)基于Dockerfile创建
编写模板
FROM 镜像
指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER 名字
说明新镜像的维护人信息
RUN 命令
在所基于的镜像上执行命令,并提交到新的镜像中
CMD ["要运行的程序","参数1,参数2"]
EXPOSE 端口号
开启容器内部端口
ENV 环境变量 变量值
设置一个环境变量的值,会被后面的RUN使用
ADD 源文件/目录 目标文件/目录
将源文件复制到目标文件(如果源文件是压缩包会进行自动解压)
COPY 源文件/目录 目标文件/目录
容器的内部进行复制操作使用
VOLUME["目录"]
在容器中创建一个挂载点
USER 用户名/UID
指定运行容器时的用户
WORKDIR 路径
为后续RUN、CMD、ENTRYPOINT指定工作目录
ONBUILD 命令
指定所生产的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK
健康检查
例:Apache镜像创建
创建文件夹
mkdir apache
cd apache
配置Dockerfile文件
vim Dockerfile
FROM centos
MAINTAINER LFP
RUN yum -y update
RUN yum -y install httpd
EXPOSE 80
ADD index.html /var/www/html/index.html
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
配置run.sh文件
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
#开启apache服务并开启守护进程后台启动
配置index.html文件
vim index.html
"welcome to my ooooooo"
创建镜像
'搭建镜像'
docker build -t httpd:centos .
'运行容器并映射端口'
docker run -d -p 1200:80 httpd:centos
测试
例:SSH镜像创建
创建文件夹
mkdir sshd
cd sshd/
配置Dockerfile文件
vim Dockerfile
FROM centos
MAINTAINER LFP
RUN yum -y update
RUN yum -y install openssh* net-tools lsof telnet passwd
RUN echo '123123' | passwd --stdin root
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
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]
创建镜像
'搭建镜像'
docker build -t sshd:new .
'端口映射 -P:随机端口映射'
docker run -d -P sshd:new
通过SSH进入容器
'查看下随机映射的端口是多少'
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e472e9ae2ed sshd:new "/usr/sbin/sshd -D" 42 seconds ago Up 41 seconds 0.0.0.0:49153->22/tcp wonderful_yonath
'进入容器'
ssh localhost -p 49153
例:Systemctl镜像创建
创建文件夹
mkdir sshd
cd sshd/
配置Dockerfile文件
vim Dockerfile
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 /lib/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"]
创建镜像
'搭建镜像'
docker build -t sshd:new .
'启动容器并放在后台执行'
docker run --privateged -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro local/c7-systemd:lastest /sbin/init &
'查看容器的ID方便登入'
docker ps -a
'登入容器'
exec -it c7b68af7e67f bash
'进去之后查看下systemctl是否可以使用'
systemctl status sshd