Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库)。我们可以从Docker Hub下pull已经存在的Docker镜像,也只是自己制作基础的镜像,然后再基础镜像的基础上添加所需要的功能。
1. 获取镜像
可以使用 docker pull 命令来从仓库获取所需要的镜像。
下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像。
$ sudo docker pull ubuntu:12.04
下面是从Docker-hub上获取centos的镜像
[root@centos docker]# docker pull centos:centos6
centos:centos6: The image you are pulling has been verified
511136ea3c5a: Pull complete
5b12ef8fd570: Pull complete
a30bc9f3097e: Pull complete
Status: Downloaded newer image for centos:centos6
如果在执行镜像后出现下面的不是我们平常看到的Linux的命令提示行,而是bash-4.1#,。那是因为/root目录是空的,没有用户相关的配置文件。解决办法是把/etc/skel/目录下的东西cp到当前用户的家目录下,也就是/root目录下。因为创建用户时,用户的家目录下的文件其实都是从这个目录下copy过去的。
bash-4.1# cp /etc/skel/.b* /root
bash-4.1# su root
[root@94f1b01d78f3 /]#
这也可以再制作镜像的时候添加,后面会有介绍。
2. 自制镜像
2.1 制作镜像文件
我们看到Docker Hub上有许多的基础镜像,我们也可以自己制作镜像,这里制作的镜像版本问centos6.3版本,需要使用到的工具是:febootstrap,可以使用yum –y install febootstrap 进行安装,使用下面的命令进行制作:
febootstrap -i bash -i wget -i yum -i iputils -i iproute -i man -i vim -i openssh-server -i openssh-clients -i tar -i gzip centos6 centos6.3-image
centos6:OS版本。
centos6.3-image:镜像文件保存到当前路径下的centos6.3-image文件夹下。
: centos6.3系统镜像路径。
上面的-i选项表明我制作的基础镜像中已经包含的一些包,需要什么包可以在下面的地址中查找到,由于URL的地址都是在墙外面可能会造成制作过程异常的慢,如果速度太慢的话可能造成制作不成功,
http://vault.centos.org/6.3/os/x86_64/Packages/curl-7.19.7-26.el6_2.4.x86_64.rpm: [Errno 12] Timeout on http://vault.centos.org/6.3/os/x86_64/Packages/curl-7.19.7-26.el6_2.4.x86_64.rpm: (28, 'Operation too slow. Less than 1 bytes/sec transfered the last 30 seconds')
Trying other mirror.
最后的结果可能出现下面的错误:
Error Downloading Packages:
curl-7.19.7-26.el6_2.4.x86_64: failure: Packages/curl-7.19.7-26.el6_2.4.x86_64.rpm from febootstrap: [Errno 256] No more mirrors to try.
chroot: failed to run command `rm': No such file or directory
chroot: failed to run command `rm': No such file or directory
如果出现上面的情况,建议使用云计算厂商北美的云主机,然后再把制作好的拷贝过来,或者需要VPN。制作完成后如下;
[root@ centos6.3-image]# ls
bin boot dev etc home lib lib64 media mnt opt proc root sbin selinux srv sys tmp usr var
但是在root下面的并没有任何的文件,这样就好出现进入Docker后出现bash4.1的问题,
[root@ root]# ls -al
total 8
dr-xr-x--- 2 root root 4096 Sep 23 2011 .
dr-xr-xr-x 21 root root 4096 Feb 27 16:40 ..
可以使用下面的命令进行拷贝:
root@10-10-62-234 centos6.3-image]# cp /etc/skel/.bash* root/
2.2 导入镜像文件
使用下面的命令导入镜像文件,并生产镜像的ID。
[root@centos docker]# cd centos6.3-image && tar -c .|docker import - centos6.3-base
e7275ddab321d86f9b75b610007cf8dc78137c83a5721300877d35aeac57bb57
使用docker images就可看到我们导入的镜像
[root@centos centos6.3-image]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos6.3-base latest e7275ddab321 53 seconds ago 355.4 MB