docker使用笔记node
authorization:胡湘林python
email: a714585725@qq.comgit
一、安装dockergithub
CentOS6web
对于 CentOS6,可使用 EPEL 库安装 Docker,命令以下docker
yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm yum install docker-io
CentOS7数据库
CentOS7 系统 CentOS-Extras 库中已带 Docker,能够直接安装:ubuntu
yum install dockercentos
安装以后启动 Docker 服务,并让它随系统启动自动加载。bash
service docker start chkconfig docker on
二、获取镜像
可使用 docker pull 命令来从仓库获取所须要的镜像。
下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操做系统的镜像。
$ sudo docker pull ubuntu:12.04 Pulling repository ubuntu ab8e2728644c: Pulling dependent layers 511136ea3c5a: Download complete 5f0ffaa9455e: Download complete a300658979be: Download complete 904483ae0c30: Download complete ffdaafd1ca50: Download complete d047ae21eeaf: Download complete
下载过程当中,会输出获取镜像的每一层信息。
该命令实际上至关于 $ sudo docker pull registry.hub.docker.com/ubuntu:12.04 命令,即从注册服务器 registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。
有时候官方仓库注册服务器下载较慢,能够从其余仓库下载。 从其它仓库下载时须要指定完整的仓库注册服务器地址。例如
$ sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04 Pulling dl.dockerpool.com:5000/ubuntu ab8e2728644c: Pulling dependent layers 511136ea3c5a: Download complete 5f0ffaa9455e: Download complete a300658979be: Download complete 904483ae0c30: Download complete ffdaafd1ca50: Download complete d047ae21eeaf: Download complete
完成后,便可随时使用该镜像了,例如建立一个容器,让其中运行 bash 应用。
三、列出镜像列表
使用 docker p_w_picpaths 显示本地已有的镜像。
$ sudo docker p_w_picpaths REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 12.04 74fe38d11401 4 weeks ago 209.6 MB ubuntu precise 74fe38d11401 4 weeks ago 209.6 MB ubuntu 14.04 99ec81b80c55 4 weeks ago 266 MB ubuntu latest 99ec81b80c55 4 weeks ago 266 MB ubuntu trusty 99ec81b80c55 4 weeks ago 266 MB ...
在列出信息中,能够看到几个字段信息
来自于哪一个仓库,好比 ubuntu
镜像的标记,好比 14.04
它的 ID 号(惟一)
建立时间
镜像大小
其中镜像的 ID 惟一标识了镜像,注意到 ubuntu:14.04 和 ubuntu:trusty 具备相同的镜像 ID,说明它们其实是同一镜像。
TAG 信息用来标记来自同一个仓库的不一样镜像。例如 ubuntu 仓库中有多个镜像,经过 TAG 信息来区分发行版本,例如 10.0四、12.0四、12.十、13.0四、14.04 等。
四、启动容器
docker run -t -i centos:latest /bin/bash
若是不指定具体的标记,则默认使用 latest 标记信息。
五、容器基本使用
容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause] 容器操做运维 — docker [ps|inspect|top|attach|events|logs|wait|export|port] 容器rootfs命令 — docker [commit|cp|diff] 镜像仓库 — docker [login|pull|push|search] 本地镜像管理 — docker [p_w_picpaths|rmi|tag|build|history|save|import] 其余命令 — docker [info|version]
容器生命周期管理
# 在容器中运行"echo"命令,输出"hello word" $docker run p_w_picpath_name echo "hello word" # 交互式进入容器中 $docker run -i -t p_w_picpath_name /bin/bash # 在容器中安装新的程序 $docker run p_w_picpath_name yum install -y app_name #使容器在守护态运行 docker run -d -i -t p_w_picpath_name /bin/bash #使容器在运行时绑定特定端口 容器中能够运行一些网络应用,要让外部也能够访问这些应用,能够经过 -P 或 -p 参数来指定端口映射。 当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。 docker run -d -P training/webapp python app.py docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse -p(小写的)则能够指定要映射的端口,而且,在一个指定端口上只能够绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。 映射全部接口地址 使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,能够执行 docker run -d -p 5000:5000 training/webapp python app.py 此时默认会绑定本地全部接口上的全部地址。 映射到指定地址的指定端口 可使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,好比 localhost 地址 127.0.0.1 docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py 映射到指定地址的任意端口 使用 ip::containerPort 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。 docker run -d -p 127.0.0.1::5000 training/webapp python app.py 还可使用 udp 标记来指定 udp 端口 docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py 查看映射端口配置 使用 docker port 来查看当前映射的端口配置,也能够查看到绑定的地址 docker port nostalgic_morse 5000 127.0.0.1:49155. 注意: 容器有本身的内部网络和 ip 地址(使用 docker inspect 能够获取全部的变量,Docker 还能够有一个可变的网络配置。) -p 标记能够屡次使用来绑定多个端口 例如 docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py #启动/重启容器和关闭容器 启动一个关闭的容器:docker start CONTAINER_ID 重启一个容器:docker restart CONTAINER_ID 关闭一个容器:docker stop CONTAINER_ID或者docker kill CONTAINER_ID强制关闭一个容器 删除一个容器:docker rm -f CONTAINER_ID 删除全部容器:docker rm `docker ps -a -q` 暂停/恢复一个容器的全部进程:docker pause/unpause
容器操做运维
#查看容器运行状态 docker ps -a #查看全部容器的状态 docker ps -a -q #列出全部容器列表 docker inspect CONTAINER_ID #检查镜像或者容器的参数,默认返回 JSON 格式。 docker top CONTAINER_ID #查询某个容器的进程运行状况 docker attach CONTAINER_ID #接入某个正在运行的docker容器中进行操做(重点:退出的时候不能使用ctrl+d或者exit方式,这将会致使容器中止运行,退出时应使用ctrl+p,而后再使用ctrl+q) docker events --since=20151118 #查看直到指定日期容器的实时系统事件 docker logs CONTAINER_ID #批量打印出容器中进程的运行日志 docker wait CONTAINER_ID #阻塞一个容器,直到该容器中止(PS:目前不知道咋用) docker export CONTAINER_ID > /directory/container.tar #(保存当前某个容器的状态信息),导入可以使用cat /directory/container.tar |docker import - CONTAINER_NAME:tag docker save IMAGE_NAME >/directory/p_w_picpath_name.tar #(将某个镜像导出),导入可以使用docker load < /directory/p_w_picpath_name.tar 这两个之间的区别以下: 导出后再导入(exported-imported)的镜像会丢失全部的历史,而保存后再加载(saveed-loaded)的镜像没有丢失历史的层(layer)。这意味着使用导出后再导入的方式,你将没法回滚到以前的层(layer),同时,使用保存后再加载的方式持久化整个镜像,就能够作到层回滚(能够执行docker tag <LAYER ID> <IMAGE NAME>来回滚以前的层)。 docker port CONTAINER_ID #列出某个容器和宿主机之间的端口映射关系
容器rootfs命令
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] $ sudo docker ps ID IMAGE COMMAND CREATED STATUS PORTS c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours 197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours $ docker commit c3f279d17e0a SvenDowideit/testp_w_picpath:version3 f5283438590d $ docker p_w_picpaths | head REPOSITORY TAG ID CREATED VIRTUAL SIZE SvenDowideit/testp_w_picpath version3 f5283438590d 16 seconds ago 335.7 MB 使用说明: 这个命令的用处在于把有修改的container提交成新的Image,而后导出此Imange分发给其余场景中调试使用。Docker官方的建议是,当你在调试完Image的问题后,应该写一个新的Dockerfile文件来维护此Image。commit命令仅是一个临时建立Image的辅助命令。 docker cp CONTAINER:PATH HOSTPATH 使用说明: 使用cp能够把容器內的文件复制到Host主机上。这个命令在开发者开发应用的场景下,会须要把运行程序产生的结果复制出来的需求,在这个状况下就可使用这个cp命令。 docker diff CONTAINER 例子: $ sudo docker diff 7bb0e258aefe C /dev A /dev/kmsg C /etc A /etc/mtab A /go A /go/src A /go/src/github.com A /go/src/github.com/dotcloud .... 使用说明: diff会列出3种容器内文件状态变化(A - Add, D - Delete, C - Change )的列表清单。构建Image的过程当中须要的调试指令。
镜像仓库
docker [login|pull|push|search] 首先须要一个存放共享镜像的地方,在企业环境可使用私有的镜像仓库,但为了方便起见,咱们直接使用Docker的公共仓库。首先须要在Docker Hub注册一个用户,而后使用 docker login 命令登录到仓库服务器。 docker login Username: xxxxxx Password: Email: xxxxxx@******.com Login Succeeded 而后咱们须要将本地修改过的容器使用 docker commit 命令生成一个本地的镜像。注意,因为以后须要将镜像提交至Docker Hub,这里镜像的名字必须以本身的Docker Hub用户名做为前缀,不然在后面的 push 时候会遇到 403 “Access Denied: Not allowed to create Repo at given location” 错误。例如名为 linfan/employees。 docker commit node-app linfan/employees a4281aa8baf9aee1173509b30b26b17fd1bb2de62d4d90fa31b86779dd15109b docker p_w_picpaths REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE linfan/employees latest a4281aa8baf9 14 seconds ago 696.2 MB 最后,使用 docker push 命令将这个准备好的镜像提交到Docker Hub仓库中。 docker push linfan/employees The push refers to a repository [linfan/employees] (len: 1) Sending p_w_picpath list ... Pushing tag for rev [5577d6743652] on {https://cdn-registry-1.docker.io/v1/repositories/linfan/employees/tags/latest} 提交完成后,在其余节点就可使用 docker pull 命令获取到这个镜像了。 注意:严格来讲,将数据库服务容器经过Docker Link暴露给应用服务容器的方法并不符合分布式应用的12条准则,由于经过Docker Link链接的两个容器必须运行在同一个物理主机上,数据与应用不能在集群中分别独立的部署或横向扩展。 search 使用方法: docker search TERM 使用说明: 经过关键字搜索分享的Image。
本地镜像管理
docker p_w_picpaths #列出全部的镜像 docker rmi p_w_picpath [p_w_picpath...] #删除镜像 docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
使用说明: 组合使用用户名,Image名字,标签名来组织管理Image。 docker build -t edwardsbean/centos6-jdk1.7 . Dockerfile用来建立一个自定义的p_w_picpath,包含了用户指定的软件依赖等。当前目录下包含Dockerfile,使用命令build来建立新的p_w_picpath,并命名为edwardsbean/centos6-jdk1.7: (Dockerfile书写比较重要,须要重点学习) docker history p_w_picpath #列出某个镜像以前作过的操做 docker save IMAGE_NAME >/directory/p_w_picpath_name.tar #(将某个镜像导出),导入可以使用docker load < /directory/p_w_picpath_name.tar docker export CONTAINER_ID > /directory/container.tar #(保存当前某个容器的状态信息),导入可以使用cat /directory/container.tar |docker import - CONTAINER_NAME:tag
其余命令
docker [info|version] docker info #结合docker vesion一块儿,能够随时使用这个命令把本地的配置信息提供出来,方便Docker的开发者快速定位问题。 docker version #显示Docker的版本号,API版本号,Git commit, Docker客户端和后台进程的Go版本号。