1.1docker概要
一个容器就是宿主机的一个进程。对,就是个进程。原理方面不大懂,但是
看更多linux 进程 文件管理 网络 等方面应该会加深理解。namespace
+cgroup
(chroot
)
1.2安装docker
还是在linux上,win上建议别折腾。我这里是ubuntu,安装完docker你可以在容器里弄出个centos。里面在装docker,(不知道行不行的通。。)
配置需求uname -i
64位 uname -r
内核版本大于3.10
可以直接apt-get install docker.io
安装版本会比较低,不建议
ps aux |grep docker
root 705 0.0 2.2 361808 17152 ? Ssl 14:28 0:01 /usr/bin/docker -d
/usr/bin/docker -d //说明安装成功
卸载apt-get remove --purge docker.io
安装高版本(推荐) 把私有仓库添加apt-get
$ sudo su - root
apt-get -y installapt-transport-https
apt-keyadv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
bash -c "echo debhttps://get.docker.io/ubuntu docker main >/etc/apt/sources.list.d/docker.list"
apt-get update
apt-get -y install lxc-docker
docker -v //查看docker版本 Docker version 1.7.0-dev, build 5e06332
ps -ef | grep docker
root 17311 1 0 Feb13 ? 00:00:43 /usr/bin/docker -d
service docker
stop start restart
1.3 简单理解docker
镜像可以理解为一个目录,启动容器x的时候,chroot 到容器 x。
可以用docker info 查看。
cd var/lib/docker docker
安装所在目录的aufs/mnt/*
每个容器目录都在这里有root根
镜像目录
目录a-》容器a
目录b=》容器b
docker images
命令查看目前所有镜像,初始化的时候肯定是空的了啊。也就是说本地registry是空的。
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
1.4举个redis例子
我们可以从docker官方registry拉取镜像用docker pull
命令
docker pull redis:2.8.19
标识+tag(REPOSITORY:TAG
)(redis:2.8.19)就肯定是一个唯一镜像
下面run起来这个 redis。
eg1:sudo docker run -d redis
可以查看docker help run
-i-t 交互式容器就是直接进入,适合临时性任务
-d后台,守护氏容器,大多数需要守护石
-name 为容器指定一个名称
eg2:sudo docker run -it centos:6 /bin/bash
带入到虚拟容器中。exit
回到宿主机,退出当前容器.交互式容器需要 docker ps -a
选项看到。不加a看不到关闭的
如果没有指定tag,就使用默认latest分支(tag),如果没有指定命令,就使用默认命令(redis是/entrypoint.sh redis -server
)。守护石容器运行在后台,这样我们继续留在宿主机中
docker inspact【pid】
查看容器更详细信息,pid可根据docker ps[-a]
得到。
注意:在启动docker的时候,只能启动docker images里有的镜像,如果没有,会自动拉取。但是网速慢的话还是先停止,我们有下面的加速器。下载这个redis完全是看他还小点。。
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
redis 2.8.19 8c37ff647cf2 8 months ago 110.8 MB
启动为
root@tb:/home/tb# docker run -d redis:2.8.19
root@tb:/home/tb# docker inspect 6b24| grep IPAddress
"IPAddress": "172.17.0.1",
查看具体某一项 docker inspect imageid,返回的是json格式,可以gerp查看具体某一项啦。
利用之前的docker redis 里面就可以set get key啦。
========================================================================
2.1 docker的镜像与仓库
一些命令和概念拾遗:docker info
命令查看docker 的存储驱动及对应信息。docker images -af --no
(是否截断image id)-a显示中间层镜像 -q只是显示imageid
respository
仓库:一系列镜像的集合。里面包含一个个的镜像tag
镜像的标签:默认为latest,同一个镜像可以为不同标签registry
仓库,指的的docker镜像的存储仓库docker images redis
查看redis的仓库docker inspect pid
视察检查某个镜像中的容器信息docker rmi -f
强制删除镜像(imageid或者仓库名+tag)docker rm
-link <containerid>
2.2 拉取远程镜像
(可在https://hub.docker.com/注册 ,然后搜索:内有镜像评分和下载数量)
docker search -s 3 lnmp
docker pull domainer/centos-lnmp 这样会比较慢,推荐使用国内镜像加速
加速可参考:
https://dashboard.daocloud.io…
我是ubuntu 可以直接:
echo "DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=http://88c88c7c.m.daocloud.io\"" | sudo tee -a /etc/default/docker
然后重启docker
sudo service docker restart
比如我想要个swoole
的镜像。daocloud.io
的后台搜索 swoole
然后直接 docker pull betashepherd/docker-swoole:1.7.15-stable
docker push
上传docker镜像,2.3会展开说。
2.3在本地构件一个新的镜像
保存对容器修改,并再次使用。
软件形式打包,做分发。
docker commit
通过容器构件镜像
-a author
-m message
-p pause
具体就靠man
啦
演示我把本地的一个镜像推送到dockerhub上:
目前镜像
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
redis latest ff3dae0ffe3b 12 days ago 151.3 MB
daocloud.io/library/nginx 1.9.9 813e3731b203 3 weeks ago 133.9 MB
redis 2.8.19 8c37ff647cf2 8 months ago 110.8 MB
domainer/centos-lnmp latest 754c2ab8ffc8 11 months ago 574.9 MB
redis 2.8.9 e938c5d0ff85 14 months ago 110.8 MB
我们运行centos lnmp
docker run -it -p 80 --name tb_commit_test domainer/centos-lnmp /bin/bash
[root@12fb650b9296 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var
[root@12fb650b9296 /]# which nginx
/usr/sbin/nginx
成功后就进入了这个镜像
在这个容器装个szrz
吧,还是因为比较小。。
[root@12fb650b9296 /]# rz
bash: rz: command not found
[root@12fb650b9296 /]# yum install lrzsz -y
然后我们安装上了。rz
和sz
这两个兄弟
退出当前容器
[root@12fb650b9296 /]# exit
exit
root@tb:/home/tb#
docker ps -l
可以看到我们刚刚编辑的镜像
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
12fb650b9296 domainer/centos-lnmp "/bin/bash" 9 minutes ago Exited (0) 59 seconds ago tb
docker commit -a "tb" -m "rzsz" 12fb domainer/centos-lnmp
1799960f6ccafa9488f2ab17a1f1600601eb73187295fbe2c542603c5955d2e0
返回的id为新生成的镜像的id,可以通过
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
domainer/centos-lnmp latest 1799960f6cca 33 minutes ago 655.4 MB
因为上面的镜像我是从dockerhub
上下载的,安装了rzsz
后提交不上到daocloud,以为是**问题。下面我们重新拉取从国内的daocloud
,并修改,然后上传到自己的镜像到daocloud中
拉取:
docker pull nickistre/ubuntu-lamp
Pulling repository nickistre/ubuntu-lamp
5323e03e7da9: Pulling image (latest) from nickistre/ubuntu-lamp, mirror: http://624869e7.m.daocloud.io/v1/
5323e03e7da9: Pulling image (latest) from nickistre/ubuntu-lamp
上传到到daocloud:
daocloud上传镜像 (收费的,收费的,收费的。上传不上去说权限限制。)
docker login daocloud.io
输入用户名密码邮箱
然后…(如果你开通了这个服务的话)就上传成功 了。
那我们还是在在hubdocker上在实验下commit
和push
吧:
先pull一个nickistre/lamp的镜像,我们在上面安装一个nginx,然后上传上去。
root@tb:/home/tb# docker run -it -p 80 --name commit_test nickistre/ubuntu-lamp /bin/bash
root@f4cf34e4cac6:/# cat /etc/issue
Ubuntu 14.04.3 LTS \n \l
root@f4cf34e4cac6:/# which nginx
root@f4cf34e4cac6:/# which apache2
/usr/sbin/apache2
这次我们安装个nginx
apt-get install nginx
Reading package lists... Done
Building dependency tree
…
安装好后
root@f4cf34e4cac6:/# which nginx
/usr/sbin/nginx
root@f4cf34e4cac6:/#
然后我们在容器中启动nginx
root@f4cf34e4cac6:/# service nginx status
* nginx is not running
root@f4cf34e4cac6:/# service nginx start
root@f4cf34e4cac6:/# service nginx status
* nginx is running
好,我们切换到宿主机,运行docker ps
root@tb:/home/tb# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
f4cf34e4cac6 nickistre/ubuntu-lamp "/bin/bash" 6 minutes ago Up 6 minutes 0.0.0.0:32778->22/tcp, 0.0.0.0:32777->80/tcp, 0.0.0.0:32776->443/tcp commit_test
测试下看到80
端口对应是32776
root@tb:/home/tb# curl 127.0.0.1:32777
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
嗯,nginx没问题,把修改好的容器提交为镜像
docker commit f4cf34e4cac6 yaxiaomu/lnamp
详细信息可以这么写:实际操作我没写
-a 作者名字
-m 镜像信息
docker commit -a "yaxiaomu" -m "nginx" commit_test /yaxiaomu/commit_test
都会返回一个新生成的镜像id
这样就没问题了。下面我们将更改上传到dockerhub中,yaxiaomu是我的dockerhub用户名
root@tb:/home/tb# docker push yaxiaomu/lnamp
The push refers to a repository [yaxiaomu/lnamp] (len: 1)
Sending image list
Pushing repository yaxiaomu/lnamp (1 tags)
895b070402bd: Image already pushed, skipping
02e5bca4149b: Image already pushed, skipping
b2ae0a712b39: Image already pushed, skipping
af88597ec24b: Image already pushed, skipping
31ef599b27ee: Image successfully pushed
ee168b5cc455: Image successfully pushed
d348d7a11841: Image successfully pushed
c94ca54a3ff4: Image successfully pushed
ca7003051cdb: Image successfully pushed
c21876831405: Image successfully pushed
4ec68505f54c: Image successfully pushed
8b14247b8658: Image successfully pushed
4a5230b7de4e: Image successfully pushed
614789f7a3f4: Image successfully pushed
9d1e26045261: Image successfully pushed
62cde6caea01: Image successfully pushed
82bfdf8409e4: Image successfully pushed
8bac6635505b: Image successfully pushed
05133d17b3c0: Image successfully pushed
7f6d12e6d8c5: Image successfully pushed
aff2549596d0: Image successfully pushed
5323e03e7da9: Image successfully pushed
ece7b4d33c19: Image successfully pushed
Pushing tag for rev [ece7b4d33c19] on {https://cdn-registry-1.docker.io/v1/repositories/yaxiaomu/lnamp/tags/latest}
root@tb:/home/tb#
虽然很漫长,这样是成功了,感觉速度好慢。。
2.4我们用docker bulid dockerfile 文件构件镜像(简介~)
用Dockerfile
安装镜像DockerFile
文件,直白点就是包含了一系列命令的文本文件,他里面包含一些基本镜像(中间件镜像),一些docker命令脚本,
通过build
+参数的方式来构造镜像,build可以加载本地file,也可以加载远程file(如果网络不是问题的话)
这里列出个简单例子
先看dockerfile
的一个例子
# Memcached
#
# VERSION 1.0
# use the ubuntu base image provided by dotCloud
FROM ubuntu
# make sure the package repository is up to date
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
# install memcached
RUN apt-get install -y memcached
执行例子(注意自己配置Dockfle文件路径):
docker build -t yaxiaomu/ubuntu_memcache .
.代表是当前目录里有dockerfile 这个文件