简介
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker架构
Docker包含三个概念:镜像、容器、仓库。Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
- 镜像:Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器:镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库:仓库可看成一个代码控制中心,用来保存镜像。
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
Docker安装
Ubuntu、Debian、CentOs、Windows、MacOs
Docker使用
Hello Word
runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
解释:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo “Hello world”,然后输出结果。
- docker: Docker 的二进制执行文件。
- run: 与前面的 docker 组合来运行一个容器。
- ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo “Hello world”: 在启动的容器里执行的命令
runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash
root@0123ce188bd8:/#
运行交互式容器
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
root@0123ce188bd8:/# exit
exit
root@runoob:~#
退出容器
runoob@runoob:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63 # 容器ID
启动后台模式
runoob@runoob:~$ docker ps
CONTAINER ID IMAGE COMMAND ...
5917eac21c36 ubuntu:15.10 "/bin/sh -c 'while t…" ...
docker ps可以查看容器运行情况
- CONTAINER ID: 容器 ID。
- IMAGE: 使用的镜像。
- COMMAND: 启动容器时运行的命令。
- CREATED: 容器的创建时间。
- STATUS: 容器状态。
- created(已创建)
- restarting(重启中)
- running 或 Up(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
- PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
- NAMES: 自动分配的容器名称。
runoob@runoob:~$ docker logs 2b1b7a428627
查看容器内标准输出
docker stop 2b1b7a428627 # 容器ID
停止容器
Dockers容器使用
- 可以直接输入docker查看命令
- docker command --help查看使用方法
- docker pull ubuntu:本地没有ubuntu镜像,可以通过这个命令载入镜像
- docker run -it ubuntu /bin/bash:启动镜像
- exit:退出
- docker ps -a:查看所有容器
- docker attach 容器ID:退出容器会停止
- docker exec 容器ID: 退出容器不会停止
- docker export 1e560fca3906 > ubuntu.tar :导出容器快照到本地文件 ubuntu.tar
- cat docker/ubuntu.tar | docker import - test/ubuntu:v1:将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1
- docker import http://example.com/exampleimage.tgz example/imagerepo:通过指定 URL 或者某个目录来导入
- docker container prune:清理所有终止的容器
- sudo usermod -aG docker you-user:将用户添加到 docker 用户组中,以便该用户能够执行 Docker 相关的命令,而无需使用 root 权限。
运行一个web程序
docker pull training/webapp # 载入镜像
docker run -d -P training/webapp python app.py
docker run -d -p 5000:5000 training/webapp python app.py # 容器内部的 5000 端口映射到我们本地主机的 5000 端口
- -d:让容器在后台运行。
- -P:将容器内部使用的网络端口随机映射到我们使用的主机上。
docker port bf08b7f2cd89 # 查看容器的某个确定端口映射到宿主机的端口号
docker logs -f bf08b7f2cd89 # 查看web应用程序日志
docker top wizardly_chandrasekhar # 查看容器内部运行的进程
查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
docker inspect wizardly_chandrasekhar
[
{
"Id": "bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85",
"Created": "2018-09-17T01:41:26.174228707Z",
"Path": "python",
"Args": [
"app.py"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 23245,
"ExitCode": 0,
"Error": "",
"StartedAt": "2018-09-17T01:41:26.494185806Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
......
# 重启
docker stop wizardly_chandrasekhar
docker start wizardly_chandrasekhar
docker restart wizardly_chandrasekhar
docker rm wizardly_chandrasekhar # 移除容器必须先停止