@Yano
2017-05-21T21:02:21.000000Z
字数 3859
阅读 3428
简书
本文首先介绍 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容器的只读模板
。一个镜像经常会基于其它镜像。创建自己的镜像时,你可以使用Dockerfile
。Dockerfile的语法很简洁,能够定义创建和运行容器的必要步骤。Dockerfile中的每一条指令,都会在生成的镜像中创建一个layer
。
镜像的运行实例。你可以通过 Docker API和CLI,来create, run, stop, move, or delete
一个容器。
Docker是使用Go
语言编写,并利用了Linux内核
的几个功能。
Docker通过一项名为namespaces
的技术,来为容器提供隔离的工作环境。当你运行一个容器,Docker会为该容器创建一系列的namespaces。
Docker Engine uses namespaces such as the following on Linux:
cgroups
限制应用程序所使用的资源。
UnionFS
容器的物理界限。
Docker Engine combines the namespaces, control groups, and UnionFS into a wrapper called a container format. The default container format is libcontainer
.
安装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
service docker stop
docker search ubuntu
其中:
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 inspect ubuntu
docker run -t -i --name ubuntu ubuntu /bin/bash
我们看到,第一行还是本机的centos
,下一行已经进入了Docker的运行环境,已经是Ubuntu
了。
上面命令的说明:
如何退出这个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
几个最常用的参数:
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最基本的用法。