可以看到 build 进程在执行操作。它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据 Dockerfile 来进行。然后,Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的 docker commit 一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被删除和清理了。
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@8196968dac35:/#
还可以用 docker tag 命令来修改镜像的标签。
$ sudo docker tag 5db5f8471261 ouruser/sinatra:devel
$ sudo docker images ouruser/sinatra
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ouruser/sinatra latest 5db5f8471261 11 hours ago 446.7 MB
ouruser/sinatra devel 5db5f8471261 11 hours ago 446.7 MB
ouruser/sinatra v2 5db5f8471261 11 hours ago 446.7 MB
四、从本地文件系统导入
要从本地文件系统导入一个镜像,可以使用 openvz(容器虚拟化的先锋技术)的模板来创建:openvz 的模板下载地址为templates 。
比如,先下载了一个 ubuntu-14.04 的镜像,之后使用以下命令导入:
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
然后查看新导入的镜像。
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 05ac7c0b9383 17 seconds ago 215.5 MB
五、上传镜像
用户可以通过 docker push 命令,把自己创建的镜像上传到仓库中来共享。例如,用户在 Docker Hub 上完成注册后,可以推送自己的镜像到仓库中。
$ sudo docker push ouruser/sinatra
The push refers to a repository [ouruser/sinatra] (len: 1)
Sending image list
Pushing repository ouruser/sinatra (3 tags)
Docker镜像保存为文件及从文件导入镜像的方法
我们制作好镜像后,有时需要将镜像复制到另一台服务器使用。
能达到以上目的有两种方式,一种是上传镜像到仓库中(本地或公共仓库),但是另一台服务器很肯能只是与当前服务器局域网想通而没有公网的,所以如果使用仓库的方式,只能自己搭建私有仓库,这会在另一篇文章中介绍。
如果我们仅仅是要复制到另外少数的服务器,搭建私有仓库显然没有这个必要,而将镜像保存为文件上传到其他服务器再从文件中载入镜像也是一个不错的选择。
可以使用Docker save和Docker load命令来存储和载入镜像。
2、保存镜像为文件
如果要讲镜像保存为本地文件,可以使用Docker save命令。
命令格式:
Docker镜像制作详解介绍
最近由于工作原因,需要对Docker镜像进行制作,这里记录下,也许对大家也有一定帮助!
写在前面:本文docker镜像制作方法更适用于基于已有docker镜像一次性修改。
推荐用Docker File制作docker镜像。
原理是一样的,但是用docker file制作docker镜像能够记录下操作步骤,方便以后更改或者镜像丢失后重新创建。
本文以Ubuntu为基础镜像,预启动一个django项目和ssh服务,制作一个新的镜像。
1、基础镜像
我选用的是从Docker官网下载的ubuntu镜像。
docker run ubuntu
docker pull ubuntu
2、安装ssh服务
docker run -i -t ubuntu /bin/bash #创建一个容器,-t是临时终端。
进入ubuntu后,安装openssh
apt-get install openssh-server #安装ssh
#需要修改/etc/sshd/sshd_config文件中内容
PermitRootLogin yes
UsePAM no
修改ubuntu的root用户密码,以便以后ssh登陆:
sudo passwd root
3、制作新的镜像
到此,我们需要把这个带有ssh服务的容器提交成一个镜像,方便以后在这个基础上各种改造:
docker commit <container id> <image name>
4、基于现有ssh服务的Ubuntu镜像,加入django项目,并设置随容器自启动
ok,经过以上步骤,doker images可以查看,新提交的doker镜像已经在里面了,例如image name为ssh-ubuntu的新镜像。
最基础的Ubuntu容器已经没有作用了
利用
doker stop <container id>
doker rm <Container id>
清楚刚刚启动的最基础的Ubuntu容器
下面,要基于我们新的ssh-ubuntu进行个性化定制,首先,要将这个镜像运行起来
docker run -d -p 5001:22 ssh-ubuntu /usr/sbin/sshd -D
(-p为端口映射 容器中22端口应射程主机5001端口 || /usr/sbin/sshd -D是指定容器启动后要运行的command,本处是启动ssh服务)
容器启动后,我们可以通过ssh的方式,登陆到容器中
ssh root@doker0_ip -p 5001(22映射端口)
进入到容器后,就可以进行下一步个性化定制了。例如我要把我的django项目放到镜像中,并随着容器启动而启动。
(1)把django项目拷贝到容器中,用scp命令即可。
(2)比较通用的开机启动进程方法:
安装supervisor!
apt-get update && apt-get install supervisor
(如果apt-get install找不到包,先update一下)
然后编辑配置文件,vi /etc/supervisord.conf
用3小节方法重新制作新的镜像,清除当前容器即可。
5、运行新镜像
docker run -d -p 5001:22 -p 5000:9999 <image-name> /etc/supervisord
此时,可以访问主机5000端口,看看能不能访问到容器里面的django项目。
镜像制作大体过程至此完成。
*****************************************************************************************************************************************************
docker 本身是有push 来上传的 index.docker.io 的,使用是用pull拉取。但是没有条件搭建本地docker仓库或者需要将应用导出到另外一个Docker环境中,我们可以将docker镜像导出到一个文件,具体做法如下:
sudo docker export <容器id> > docker_app.tar
完成后我们刚才制作的容器就导出成了 docker_app.tar 文件, 以后在其他机器部署的时候执行导入
cat docker_app.tar | sudo docker import - docker_app
管道后面的 docker_app 为导入后image命名,自己指定。
Docker镜像的创建、存出、载入
创建镜像的方法有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建,本博文讲解前两种。
基于已有镜像的容器创建
该方法是使用docker commit命令,其命令格式为:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
testimage latest baea98d5a437 About a minute ago 188.3 MB
PS:利用此容器创建的镜像Id与此容器的镜像id不同,可知它们不是同一镜像。
基于本地模板导入
也可以从操作系统模板文件导入一个镜像,比如使用OpenVZ提供的模板创建,OPENVZ下载模板在:http://openvz.org/Download/template/precreated。
我尝试使用了Ubuntu14.04的模板:
其实只是两个命令,不过很显而易见,就不加解释了。成功的话,就会返回根据模板建立的镜像的长ID
sudo cat ubuntu–14.04–x86_64–minimal.tar.gz | docker import – ubuntu:14.04
ab80404d13d580965b9919b640169ccb585ea7884e6aa9de1ec043075c65fe35
然后就可以查看本地的镜像:
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 ab80404d13d5 56 seconds ago 215.4 MB
testimage latest baea98d5a437 29 minutes ago 188.3 MB
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
testimage latest baea98d5a437 25 minutes ago 188.3 MB
ubuntu latest fa81ed084842 3 days ago 188.3 MB
docker save –o /data/testimage.tar testimage:latest
ubuntu@VM–223–238–ubuntu:/data$ docker rmi baea98d5a437
Untagged: testimage:latest
Deleted: baea98d5a4371a6abf9efc8c53a54a6fc5befd167bf91ce9fd4a28a6d1b7dc5b
ubuntu@VM–223–238–ubuntu:/data$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 ab80404d13d5 5 minutes ago 215.4 MB
docker load —input testimage.tar
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 ab80404d13d5 6 minutes ago 215.4 MB
testimage latest baea98d5a437 35 minutes ago 188.3 MB
第一行就是载入镜像,还可以简化写成:
docker load < testimage.tar
载入操作将会导入镜像以及相关的元数据信息(包括标签等)。
镜像的上传
最后说点镜像的上传,镜像的管理方式非常像git,可以使用docker push命令上传自己本地镜像到仓库,默认上传到DockerHub官方仓库(需要登陆),命令格式:
docker push NAME[:TAG]
我觉得无论是运维团队还是开发团队还是一个实验室,都有必要有一个自己的Docker仓库,可以存放符合自己需求的环境或系统镜像,可以实现快速部署。
docker 镜像加速CentOS7详细介绍
在Docker Hub官网上注册帐号,即可下载使用仓库里的全部的docker镜像。而因为网络原因,国内的开发者没办法流畅的下载镜像,经常会出现下载中断的错误。解决方法就是使用国内的容器Hub加速服务,本质就是更改pull优先级较高的服务器为国内的站点。
国内docker镜像加速站
阿里云
DaoCloud
灵雀云
操作系统: CentOS 7
docker版本: 1.9.1
DaoCloud加速
DaoCloud现在是提供一个一键脚本配置registry-mirror,然而对于上述环境是不起作用的。
执行docker守护服务的help命令,发现没有–registry-mirror这个选项,而是使用–add-registry选项。
具体命令如下:
--add-registry=[] Registry to query before a public one
--api-cors-header= Set CORS headers
in
the remote API
-b, --bridge= Attach containers to a network bridge
--bip= Specify network bridge IP
--block-registry=[] Don't contact given registry
--cluster-advertise= Address or interface name to advertise
--cluster-store= Set the cluster store
--cluster-store-opt=map[] Set cluster store options
--confirm-def-push=
true
Confirm a push to default registry
-D, --debug=
false
Enable debug mode
--default-gateway= Container default gateway IPv4 address
--default-gateway-v6= Container default gateway IPv6 address
--default-
ulimit
=[] Set default ulimits
for
containers
--disable-legacy-registry=
false
Do not contact legacy registries
--dns=[] DNS server to use
--dns-opt=[] DNS options to use
--dns-search=[] DNS search domains to use
-e, --
exec
-driver=native Exec driver to use
--
exec
-opt=[] Set
exec
driver options
--
exec
-root=
/var/run/docker
Root of the Docker execdriver
--fixed-cidr= IPv4 subnet
for
fixed IPs
--fixed-cidr-v6= IPv6 subnet
for
fixed IPs
-G, --group=docker Group
for
the unix socket
-g, --graph=
/var/lib/docker
Root of the Docker runtime
-H, --host=[] Daemon socket(s) to connect to
--help=
false
Print usage
--icc=
true
Enable inter-container communication
--insecure-registry=[] Enable insecure registry communication
--ip=0.0.0.0 Default IP when binding container ports
--ip-forward=
true
Enable net.ipv4.ip_forward
--ip-masq=
true
Enable IP masquerading
--iptables=
true
Enable addition of iptables rules
--ipv6=
false
Enable IPv6 networking
-l, --log-level=info Set the logging level
--label=[] Set key=value labels to the daemon
--log-driver=json-
file
Default driver
for
container logs
--log-opt=map[] Set log driver options
--mtu=0 Set the containers network MTU
-p, --pidfile=
/var/run/docker
.pid Path to use
for
daemon PID
file
--registry-mirror=[] Preferred Docker registry mirror
-s, --storage-driver= Storage driver to use
--selinux-enabled=
false
Enable selinux support
--storage-opt=[] Set storage driver options
--tls=
false
Use TLS; implied by --tlsverify
--tlscacert=~/.docker
/ca
.pem Trust certs signed only by this CA
--tlscert=~/.docker
/cert
.pem Path to TLS certificate
file
--tlskey=~/.docker
/key
.pem Path to TLS key
file
--tlsverify=
false
Use TLS and verify the remote
--userland-proxy=
true
Use userland proxy
for
loopback traffic
我们制作好镜像后,有时需要将镜像复制到另一台服务器使用。
能达到以上目的有两种方式,一种是上传镜像到仓库中(本地或公共仓库),但是另一台服务器很肯能只是与当前服务器局域网想通而没有公网的,所以如果使用仓库的方式,只能自己搭建私有仓库,这会在另一篇文章中介绍。
如果我们仅仅是要复制到另外少数的服务器,搭建私有仓库显然没有这个必要,而将镜像保存为文件上传到其他服务器再从文件中载入镜像也是一个不错的选择。
可以使用Docker save和Docker load命令来存储和载入镜像。
2、保存镜像为文件
如果要讲镜像保存为本地文件,可以使用Docker save命令。
命令格式: