前言
本文首先介绍 Docker 的整体概念,接着讲述 Docker 的基础用法,网上已经有很多好文章了,本文只是作学习记录使用。
Docker 引擎
Docker 引擎是一个客户端-服务端
组件,包括:
-
server
:守护进程的后台运行的程序(dockerd
命令) -
REST API
:定义客户端与守护进程交互的接口 -
CLI
:命令行界面(docker
命令)
CLI 使用 Docker REST API 来控制 Docker 守护进程。Docker 守护进程管理 Docker 的对象,包括:
- images(镜像)
- containers(容器)
- networks(网络)
- volumes(数据卷)
Docker 架构
Docker使用客户端-服务器
架构。Docker 客户端与守护进程交互,是操作容器的主要部件。Docker 客户端与守护进程可以运行在同一台机器上,你也可以通过客户端连接到远程的 Docker 守护进程。
Docker 对象
在你使用 Docker 时,你主要的工作就是创建和使用镜像
、容器
、网络
、数据卷
、插件
和其它对象。
IMAGES(镜像)
包含创建Docker容器的只读模板
。一个镜像经常会基于其它镜像。创建自己的镜像时,你可以使用Dockerfile
。Dockerfile的语法很简洁,能够定义创建和运行容器的必要步骤。Dockerfile中的每一条指令,都会在生成的镜像中创建一个layer
。
CONTAINERS(容器)
镜像的运行实例。你可以通过 Docker API和CLI,来create, run, stop, move, or delete
一个容器。
底层技术
Docker是使用Go
语言编写,并利用了Linux内核
的几个功能。
Namespaces
Docker通过一项名为namespaces
的技术,来为容器提供隔离的工作环境。当你运行一个容器,Docker会为该容器创建一系列的namespaces。
Docker Engine uses namespaces such as the following on Linux:
- The pid namespace: Process isolation (PID: Process ID).
- The net namespace: Managing network interfaces (NET: Networking).
- The ipc namespace: Managing access to IPC resources (IPC: InterProcess Communication).
- The mnt namespace: Managing filesystem mount points (MNT: Mount).
- The uts namespace: Isolating kernel and version identifiers. (UTS: Unix Timesharing System).
Control groups
cgroups
限制应用程序所使用的资源。
Union file systems
UnionFS
容器的物理界限。
Container format
Docker Engine combines the namespaces, control groups, and UnionFS into a wrapper called a container format. The default container format is libcontainer
.
基本操作
安装Docker请查看官方文档,写得最详细!
启动Docker守护进程
service docker start
后台进程:
[root@localhost ~]# ps -ef | grep docker
root 89967 1 0 07:07 ? 00:00:00 /usr/bin/dockerd
root 89970 89967 0 07:07 ? 00:00:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc
关闭Docker守护进程
service docker stop
搜索镜像
docker search ubuntu
其中:
- REPOSITORY:仓库名称
- TAG:标签名,一个仓库可以有若干个标签对应不同的镜像,默认都是latest
- IMAGE ID:镜像ID
- CREATED:创建时间,注意不是本地的pull时间
- SIZE:镜像大小
获取镜像
docker pull ubuntu
查看镜像
docker images
结果:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ebcd9d4fca80 5 days ago 118 MB
创建镜像
在某个目录常见Dockerfile
文件,并加入以下内容:
from ubuntu:latest
ENV HOSTNAME=yano
这个 Dockerfile 中只有两行,第一行表示基于哪个镜像创建新的镜像,类似于程序开发中的 import 或 include,我们这里以 ubuntu:latest 镜像为基础创建新的镜像。第二行是在新的镜像中我们要对基础镜像 ubuntu:latest 做的改变。这句是设置一个环境变量HOSTNAME等于yano。
使用 docker build
命令进行构建:
docker build -t yano .
这个命令中第一个参数 -t yano
指定创建的新镜像的名字,第二个参数是一个点 . 指定从当前目录查找 Dockerfile 文件。
结果:
Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM ubuntu:latest
---> ebcd9d4fca80
Step 2/2 : ENV HOSTNAME yano
---> Running in b12cfea16a9f
---> 5263b155fb36
Removing intermediate container b12cfea16a9f
Successfully built 5263b155fb36
查看镜像:
查看 Docker 容器或镜像的一些内部信息
docker inspect ubuntu
创建容器
docker run -t -i --name ubuntu ubuntu /bin/bash
我们看到,第一行还是本机的centos
,下一行已经进入了Docker的运行环境,已经是Ubuntu
了。
上面命令的说明:
- -t:分配一个 pseudo-TTY
- -i:--interactive参数缩写,表示交互模式,如果没有 attach 保持 STDIN 打开状态
- ubuntu:运行的镜像名称,默认为latest 标签
- /bin/bash:容器中运行的应用
如何退出这个bash
?有两种方法,两种方法的效果完全不同:
- 直接 exit,这时候 bash 程序终止,容器进入到停止状态
- 使用组合键退出,仍然保持容器运行,我们可以随时回来到这个bash中来,组合键是
Ctrl-p Ctrl-q
,你没有看错,是两组组合键,先同时按下Ctrl和p,再按Ctrl和q。就可以退出到我们的宿主机了。
查看正在运行的容器
docker ps
结果:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef767fad251c ubuntu "/bin/bash" 3 minutes ago Up 3 minutes ubuntu
几个最常用的参数:
- -a:查看所有容器,含停止运行的
- -l:查看刚启动的容器
- -q:只显示容器ID
停止容器
docker stop ef
注:CONTAINER ID只要写到能够标识出是哪个容器即可,不用写出全名。
启动容器
docker start ef
查看容器中运行的进程信息
docker top ubuntu
查看容器中运行的进程信息,显示容器中进程的PID,UID,PPID,时间,tty等信息。结果:
UID PID PPID C STIME TTY TIME CMD
root 90338 90326 0 07:35 pts/1 00:00:00 /bin/bash
删除容器
docker rm -f ubuntu
其中ubuntu
是容器的名字,不是镜像的名字。
删除镜像
docker rmi yano
连接到容器中
docker attach ubuntu
容器导出
docker export 3b > ./ubuntu.tar
当容器导出后,容器仍然在Docker环境中运行,只是拷贝了一份内容到tar包。
容器导入
将该文件加载到docker系统中,文件加载后会成为镜像,命令执行时需要制定导入后生成的镜像的名字:
cat ubuntu.tar | docker import - ubuntu:2.0
结语
对于数据卷等内容,稍后再介绍,本文只是简单记录下Docker最基本的用法。