1.概述

docker是什么?按我的理解类似一个轻量的虚拟机,将计算机资源虚拟化,这里的计算机资源,可以暂时理解成计算能力和数据存储。虚拟化的好处在于,打破资源不可分割的障碍,可以更好地配置。我们可以在docker里面打包网站、程序甚至是它们需要的系统环境,独立打包、互不干扰、方便快捷。

docker启动流程

img

docker命令概览

img

2.启动docker

systemctl start docker   # 启动Docker
systemctl enable docker # 设置开机自启动
systemctl stop docker # 关闭docker
systemctl restart docker #重启docker
docker version # 查看当前版本号,是否启动成功
docker info

帮助命令

docker --help	        #帮助命令
docker pull --help #拉去images的帮助命令

image-20221018153437685

image-20221018153525892

image-20221018153629701

3.镜像命令

3.1查看本地主机镜像

docker images

# 可选参数
-a/--all 列出所有镜像
-q/--quiet 只显示镜像的id

image-20221018153925224

列表参数解释

  1. REPOSITORY 镜像的仓库源
  2. TAG 镜像的标签
  3. IMAGE ID 镜像的id
  4. CREATED 镜像的创建时间
  5. SIZE 镜像的大小

3.2搜索镜像

docker search 镜像名

#可选参数
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don\'t truncate output

img

3.3拉取镜像

docker pull 镜像名[:tag]

关于tag

默认拉取tag为latest的镜像,即最新版本,当然也可以指定版本。

这里,涉及到docker镜像“层”和存储驱动的知识。简而言之,一个镜像由许多层组成,如果两个镜像有“层”重复,则不需要重复拉取,节约空间。但是,如果镜像被不同的tag标记,即使它们完全相同(“层”也完全相同,共用一组“层”),docker还是会显示两个images,例如:

#拉取了java的镜像,tag为latest
$ docker pull java
Using default tag: latest
latest: Pulling from library/java
5040bd298390: Pull complete
fce5728aad85: Pull complete
76610ec20bf5: Pull complete
60170fec2151: Pull complete
e98f73de8f0d: Pull complete
11f7af24ed9c: Pull complete
49e2d6393f32: Pull complete
bb9cdec9c7f3: Pull complete
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:latest

$ docker pull java:8-jdk
8-jdk: Pulling from library/java
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8-jdk

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
java 8-jdk d23bdf5b1b1b 20 months ago 643MB
java latest d23bdf5b1b1b 20 months ago 643MB

这里java版本8-jdk就是最新的,拉取8-jdk时不需要再拉取重复“层”,但是依然显示不同的images

3.4删除镜像

docker rmi -f 镜像名/镜像ID                            #删除一个 
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID #删除多个
docker rmi -f $(docker images -aq) #删除全部
docker images rm 镜像名称/镜像ID #强制删除镜像

4.容器命令

4.1查看容器

docker ps     #查看正在运行的容器列表
docker ps -a #查看所有容器

4.2运行&停止容器

docker run [可选参数] image
docker run -itd --name redis002 -p 8888:6379 redis:5.0.5 /bin/bash #容器端口与服务器端口映射

#参数说明
--name="名字" 指定容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
( -p ip:主机端口:容器端口 配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口)
-P 随机指定端口(大写的P)

-v /宿主机目录:/容器目录 挂载宿主机的一个目录。
这里把容器想成一个单独的系统,或者说电脑,而你的宿主机目录是一个U盘,挂载 后,你往宿主机该目录里放文件,那么通过容器里对应目录便可以访问到此文件,不需 要重新生成容器就可以在“容器外部”添加和修改某些文件
docker stop 容器名/容器ID   #停止容器

示例:

#使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
runoob@runoob:~$ docker run -it nginx:latest /bin/bash
root@b8573233d675:/#

4.3删除容器

docker rm -f 容器名/容器ID  #删除一个
docker rm -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID #删除多个---
docker rmi -f $(docker ps -aq) #删除全部

docker生命流程图

img

5.其他命令

#获取镜像的元信息:
docker inspect 镜像名

#将容器导出为tar包:
docker export aa93039fd7fa > aa91.tar

docker export aa9 -o thinkphp6.tar

#将tar包导入为镜像:
docker import tp3-where.tar tp3-where:latest

#使用start.sh方法启动镜像
docker run -d -p 81:80 vul_thinphp6:latest /start.sh

6.命令的比较

docker run和docker start

docker run相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start)。

而docker start的作用是,重新启动已存在的镜像。也就是说,如果使用这个命令,我们必须事先知道这个容器的ID,或者这个容器的名字,我们可以使用docker ps找到这个容器的信息。

docker run和docker exec

docker exec -it 容器名/容器ID /bin/bash   #进入容器

“docker run”通常是在新创建的容器中所使用的命令。 它适用适合没有容器运行的情况,您想要创建一个容器,并且要启动它,然后在其上运行一个进程。

“docker exec”适用于在现有容器中运行命令的情况。如果您已经拥有了一个正在运行的容器,并希望更改该容器或从中获取某些内容,那么使用“docker exec”命令就非常合适了。

docker kill和docker stop

相同点:两者都是停掉容器,并把容器状态指定到stopped。

不同点:
被kill杀死容器,进入stopped状态被重新start后,会开启新的进程号;
被stop停掉的容器,再次被重新start后,进程号不变,还是原来的。

kill命令比较生猛,不管容器死活,直接给系统发送SIGKILL的系统信号强行kill掉进程,就是要用kill -9干掉容器;

stop比较温柔,先给容器发送一个TERM信号,给容器充足时间(默认10秒)保存数据,让容器自动安全停止运行,超时后再给系统发送SIGKILL的系统信号强行kill掉进程,最后转变为stop状态。

使用docker stop -t [s, default 10],可调整超时时间(docker stop -t 20 mynginx)