1.1docker概要

一个容器就是宿主机的一个进程。对,就是个进程。原理方面不大懂,但是
看更多linux 进程 文件管理 网络 等方面应该会加深理解。namespace+cgroupchroot

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

然后我们安装上了。rzsz这两个兄弟

退出当前容器

[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上在实验下commitpush吧:

先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 这个文件

更多Dockerfile参数
dockerfile安装实例
稍微深入一下docker
镜像加速201804更新


牙小木木
1.5k 声望80 粉丝

iamtb.cn