Docker镜像制作方法及Dockerfile企业级简单解析

由于Docker官网公共仓库镜像大多不完整,无法真正满足企业的生产环境系统,此时需要我们自行定制镜像或者重新打包镜像。Docker镜像制作是管理员的必备工作之一,Docker镜像制作的方法主要有两种,制作方法如下:

  • Docker commit|export将新容器提交至Images列表;
  • 编写Dockerfile,bulid新的镜像至镜像列表;

一、commit方式

  • 从Docker仓库中下载基础镜像;
    docker pull docker.io/jdeathe/centos-ssh

  • Docker run基础镜像,生成容器;
    docker run -itd -p 6022:22 --privileged -name aliyun-server docker.io/jdeathe/centos-ssh

  • 进入容器-安装软件、添加功能、创建目录、文件;

#这里可以将你这个虚拟机需要的基础环境安装上,比如部署一个LNMP架构,或者我只想用一个web服务器,只用安装一个nginx即可!
yum install wget zlib-devel pcre-devel gcc-c++ -y
wget -O /usr/local/nginx-1.16.0.tar.gz http://nginx.org/download/nginx-1.16.0.tar.gz
tar xvf /usr/local/nginx-1.16.0.tar.gz
cd /usr/local/nginx-1.16.0
./configure --prefix=/usr/local
make -j4&make install
wget -O /usr/local/nginx/html/index.html http://www.baidu.com
echo "PATH=$PATH:/usr/local/nginx/sbin/" >>/etc/profile
source /etc/profile
  • Docker commit 容器ID,将容器提交为新的镜像;
    docker commit c432b9da999c
    在这里插入图片描述在这里插入图片描述
  • Docker save将镜像列表中的镜像导入为tar包;
    docker save centos-v2:latest -o /root/centos-v2.tar
  • Docker load镜像tar包,导入镜像列表。
    注:先scp到目标服务器,再执行下面操作
    docker load -i /root/centos-v2.tar

二、Export方式

  • 从Docker仓库中下载基础镜像;
  • Docker run基础镜像,生成容器;
  • 进入容器-安装软件、添加功能、创建目录、文件;
  • Docker export 容器ID,将容器导出为镜像tar包(丢失内存中的数据文件,企业中不推荐该方案);
docker ps
docker export c432b9da999c(容器ID) >/root/centos-v3.tar
  • Docker import将镜像tar包,导入镜像列表。
 cat /root/centos-v3.tar|docker import - centos-v3
 -:占位符
 centos-v3:指定REPOSITORY

在这里插入图片描述注:以上两种方式的区别是,commit方法多了一个将容器提交成为镜像的步骤,Export方式直接将容器变成镜像再导出,合成一步了。但是这样虽然方便,但是可能会有数据损失,所以一般不采用Export方法!

三、Dockerfile企业级制作方法(推荐)

1、Dockerfile制作原理

将基于一个基础镜像,通过编写Dockerfile方式,将各个功能进行叠加,最终形成新的Docker镜像,是目前互联网企业中打包镜像最为推荐的方式。

Dockerfile是一个镜像的表示,也是一个镜像的原材料,可以通过Dockerfile来描述构建镜像,并自动构建一个容器。

2、如下为DockerFile制作镜像,必备的指令和参数的详解:

FROM	 		指定所创建镜像的基础镜像;
MAINTAINER		指定维护者信息;
RUN				运行命令;
CMD				指定启动容器时默认执行的命令;
LABEL			指定生成镜像的元数据标签信息;
EXPOSE			声明镜像内服务所监听的端口;
ENV				指定环境变量;
ADD				赋值指定的<src>路径下的内容到容器中的<dest>路径下,<src>可以为URL;如果为tar文件,会自动解压到<dest>路径下
COPY			赋值本地主机的<scr>路径下的内容到容器中的<dest>路径下;一般情况下推荐使用COPY而不是ADD;
ENTRYPOINT		指定镜像的默认入口;
VOLUME			创建数据挂载点;
USER			指定运行容器时的用户名或UID;
WORKDIR			配置工作目录;
ARG				指定镜像内使用的参数(例如版本号信息等);
ONBUILD			配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作的命令;
STOPSIGNAL		容器退出的信号;
HEALTHCHECK		如何进行健康检查;
SHELL			指定使用SHELL时的默认SHELL类型;

