如何制作Dokcer镜像

如何创建自定义Docker镜像

初次安装部署好docker后,大多数镜像可以从DockerHub 提取,但是大多数人都希望自己可以完全自定义一个镜像,那么这里需要一个第三方工具 febootstrap

epel6的源提供febootstrap的RPM包

yum install docker-io febootstrap -y
service docker start
chkconfig docker --level35 on

制作CentOS6.6镜像目录

febootstrap -i yum -i iputils -i iproute -i bash -i vim-minimal -i coreutils -i tar -i net-tools centos6 base http://centos.ustc.edu.cn/centos/6.6/os/x86_64/ -u http://centos.ustc.edu.cn/centos/6.6/updates/x86_64/

-i 表示镜像里面安装的RPM包(包括一些人为有必要的软件包)
centos6 表示镜像的版本说明
base 表示生成的镜像目录
后面之后了系统安装源和更新源为USTC

安装执行后,会开始一系列的RPM包下载安装,过程与yum类似,安装完成后当前目录会多了base目录,里面就是一个镜像的系统文件

进入base目录等于进入镜像的根目录

[root@image ~]# cd base/
[root@image base]# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var

可以像一般的系统文件一样先做一些修改配置,例如配置第三方yum源等等

把base目录把所有文件打包成二进制文件后导入docker创建为镜像

cd ~/root/base/ && tar -c . | docker import - centos6:base

docker images 可以查看镜像的信息

一个基本centos镜像创建完毕,下面再利用Dokcerfile制作mysql镜像

cat Dockerfile

FROM centos6:base

MAINTAINER Lion "[email protected]"

VOLUME /var/lib/mysql

RUN yum install mysql-server mysql -y

RUN echo -ne "NETWORKING=yes\\nHOSTNAME=mysql" > /etc/sysconfig/network

RUN echo -ne "bind-address = 0.0.0.0\\ndefault-storage-engine=innodb\\ninnodb_file_per_table\\n\ collation-server=utf8_general_ci\\ninit-connect='SET NAMES utf8'\\ncharacter-set-server = utf8" > insert

RUN sed -i "/user=mysql/r insert" /etc/my.cnf && rm -f insert

RUN echo -ne "/usr/bin/mysql_install_db\\n/usr/bin/mysqld_safe" >> /opt/mysql_start

RUN chmod 777 /opt/mysql_start

ENV PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:

WORKDIR /opt

EXPOSE 3306

CMD /bin/sh -c mysql_start

FROM 声明以centos:base镜像为基础
MAINTAINER 声明镜像的维护者信息
VOLUME 挂载本地目录到容器里/var/lib/mysql目录(这是mysql默认的数据保存目录)
由于我希望数据可以持久化防止因为容器误删除而丢失,所以映射到宿主本地目录
RUN 在镜像中执行安装mysql
在新镜像中写入HOSTNAME信息,因为mysql启动过程需要network文件
在my.cnf配置文件插入一些修改配置
创建启动脚本
声明环境变量
制定默认工作目录
EXPOSE 声明容器需要暴露的端口号
CMD 是指镜像生成容器后自动执行的命令,类似docker exec,这里是自动启动mysql服务

根据Dockerfile创建mysql服务镜像

docker build --rm=true -t mysql:frist .

查看镜像的树状关系可以发现,mysql:frist是以centos:base为父镜像

[root@image ~]# docker images -t
Warning: '-t' is deprecated, it will be removed soon. See usage.
├─4fbd1376f4f6 Virtual Size: 311.3 MB Tags: centos6:base
│ └─a71fea602906 Virtual Size: 311.3 MB
│   └─94c593f6f199 Virtual Size: 311.3 MB
│     └─171ec9550634 Virtual Size: 433.3 MB
│       └─68fb11059819 Virtual Size: 433.3 MB
│         └─fded31982712 Virtual Size: 433.3 MB
│           └─8421566c52ca Virtual Size: 433.3 MB
│             └─fec9adb1fdfc Virtual Size: 433.3 MB
│               └─73679da795de Virtual Size: 433.3 MB
│                 └─d62cab992eb9 Virtual Size: 433.3 MB
│                   └─35635b282704 Virtual Size: 433.3 MB
│                     └─e45cde27c49e Virtual Size: 433.3 MB
│                       └─c678591d8a01 Virtual Size: 433.3 MB Tags: mysql:frist

启动一个mysql容器测试,会返回一个完整的容器ID

docker run -d -P --name mysql mysql:frist

可以查看容器目前的状态

[root@image ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                     NAMES
410b6e08c3ed        mysql:frist         "/bin/sh -c '/bin/sh 2 minutes ago Up 2 minutes 0.0.0.0:49163->3306/tcp mysql

宿主机的49163映射到容器里面mysql服务的端口3306

目前是无法从外部访问mysql容器,因为mysql初始化没有允许远程访问,进入容器修改mysql设置

docker exec -it 410b6e08c3ed /bin/bash

进入容器的bash环境后就如同一般的linux差不多,设置mysql密码和允许远程访问

bash-4.1# mysql -e "grant all privileges on *.* to 'root'@'%' identified by 'password'" bash-4.1# mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by 'password'" bash-4.1# exit

此时外部网络的主机客户端直接访问 宿主机IP:49163 即可链接mysql

以上就是如何从零制作一个自定义的Docker镜像,其实在Dockerfile中还有优化的地方,因为每一行都会生成一层镜像层,行太多就会导致镜像树很臃肿.笔者比较喜欢在base容器里面直接修改配置,节省RUN的次数,这样最终镜像就只保留必须的几行就可以了.

你可能感兴趣的:(image,镜像,自定义,docker)