docker使用笔记
authorization:胡湘林
email: a714585725@qq.com
1、安装docker
CentOS6
对于 CentOS6,可以使用 EPEL 库安装 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,可以直接安装:
yum install docker
安装之后启动 Docker 服务,并让它随系统启动自动加载。
service docker start chkconfig docker on
2、获取镜像
可以使用 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 应用。
3、列出镜像列表
使用 docker images 显示本地已有的镜像。
$ sudo docker images 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.04、12.04、12.10、13.04、14.04 等。
4、启动容器
docker run -t -i centos:latest /bin/bash
如果不指定具体的标记,则默认使用 latest 标记信息。
5、容器基本使用
容器生命周期管理 — 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 [images|rmi|tag|build|history|save|import] 其他命令 — docker [info|version]
容器生命周期管理
# 在容器中运行"echo"命令,输出"hello word" $docker run image_name echo "hello word" # 交互式进入容器中 $docker run -i -t image_name /bin/bash # 在容器中安装新的程序 $docker run image_name yum install -y app_name #使容器在守护态运行 docker run -d -i -t image_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/image_name.tar #(将某个镜像导出),导入可使用docker load < /directory/image_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/testimage:version3 f5283438590d $ docker images | head REPOSITORY TAG ID CREATED VIRTUAL SIZE SvenDowideit/testimage 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 images 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 image 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 images #列出所有的镜像 docker rmi image [image...] #删除镜像 docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
使用说明: 组合使用用户名,Image名字,标签名来组织管理Image。 docker build -t edwardsbean/centos6-jdk1.7 . Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等。当前目录下包含Dockerfile,使用命令build来创建新的image,并命名为edwardsbean/centos6-jdk1.7: (Dockerfile书写比较重要,需要重点学习) docker history image #列出某个镜像之前做过的操作 docker save IMAGE_NAME >/directory/image_name.tar #(将某个镜像导出),导入可使用docker load < /directory/image_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版本号。
本文出自 “柠檬” 博客,请务必保留此出处http://xianglinhu.blog.51cto.com/5787032/1717512
原文地址:http://xianglinhu.blog.51cto.com/5787032/1717512