简介

Docker是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制[1]。Docker利用Linux核心中的资源分脱机制,例如cgroups,以及Linux核心名字空间(name space),来创建独立的软件容器(containers)。这可以在单一Linux实体下运作,避免引导一个虚拟机造成的额外负担[2]。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、内存、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施,依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。”

安装(Centos中)

切换到root

1
yum -y install docker

启动

1
2
3
systemctl enable docker # 开机自动启动docker
systemctl start docker # 启动docker
systemctl restart docker # 重启dokcer

常用命令

1. 镜像(IMAGES)

1.1 获取镜像

1
2
3
docker pull NAME[:TAG]
例:
docker pull centos:latest

1.2 查看镜像信息

1
docker images # 列出本机上所有映像

1.3 搜索镜像

1
2
3
docker search ImageName
例:
docker search centos

1.4 删除镜像

1
docker rmi 标签/ID

1.5 保存镜像

1
docker save -o xxx.tar ImageName

1.6 读取镜像

1
2
docker load --input xxx.tar
docker load < xxx.tar

1.7 上传镜像

1
docker push ImageName

2. 容器(CONTAINER)

参数说明: -t 让Docker分配一个伪终端并绑定到容器的标准输入上 -i 让容器的标准输入保持打开

2.1 创建容器

1
docker create -it centos #创建一个基于centos镜像的容器

2.2 启动容器

1
2
docker start CONTAINERID
docker restart CONTAINERID #重启容器

2.3 新建并启动容器

1
2
docker run -it centos
docker run -it --name mycentos centos #指定容器名称为mycentos

2.4 守护态运行容器

1
docker run -d tomcat #后台运行tomcat镜像的容器

2.5 停止容器

1
2
docker stop CONTAINERID
docker kill CONTAINERID #强行停止

2.6 删除容器

1
docker rm CONTAINERID

2.7 进入容器

1
2
docker attach CONTAINER_NAME #通过容器名来进入容器 使用Ctrl+P Ctrl+Q来退出
docker exec -ti CONTAINERID /bin/bash #根据容器ID进入容器并启动bash

使用 NSENTER 进入容器 脚本:

1
2
3
4
#!/bin/bash
CNAME=$1
CPID=$(docker inspect --format "{{.State.Pid}}" $CNAME)
nsenter --target "$CPID" --mount --uts --ipc --net --pid

使用:

1
./in.sh CONTAINER_NAME/ID

2.8 查看容器

1
2
3
4
5
6
docker ps	 #列出正在运行的容器
docker ps -a #列出所有容器
docker ps -l #列出最新创建的容器
docker inspect CONTAINERID #列出容器的详细信息(JSON格式)
其中 inspect 可以使用 -format 参数指定显示JSON中的某项信息 例:
docker inspect -f "{{.State.Pid}}" c4a2097de5c1 #获取容器PID

2.9 设置容器名称

1
docker run -it --name mytomcat tomcat

3. 网络

1
2
docker run -d -P --name mytomcat tomcat
使用 -P (大写) 参数时,会将容器内端口映射到主机的随机端口上
1
2
3
docker run -d -p 80:8080 --name mytomcat tomcat
使用 -p (小写) 参数时,冒号(:)左边为主机端口,右边为容器端口 即
将容器的8080端口映射到主机的80端口上

4. 数据卷

1
2
3
4
docker run -d -P -v /home/ning/data:/data --name mytomcat tomcat
将 /home/ning/data映射到容器 /data 上
docker run -d -P -v /home/ning/data:/data:ro --name mytomcat tomcat
加上 :ro 参数 使容器/data 目录为只读
1
2
docker run -d -P -volumes-from mytomcat --name tom1 tomcat
tom1容器或mytomcat容器任何一方对/data目录的修改都会互相看到

5. 日志(LOGS)

1
2
3
4
5
docker logs [-f][-t][--tail] CONTAINER_NAME
-f --follows=true | false 默认false 是否一直跟踪日志变化并返回结果
-t --timestamps=true | false 默认false 是否在返回的结果上加上时间戳
--tail="all" 返回结尾处多少数量的日志;不指定默认返回所有日志
例: --tail 10 #只显示最新的10条日志

6. 查看容器进程

1
docker top CONTAINER_NAME/ID