Docker 是什么?
一、什么是Docker?
1. Docker 的定义
Docker 是一个开源的应用容器引擎,可以轻松为应用创建一个轻量级、可移植、与外界隔离的容器。
Docker 本身并不是一个容器系统,而是一个基于原有的容器化工具 LXC(Linux Container)
用来创建虚拟环境的工具。类似 LXC 的工具已经在生产环境中使用多年,Docker 则基于此提供了更加友好的镜像管理工具和部署工具。
简单的来说:Docker 是容器管理工具。
2. Docker 和虚拟机的区别
VM 和 Docker 的框架,直观上来讲 VM 多了一层 Guest OS ,同时Hypervisor会对硬件资源进行虚拟化,Docker 是直接使用硬件资源,所以 VM 的资源利用率相对 Docker 低也是比较容易理解的。
Docker 具有更多的服务能力,是利用宿主机的系统内核,所以可以做到在几秒中之内创建大量的容器。VM 启动一个虚拟机少则几十秒,多则几分钟。
Docker 的能力:
- 极其轻量:只打包必要的bins/libs。
- 秒级部署:根据镜像的不同,容器的部署大概在毫秒和秒之间。
- 易于移植:一次构建,多次部署。
- 弹性伸缩:Kubernetes、Swam、Mesos这类开源、方便、好使的容器管理平台有着非常强大的弹性管理能力。
3. Docker 组成部分
- Docker Client 客户端
- Docker Daemon 守护进程
- Docker Image 镜像
- Docker Container 容器
- Docker Registry 仓库
4. Docker核心概念
Docker Image 镜像
镜像就是一个自读模板
例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了tomcat或者用户需要的其他应用程序。
镜像可以用来创建Docker容器。
Docker Container 容器
Docker 利用容器来运行应用。
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。
每个容器都是相互隔离的,保证安全的平台。
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程控件、用户空间和网络空间等等,和运行在其中的应用程序)。
注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。(写时复制,所有操作都是在可写层进行操作)
Docker Registry 仓库
仓库就是集中存放镜像文件的场所。
二、Docker 的安装和常规操作
1. Docker 的安装
Mac OS 参考菜鸟教程就有了MacOS Docker 安装
2. Hello World案例
打开终端,然后输入命令查看Docker是否正常运行。
> docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:fc6a51919cfeb2e6763f62b6d9e8815acbf7cd2e476ea353743570610737b752
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
docker run
命令,运行指定的镜像,如果镜像不在主机系统上,它会尝试从默认的Docker仓库中下载镜像。
3. Docker 镜像常用操作
查看本地镜像列表
# 命令
docker images
查找远端仓库镜像
# 命令
docker search
# 例子
docker search hello-world
获取镜像
# 命令
docker pull <域名>//:
# 例子
docker pull hello-world
查看镜像信息
# 命令
docker inspect
# 例子
docker inspect 7465ad228696
删除镜像
# 命令
docker rmi :
# 例子
docker rmi hello-world
创建镜像
# 命令
docker commit
# 例子
docker commit -a "potato" -m "test commit" 96cc3a4d3b68 hello-potato
参数说明:
-a
,--author:作者信息 -m
;--meassage:提交消息;-p
,--pause=true:提交时暂停容器运行。
说明:
基于已有的镜像的容器进行创建。
迁出镜像
# 命令
docker save -o .tar :
载入镜像
# 命令
docker load --input .tar 或者 docker load .tar
上传镜像
# 命令
docker push <域名>//:
4. Docker 容器常用操作
创建容器
Docker 的容器十分的轻量级,用户可以随时创建或者删除容器。
# 命令
docker create
# 例子
docker create ubuntu
说明:
使用 docker create 命令创建的容器处于停止状态,可以使用 docker start 命令启动它。
创建并启动容器
# 命令
docker run
# 例子
docker run ubuntu
说明:
等价于先执行 docker create 命令,再执行 docker start 命令。
docker run背后的故事:
- 检查本地是否存在镜像,不存在就从 Docker Hub 仓库下载。
- 利用本地镜像创建一个容器。
- 分配一个文件系统,并在只读的镜像层外面挂载一个可读写层。
- 从宿主机配置的网桥接口桥接一个虚拟接口到容器中去。
- 从地址池配置一个ip地址给容器。
- 执行用户的制定用户程序。
- 执行完毕后容器被终止。
例如:
创建ubuntu容器后,打印'hello'。
docker run ubuntu /bin/echo 'hello'
操作运行的容器
docker run -it ubuntu /bin/bash
-t
:让 docker 分配一个伪终端并绑定到容器的标准输入。
-i
:让容器的标准输入保持打开。
在交互模式下,用户可以通过所创建的终端来输入命令,exit命令退出容器。
退出后,容器自动处于终止状态。
守护态运行容器:
更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d
参数来实现。
举个例子:
如果不使用 -d 参数运行容器。
docker run ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world
容器会把输出的结果打印到宿主机上面。
如果使用 -d 参数运行容器。
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
此时容器会在后台运行并不会把输出的结果打印到宿主机上面。(输出结果可以用 docker logs
查看)
终止容器
可以使用dockerstop命令来终止一个运行中的容器。
# 命令
docker stop
注意:
- 当容器中的应用终结时,容器也会自动停止。
- 查看所有的容器:
docker ps -a
- 查看运行的容器:
docker ps
- 重新启动容器:
docker start
进入容器
在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息。
# 命令
docker exec
# 例子
docker exec -it 96cc3a4d3b68 bash
Exec可以直接在容器内部运行命令。
删除容器
可以使用 docker rm 命令删除终止状态的容器。
如果删除正在运行的容器,可以使用 docker rm –f 命令。
# 命令
docker rm
docker rm -f
# 例子
docker rm 96cc3a4d3b68
docker rm -f 96cc3a4d3b68
导入和导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管容器是否处于运行状态。可以使用 docker export 命令。
# 命令
docker export >
# 例子
docker export 96cc3a4d3b68 > hello.tar
导出的文件又可以使用 docker import 命令导入,成为镜像。
cat hello.tar | docker import - hello:laster
三、介绍总结
1. Docker 是容器管理工具。
2. Docker 的组成部分。
- Docker Client 客户端
- Docker Daemon 守护进程
- Docker Image 镜像
- Docker Container 容器
- Docker Registry 仓库
3. Docker 的镜像操作。
功能 | 命令 | 例子 |
---|---|---|
查看本地镜像列表 | docker images | docker images |
查找远端仓库镜像 | docker search |
docker search hello-world |
获取镜像 | docker pull <域名>/ |
docker pull hello-world |
查看镜像信息 | docker inspect |
docker inspect 7465ad228696 |
删除镜像 | docker rmi |
docker rmi hello-world |
4. Docker 的容器操作。
功能 | 命令 | 例子 |
---|---|---|
创建容器 | docker create | docker create ubuntu |
创建并启动容器 | docker run |
docker run ubuntu |
终止容器 | docker stop |
docker stop 7465ad228696 |
进入容器 | docker exec |
docker exec -it 7465ad228696 bash |
删除容器 | docker rm |
docker rm 7465ad228696 |
导出容器 | docker export |
docker export 96cc3a4d3b68 > hello.tar |
导入容器 | docker import | - |