docker是目前最流行的虚拟化技术。
本篇文章主要介绍docker的基本概念以及初步尝试使用docker技术。
docker是什么
Docker 属于 Linux容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker将应用程序与该程序的依赖,打包在一个文件里面。只要运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。
docker好在哪
- 更高效的利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 容易迁移、维护和扩展
docker专有名词
- 镜像,image, 包括各种环境的定义和说明。
- 容器,container, 是一个镜像的运行实体,不同容器之间是相互隔离的。
- 仓库,镜像的仓库,用于用户发布自己的镜像或者查找自己需要的镜像,目前最大的公开仓库为Docker hub,star数量可以作为关注度参考,是否适合使用还要看维护状态、来源与更新记录。

常用命令
启动docker
如果是mac或者windows用户,可以直接使用Docker Desktop来可视化处理
如果是linux用户,需要通过命令行来启动
1 2
| sudo service docker start # 停止或重启时,将 start 分别换成 stop 或 restart;systemd 系统也可用 systemctl。
|
使用docker
- help帮助命令
通过这条命令可以查看与docker的镜像相关的命令
将image替换为container,则可以查看到关于container的相关帮助。
同时,可以进一步查看相关命令的细节,比如下面的命令就可以查看image下prune命令的细节。
1
| docker image prune --help
|
- 搜索并拉取镜像
1 2 3 4 5 6 7 8 9
| # 搜索与ubuntu相关的image docker search ubuntu
# 拉取镜像到本地 docker pull ubuntu
# 如果没有特别声明tag,会默认使用latest标签。 # 当然可以去docker hub去查找image并查看更加细节的东西,比如版本信息,然后在拉取的时候可以指定版本。 docker pull ubuntu:18.04
|
- 列出当前本地的所有镜像
1 2 3
| docker images 或者 docker image ls
|
如果想同时查看中间层镜像
1 2 3
| docker images -a 或者 docker image ls -a
|
- 删除本地镜像
1 2 3 4 5 6 7 8 9 10 11 12
| # 删除固定的某个镜像 docker rmi imageid docker image rm imageid
#删除所有玄虚镜像 docker image prune
# 删除所有玄虚镜像和未使用的景象 docker image prune -a
# 删除所有仓库名为redis的镜像 docker image rm $(docker image ls -q redis)
|
- 启动一个容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # 从image启动一个容器 docker run -it --name ubuntu ubuntu:18.04 /bin/bash -i : Keep STDIN open even if not attached 即使没有连接,也要保持标准输入保持打开状态 -t : Allocate a pseudo-TTY 分配一个伪tty --name ubuntu : 为当前容器分配名字为ubuntu ubuntu:18.04 :要运行的镜像 /bin/bash :要执行的命令。
还有一个参数非常常见 -d : Run container in background and print container ID 在后台运行容器,且打印容器id
# 把之前停止的容器重新启动 docker start containerid docker attach containerid
|
在默认 Linux bridge 网络的常见配置下,使用docker run启动容器的大致过程包括
1. 检查本地是否存在指定的镜像,不存在则从公有仓库下载
2. 使用镜像创建并启动容器
3.分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层
4.从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中去
5.从地址池分配一个ip地址给容器
6.执行用户指定的应用程序
7.执行完毕之后容器被终止
需要注意的是,对于容器要执行的命令而言,如果执行结束,那么容器就会关闭。
- 查看当前正在运行的容器
如果还想查看已经退出的容器
- 连接一个执行之中的容器
1
| docker container exec -it containerid sh
|
- 退出正在运行的容器
- 查看镜像所占空间
- 删除某些名称中含有dingms的container
1
| docker container rm $(docker ps -a |grep dingms | awk '{print $1}')
|
- 守护态进程
很多时候,需要让docker在后台运行而不是直接把结果输出到当前宿主下面,这个时候可以用守护态运行。
1 2 3 4 5 6 7 8
| # 没有使用守护态,始终在本地终端输出 docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
#使用守护态,不在本地终端输出,但是在最后结果输出 docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" # 查看当前contain docker container ls docker container logs containerid
|
- 终止某个容器
1
| docker container stop containerid
|
对于正在运行中的容器,重新启动
1
| docker container restart containerid
|
- 进入容器
1 2 3 4 5 6
| docker attach containerid
docker exec -it containerid bash
用attach连接到容器主进程的 shell 时,exit 会结束该 shell,并使容器终止。 exec 启动的是额外的 shell,exit 通常只结束该 shell。
|
- 镜像打包和加载
1 2 3 4
| # 打包镜像 docker save -o ~/Desktop/kuakua.tar kuakua:latest # 加载tar包到对应的镜像 docker load -i ~/Desktop/kuakua.tar
|
- 导出和导入容器
1 2 3 4 5 6
| # 导出容器快照文件到本地文件 docker export containerid > name.tar # 从容器快照文件再导入为镜像 cat name.tar | docker import - test/name:v1.0 # 查看所属镜像 docker images
|
注意:docker export 不包含挂载卷的数据,也不保留镜像的完整历史和运行配置;需要备份卷时要单独处理。
从网上找到一个非常棒的图

参考文章
- Docker 从入门到实践
- Docker-cli官方文档
- 30 分钟快速入门 Docker 教程