1. docker命令行
docker命令行的基本格式:
docker + 管理的对象(比如容器,镜像) + 具体操作(比如创建,启动,停止,删除)
比如:docker image pull nginx:拉取一个nginx的docker image镜像
不清楚docker能管理什么对象或者不清楚有什么操作,可以输入docker --help或docker image --help
2. 镜像(image)和容器(container)
2.1 image镜像:
- Docker image是一个
read-only
文件- 这个文件包含文件系统、源码、库文件、依赖等运行应用需要的文件
- 可以理解为一个模板
- 其具有分层的概念
2.2 container容器
- 可以理解为“一个运行中的docker image”
- 实质是复制image并在image上层加上一层
read-write
的层,称之为container layer- 基于同一个image可以创建多个container
2.3 docker image的获取
- 自己制作
- 从registry拉取(比如docker hub)
3. 容器的基本操作
操作 | 命令(全) | 命令(简) |
容器的创建 | docker container run <image name> | docker run <image name> |
容器的列出(运行中) | docker container ls | docker ps |
容器的列出(全部) | docker container ls -a | docker ps -a |
容器的停止 | docker container stop <name or ID> | docker stop <container name or ID> |
容器的删除 | docker container rm <name or ID> | docker rm <container name or ID> |
3.1 批量操作
显示所有容器的ID号:
docker container ls -aq
停止/删除当前所有容器:
①
docker container stop/rm af 87
(af和87为容器ID号的前两位)②
docker container stop/rm $(docker container ls -aq)
注意:无法删除一个正在运行的容器,需要先停止容器再删除,也可以使用
docker container rm 87(容器ID号) -f
快速对系统进行清理,删除停止的容器,不用的image等:
docker system prune -a -f
4. 容器的attached和detached模式
① attatched模式:
在Windows系统和Linux/Mac系统下执行
docker container run -p 80:80 nginx
,当前shell窗口会出现执行nginx的log,并且无法使用命令行。然后执行ctrl+c会出现不同的情况:Windows系统:执行完ctrl+c后,容器依旧会继续执行,仅仅只是在shell窗口执行退出。
Linux/Mac系统:执行完ctrl+c后,将执行脚本停止,容器退出。
将本地的输入/输出结果会直接反映容器内部(即上述Linux/Mac系统操作结果)即为attatched模式。Windows系统执行的结果并不是完整的attached模式
② detached模式:
在Windows系统和Linux/Mac系统下执行
docker container run -d -p 80:80 nginx
,当前shell窗口并不会出现执行nginx的log(想要显示执行的log,可以使用docker container logs 85(容器ID号)
),只会出现容器ID号,并且可以使用命令行。此时该容器处于detached模式。如果要重新attah到该容器,可以执行
docker attach 85(容器ID号)
。创建容器时推荐使用detached模式
5. 容器的交互式模式
① 创建一个容器并进入交互式模式:
docker container run -it
执行
docker container run -it ubuntu sh
后直接进入到ububtu容器的shell中,可以进行交互,此时执行exit
会将ubuntu容器直接退出。② 在一个已经运行的容器里执行一个额外的command:
docker container exec -it
执行
docker container run -d -p 80:80 nginx
创建detached模式的容器,然后执行docker exec -it 85(容器ID号) sh
进入到该容器内部,此时执行exit
并不会退出该nginx容器执行脚本(该nginx容器还在运行),只是退出当前shell。该命令使用较为频繁,使用该命令可以进入容器内部进行检查。
6. Windows如何运行docker engine?
Windows安装完docker的服务端和客户端后,输入
docker version
后在客户端信息中可以查询到OS/Arch:windows/amd64,而服务端信息中0S/Arch:Linux/amd64。那么在Windows系统下为什么会出现Linux环境?在Windows中搜索Hyper-V Manager,会出现DockerDesKtopVM这样一台Linux系统的虚拟机,这台虚拟机安装了docker的engine。
7. 容器和虚拟机
虚拟机底层需要Hypervisor(VMWare、Virtual box等),容器运行在container engine之上
7.1 容器不是Mini的虚拟机
- 容器其实是进程
- 容器中的进程被限制了堆CPU、内存等资源的访问
- 当进程停止后,容器就退出了
7.2 容器的进程
查询当前的容器进程:
docker top 1b(容器ID号)
如果此时使用的是Windows系统,是无法使用
ps aux | grep nginx
查看到进程状态,因为docker engine在DockerDesKtopVM中,并不在Windows宿主机中。
查询进程的关系结构:
pstree -halps 9547(进程ID号)
9480即为创建该容器的进程ID号,id后面的字符串为容器的ID号
注意,我们在容器中看到的进程ID号和在宿主机上看到的进程ID号是不一样的。
下图中,此时显示的容器进程为1和7;进入到容器内部,进程ID号为15803
8. docker container run运行流程
当执行
docker container run -d -p 80:80 --name webhost nginx
后(–name是给容器指定名称webhost,没有指定的话就随机生成):
- 在本地查找是否有nginx这个image镜像
- 本地没有就去远程的image registry查找nginx镜像(默认的registry是Docker Hub)
- 下载最新版本的nginx镜像 (nginx:latest 默认)
- 基于nginx镜像来创建一个新的容器,并且准备运行
- docker engine分配给这个容器一个虚拟IP地址
- 在宿主机上打开80端口并把容器的80端口转发到宿主机上
- 启动容器,运行指定的命令(在上述命令最后可以加上创建容器后需要执行的命令,这里没有加上其他命令就执行默认脚本启动nginx)
9. 参考
https://dockertips.readthedocs.io/en/latest/container-quickstart.html