1. docker命令行

docker命令行的基本格式:

docker + 管理的对象(比如容器,镜像) + 具体操作(比如创建,启动,停止,删除)

比如:docker image pull nginx:拉取一个nginx的docker image镜像

不清楚docker能管理什么对象或者不清楚有什么操作,可以输入docker --helpdocker 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

docker desktop设置加速 docker快速上手_docker desktop设置加速

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. 容器和虚拟机

docker desktop设置加速 docker快速上手_运维_02

虚拟机底层需要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宿主机中。

docker desktop设置加速 docker快速上手_docker_03

查询进程的关系结构:pstree -halps 9547(进程ID号)

9480即为创建该容器的进程ID号,id后面的字符串为容器的ID号

docker desktop设置加速 docker快速上手_docker desktop设置加速_04

注意,我们在容器中看到的进程ID号和在宿主机上看到的进程ID号是不一样的。

下图中,此时显示的容器进程为1和7;进入到容器内部,进程ID号为15803

docker desktop设置加速 docker快速上手_linux_05

docker desktop设置加速 docker快速上手_docker desktop设置加速_06

8. docker container run运行流程

当执行docker container run -d -p 80:80 --name webhost nginx后(–name是给容器指定名称webhost,没有指定的话就随机生成):

  1. 在本地查找是否有nginx这个image镜像
  2. 本地没有就去远程的image registry查找nginx镜像(默认的registry是Docker Hub)
  3. 下载最新版本的nginx镜像 (nginx:latest 默认)
  4. 基于nginx镜像来创建一个新的容器,并且准备运行
  5. docker engine分配给这个容器一个虚拟IP地址
  6. 在宿主机上打开80端口并把容器的80端口转发到宿主机上
  7. 启动容器,运行指定的命令(在上述命令最后可以加上创建容器后需要执行的命令,这里没有加上其他命令就执行默认脚本启动nginx)

9. 参考

https://dockertips.readthedocs.io/en/latest/container-quickstart.html