前言

在写这篇文章的之前,我老早老早就想搞一下Docker了,但是以前看了一下Docker的教程觉得自己弄不来,可能那时候学东西还没到一个境界不好理解吧,总之现在慢慢开始懂很多计算机的内容了,Docker也学起来了,自然而然也就懂了。其实也不难吧,写这个文章之前已经成功在本地服务器用Docker挂了个Node[noʊd]了,效果还不错。这篇文章主要想记录一下Docker的使用,以后不需要找十几个网站查命令使用啥的。

使用记录

镜像使用

镜像是什么?

这里做一个不专业的解释,玩计算机的应该都知道winpe吧,winpe通常是一个iso文件,而这个iso文件就是一种镜像文件,而这个镜像文件里面包含了一个winpe系统,winpe系统里面又有各式各样的功能,我们需要某一个功能就要先挂载镜像文件,进入镜像里面才能使用到这个功能。Docker镜像也是如此,一个Docker镜像里面包含了一个极其简单的Linux,它包含许多必要的Liunx的功能,但是这个Linux和winpe不一样的是,winpe是一个独立的个体,而这个Docker镜像中内置的Linux,因为Docker追求简便,轻量的原因它没有内核,内核是由宿主机提供。
然后一些软件,比如node,mysql这类软件,就会包含在这个镜像里面,使用者通过挂载镜像,去获得软件的使用,当然挂载镜像就要使用容器,这里下面容器会解释。

镜像常用命令

拉取镜像

docker image pull 镜像名称

默认情况下,它自动拉取的是docker hub仓库里面的最新版本:latest,例如你要拉取一个node,命令就是:docker image pull node,但它实际执行的命令是:docker image pull node:latest
如果想拉取其中一个版本的话,只要把镜像名称:后面改一下就可以。
例如,我想拉取node的lts-alpine3.9版本,只要把命令写成:

docker image pull node:lts-alpine3.9

相关软件版本可以到https://hub.docker.com中搜索该软件的镜像,选择tag就能找到了

查看镜像

docker image ls //-a表示列出所有,可以替换成:镜像仓库名:tag
docker images //-a表示列出所有,可以替换成:镜像仓库名:tag
--digests 显示镜像的摘要信息;
-f 显示满足条件的镜像
--format 指定返回值的模板文件
--no-trunc 显示完整的镜像信息
-q 只显示镜像ID

此命令用于查看本地已经拉取的所有镜像,可以查到所有镜像的仓库名称、Tag、镜像ID、创建时间和大小

删除镜像

docker image rm 镜像id
docker rmi 镜像id         //-f :强制删除

需要先通过查看镜像命令找到要删除的镜像,获取其ID才能用这个命令进行删除,删除前需要先把相关容器也删除掉

删除未使用的镜像

docker image prune //-a 列出所有内容 -f 强制删除

这个命令有点特殊,因为有时候我们会下载了一堆镜像,但是发现排不上用场,后期又没有使用过,但是忘记了哪些没用,这时候可以通过这条命令,删除所有没有用过的镜像

显示镜像历史记录

docker image history 镜像仓库名:tag
docker history 镜像ID

主要显示镜像的历史记录,这里不多解释

镜像详细信息

docker image inspect 镜像ID
docker inspect 镜像仓库名:tag

此命令主要展示了镜像的细节,包括镜像层数据和元数据

查找可用镜像

docker search 镜像仓库名

这个就不多解释了,就是想下什么可以用这个命令找找。

镜像其他操作
1.标记本地镜像,将其归入某一仓库

docker tag 镜像仓库名:tag 名称:tag

例如:将镜像ubuntu:xx.xx标记为 xxxxxx/ubuntu:v1 镜像。

docker tag ubuntu:xx.xx xxxxxx/ubuntu:v1

2.本地的镜像上传到镜像仓库

docker push name:tag
//--disable-content-trust 忽略镜像的校验,默认开启

3.将指定镜像保存成 tar 归档文件

