1、Docker架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
- Docker 客户端(Client) : Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
- Docker 主机(Host) :一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
2、Docker安装
安装略
安装完成后启动docker:
sudo systemctl start docker
测试是否启动成功:
3、仓库配置
国内从 DockerHub 拉取镜像有时会特别慢,此时可以配置镜像加速器。
Docker 官方和国内很多云服务商都提供了国内加速器服务,比如:
- 阿里云的加速器:https://help.aliyun.com/document_detail/60750.html
- 网易加速器:http://hub-mirror.c.163.com
- Docker官方中国加速器:https://registry.docker-cn.com
- ustc 的镜像:https://docker.mirrors.ustc.edu.cn
- daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用)
配置国内加速器镜像:
在/etc/docker/daemon.json文件(如果文件不存在则需要新建)添加如下配置:
{
"registry-mirrors":["http://hub-mirror.c.163.com"]
}
然后重新启动服务:
systemctl daemon-reload
systemctl restart docker
4、镜像查看和拉取
4.1 查询镜像:hello-world
docker search hello-world
4.2 拉取镜像:hello-world
docker pull hello-world:latest
4.3 查看本地仓库已经pull下的镜像
4.4 运行镜像:hello-world
docker run hello-world
注意:如果在没有镜像的时候直接docker run hello-world也是可以的;它会先检查本地是否有这个镜像,没有的话会先从指定仓库中拉取。
5、容器实例-Ubuntu
5.1 从ubuntu镜像中输出hello world
Docker 允许在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。这里同样是个Hello World,不同在于它是在容器内部运行的。
docker run ubuntu:latest /bin/echo "hello world"
各个参数的含义:
- docker: Docker 的二进制执行文件。
- run: 与前面的 docker 组合来运行一个容器。
- ubuntu:latest 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo "Hello world": 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 ubuntu 最新的(默认是latest) 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
5.2 运行交互式的容器
通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力。
docker run -i -t ubuntu:latest
echo 'hello world'
参数解析:
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
运行 exit 命令或者使用 CTRL+D 来退出容器
5.3 运行容器至后台模式
查看正在运行的容器:
docker container ls
docker ps
显示5.2中执行的程序不在容器中执行,目前没有正则执行的镜像。
需要-d参数,来让容器实例在后台运行:
docker run -d ubuntu:latest /bin/sh -c "while true; do echo hello world; sleep 1; done"
在输出中,没有看到期望的 "hello world",而是一串长字符,这个长字符串叫做容器 ID,对每个容器来说都是唯一的,可以通过容器 ID 来查看对应的容器发生了什么。
再次通过docker ps 来查看目前是否有正在执行的容器:
输出详情介绍:
- CONTAINER ID: 容器 ID。
- IMAGE: 使用的镜像。
- COMMAND: 启动容器时运行的命令。
- CREATED: 容器的创建时间。
- STATUS: 容器状态(状态有7种)。created(已创建)、restarting(重启中)、 running(运行中)、 removing(迁移中)、 paused(暂停)、 exited(停止)、 dead(死亡)
- PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
- NAMES: 自动分配的容器名称。
通过docker logs 命令,查看指定容器内的标准输出:
docker logs 187ec8cbe5b1
关闭正在启动的容器:
docker stop 187ec8cbe5b1