目录

  • 一、Docker镜像分层
  • 二、Docker镜像创建
  • (1)基于已有镜像创建
  • 编写模板
  • (2)基于本地模板创建
  • 编写模板
  • (3)基于Dockerfile创建
  • 编写模板
  • 例:Apache镜像创建
  • 例:SSH镜像创建
  • 例:Systemctl镜像创建


一、Docker镜像分层

docker做成服务镜像发布 docker 镜像制作_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

测试

docker做成服务镜像发布 docker 镜像制作_docker_02

例: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