docker save -o xxxx.tar 镜像ID 
//-o :输出到的文件

4.导入使用docker save命令导出的镜像

docker load -i xxxx.tar
//--input -i  指定导入的文件
//--quiet -q  精简输出信息

5.从归档文件中创建镜像

docker import xxxx.tar 镜像名:tag
//-c 应用docker 指令创建镜像
//-m 提交时的说明文字

更多命令(仅供参考)
点此转到->docker image命令

容器使用

容器是什么?这个东西需要结合镜像去解释,其实也不难理解,用不专业的说法来说:上面我说镜像的时候说到,winpe系统里面又有各式各样的功能,我们需要某一个功能就要先挂载镜像文件,进入镜像里面才能使用到这个功能,这时候我们需要一个能够挂载镜像的容器,一般情况下,我们习惯把winpe放进U盘里面,而U盘再挂载到电脑上,这个时候这个U盘就是winpe的容器,而有时候我们可以提取PE直接在电脑中挂载iso文件,它会在电脑上生成一个虚拟光驱,而这个光驱也是winpe的容器;再简单一点理解,就是你手上有一个windows10,你需要运行这个windows10,就需要一个电脑,而你的电脑就是装载这个windows10的一个容器。所以Docker的容器就是用于挂载镜像的一个东西。一个镜像可以拥有多个容器,相当于一个winpe可以刷进多个U盘里面一样。

容器相关命令

创建容器

docker run 
docker create
docker container run
docker container create  
//注:四个命令的用法是完全一样的

以下是延伸的用法(以docker run为例):
1.用已有的镜像创建一个容器

docker run --name test -d 镜像仓库名:tag
//-d 后台运行一个容器,并返回ID
//test为自定义名字

2.用已有镜像创建一个容器,并在容器内添加一个80端口映射到宿主机的随机端口

docker run -P -d 镜像仓库名:tag
//-P 添加一个80端口映射到宿主机随机端口

3.用已有镜像创建一个容器,自定义映射端口并挂载本地文件夹到容器里

docker run -p 1234:1234 -v /a:/a -d 镜像仓库名:tag
//-p 指定端口映射,格式:宿主机端口:容器端口 
//-v 绑定一个卷,格式:宿主机目录:容器目录

4.绑定容器的1234端口,并将其映射到宿主机127.0.0.1的80端口上

docker run -p 127.0.0.1:80:1234/tcp 镜像仓库名:tag /bin/sh
// /bin/sh:此处是命令

5.用已有镜像以交互模式创建一个容器,并在容器内执行/bin/sh命令

docker run -it 镜像仓库名:tag /bin/bash
//-i 以交互模式运行容器
//-t 为容器重新分配一个伪输入终端
//-i和-t一般一起使用,变成-it

6.其他flag用法

-name 为容器指定一个名称
--dns 指定容器使用的DNS服务器,默认和宿主一致
--dns-search 指定容器DNS搜索域名,默认和宿主一致
-h 指定容器的hostname
-e username 设置环境变量
--env-file=[] 从指定文件读入环境变量
--cpuset="0-2" or --cpuset="0,1,2" 绑定容器到指定CPU运行
-m 设置容器使用内存最大值
--net= 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型
--link=[] 添加链接到另一个容器
--expose=[] 开放一个端口或一组端口

容器的启动关闭和重启

docker start 容器ID              //启动容器
docker stop 容器ID               //停止容器
docker restart 容器ID            //重启容器
docker kill 容器ID               //杀死容器

docker container start 容器ID    //启动容器
docker container stop 容器ID     //停止容器
docker container restart 容器ID  //重启容器
docker container kill 容器ID     //杀死容器

解释一下kill和stop的区别,kill的关闭手段比较残忍,是强制性的关闭,相当于电脑直接断电,而stop比较优雅,它先发送一个信号,让容器做必要的处理再关闭,相当于先按关机再断开电源。能不用kill就不用kill,尽量用stop。

在运行的容器中执行命令