3、Dockerfile制作镜像规范和技巧如下:

  • 精简镜像用途:尽量让每个镜像的用途都比较集中、单一,避免构造大而复杂、多功能的镜像;
  • 选用合适的基础镜像:过大的基础镜像会造成构建出臃肿的镜像,一般推荐比较小巧的镜像作为基础镜像;
  • 提供详细的注释和维护者信息: Dockerfile也是一种代码,需要考虑方便后续扩展和他人使用;
  • 正确使用版本号:使用明确的具体数字信息的版本号信息,而非latest,可以避免无法确认具体版本号,统一环境;
  • 减少镜像层数:减少镜像层数建议尽量合并RUN指令,可以将多条RUN指令的内容通过&&连接;
  • 及时删除临时和缓存文件:这样可以避免构造的镜像过于臃肿,并且这些缓存文件并没有实际用途;
  • 提高生产速度:合理使用缓存、减少目录下的使用文件,使用.dockeringore文件等;
  • 调整合理的指令顺序:在开启缓存的情况下,内容不变的指令尽量放在前面,这样可以提高指令的复用性;
  • 减少外部源的干扰:如果确实要从外部引入数据,需要制定持久的地址,并带有版本信息,让他人可以重复使用而不出错。

4、DockerFile企业案例一

企业需求:启动Docker容器,同时开启Docker容器对外的22端口的监听,实现通过CRT或者Xshell登录。
编写Dockerfile文件:

# 设置基本的镜像,后续命令都以这个镜像为基础
FROM centos:v1
# 作者信息
MAINTAINER  wujincheng@163.com

# RUN命令会在上面指定的镜像里执行任何命令
RUN rpm --rebuilddb;yum install passwd openssl openssh-server -y
RUN echo '123456' | passwd --stdin root
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh

# 暴露ssh端口22
EXPOSE  22

# 设定运行镜像时的默认命令:输出ip,-D并以daemon方式启动sshd
CMD /usr/sbin/sshd -D;/bin/bash

5、DockerFile企业案例二

企业需求:开启SSH 6379端口,让Redis端口对外访问,Dockerfile内容如下:
编写Dockerfile文件:

# 设置基本的镜像,后续命令都以这个镜像为基础
FROM centos_lamp:v1 
# 作者信息
MAINTAINER  wujincheng@163.com

# RUN命令会在上面指定的镜像里执行任何命令
RUN rpm --rebuilddb;yum install redis* -y
RUN sed -i '/bind/127.0.0.1/0.0.0.0/g' /etc/redis.conf 

#暴露ssh端口6379
EXPOSE  6379

#-D设定运行以daemon方式启动sshd
CMD /usr/sbin/redis -D

6、DockerFile企业案例三

企业需求:基于Dockerfile开启Apache 80端口,并远程连接服务器
编写Dockerfile文件:

# 设置基本的镜像,后续命令都以这个镜像为基础
FROM centos_lamp:v1
# 作者信息
MAINTAINER  wujincheng@163.com

# RUN命令会在上面指定的镜像里执行任何命令
RUN rpm --rebuilddb;yum install pcre-devel -y
RUN rpm --rebuilddb;yum install httpd httpd-devel –y
RUN  echo “<h1>The Test Page JFEDU</h1>” >>/var/www/html/index.html

#暴露ssh端口80
EXPOSE 80

#启动httpd
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

7、DockerFile企业案例四

企业需求:Docker虚拟化中,如何来构建我们的MYSQL数据库服务器呢?答案很简单,我们可以是dockerfile来生成mysql镜像并启动运行即可。
编写Dockerfile文件:

FROM centos:v1
RUN groupadd -r mysql && useradd -r -g mysql mysql
RUN rpm --rebuilddb;yum install -y gcc zlib-devel gd-devel
ENV MYSQL_MAJOR 5.6
ENV MYSQL_VERSION 5.6.20
RUN 
	&& curl -SL "http://dev.mysql.com/get/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz" -o mysql.tar.gz \
	&& curl -SL "http://mysql.he.net/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz.asc" -o mysql.tar.gz.asc \
	&& mkdir /usr/local/mysql \
	&& tar -xzf mysql.tar.gz -C /usr/local/mysql \
	&& rm mysql.tar.gz* \
ENV PATH $PATH:/usr/local/mysql/bin:/usr/local/mysql/scripts
WORKDIR /usr/local/mysql
VOLUME /var/lib/mysql
EXPOSE 3306
CMD ["mysqld", "--datadir=/var/lib/mysql", "--user=mysql"]

8、根据dockerfile生成镜像

用docker build根据Dockerfile创建镜像(centos:ssh):

#这种生成方式是用来指定名字不是Dockerfile的创建方式,-为占位符
docker  build  -t  [REPOSITORY]:[TAG]  -  <  /etc/dockerfile
#文件名默认为Dockerfile,所以不用指定,指定位置即可
docker  build  -t  [REPOSITORY]:[TAG]  .(指定位置为当前)
#注:-t是用来指定 Name and optionally a tag in the 'name:tag' format (default [])

在这里插入图片描述

发布了188 篇原创文章 · 获赞 150 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44571270/article/details/104358577
今日推荐