docker exec -itd 容器ID 命令
docker container exec -itd 容器ID 命令
//-i 以交互模式运行容器
//-t 为容器重新分配一个伪输入终端
//-d 在后台运行,不会显示执行内容

删除容器或容器连接

docker rm 容器ID
docker container rm 容器ID
//-f 强制删除容器
//-v 删除容器挂载的数据卷

docker rm -l xxx
docker container rm -l xxx
//-l 移除容器之间的连接,xxx为连接名称

docker rm $(docker ps -a -q)
//删除所有已经停止的容器

查看容器
1.此命令主要是展示所有容器的基本信息

docker ps 
//-a 显示所有的容器,同时包括没有运行的
//-f 根据条件过滤显示的内容
//--format 指定返回值的模板文件
//-l 显示最近创建的容器
//-n 列出最近创建的n个容器
//--no-trunc 不截断输出
//-q 静默模式,只显示容器编号
//-s 显示总的文件大小

2.此命令主要展示了容器的细节,包括层数据和元数据

docker container inspect 容器ID
docker inspect 容器ID

3.此命令主要是用来看容器的运行日志,在运行出现问题的时候极其有用

docker logs 容器ID
//-f 跟踪日志输出
//--since 显示某个开始时间的所有日志,格式:--since="2020-02-15"
//-t 显示时间戳
//--tail 仅列出最新指定条容器日志,格式:--tail=整数

4.此命令用于查看容器中运行的进程信息

docker top 容器ID

5.此命令用于列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口

docker port 容器ID

6.此命令用于从服务器获取实时事件

docker events 
-f 根据条件过滤事件
--since 从指定的时间戳后显示所有事件
--until 流水时间显示到指定的时间为止

容器操作
1.此命令用于容器与主机之间的数据拷贝

docker cp /path/to/start /path/to/target
//-L 保持源目标中的链接

命令中的两个路径如果有一方是docker主机,则要在路径前面加上容器ID:(注意冒号)。例如:xxxxxx123:/path/to/start

2.此命令检查容器里文件结构的更改,查看变化

docker diff 容器ID

3.此命令用于从容器创建一个新的镜像

docker commit 容器ID 镜像仓库名:tag
-a 提交的镜像作者
-c 使用Dockerfile指令来创建镜像
-m 提交时的说明文字
-p 在commit时,将容器暂停

其他命令

prune 命令

docker prune

prune 命令用来删除不再使用的 docker 对象。
1.删除所有未被 tag 标记和未被容器使用的镜像

docker image prune

2.删除所有未被容器使用的镜像

docker image prune -a

3.删除所有停止运行的容器

docker container prune

4.删除所有未被挂载的卷

docker volume prune

5.删除所有网络

docker network prune

6.删除 docker 所有资源

docker system prune

镜像加速

什么是镜像加速?

大家都知道,国内网络环境的独特性,导致在docker hub上面pull一个镜像会很慢甚至失败,我在写这个前下载node,失败了好几次,最后才成功,主要还是网络问题,那么这个网络问题怎么解决?下面就说下。

解决方法

/etc/docker/daemon.json中写入如下内容(如果文件不存在请新建该文件)【仅针对systemd系统】

{"registry-mirrors":["http://hub-mirror.c.163.com"]}

这个是网易的一个加速器,如果有找到其他可以把网站改掉,或者直接在网站后面添加,例如:

{"registry-mirrors":["http://hub-mirror.c.163.com",https://docker.mirrors.ustc.edu.cn]}

总结

大概就记录到这里,其他更深入的要慢慢鼓捣,还有个docker network的命令我还没去研究没去搞懂,还有个docker容器间的连接也没去搞懂,这两个内容估计会用另一篇一整篇的文章去记录吧。

参考资料

1.Docker教程 - 易百教程
2.Docker network命令 - 易百教程
3.Docker - C语言中文网
4.Docker教程 - 菜鸟教程
5.Docker命令大全 - 菜鸟教程