docker(一)基础概念及使用命令

一、什么是docker

Docker是一个操作系统级别的虚拟机引擎,它运行在操作系统之上,可以为任何应用创建一个轻量级、可移植的容器,而每个容器的进程是独立的,就像手机上的APP一样。所有的容器都共用一个操作系统内核。

二、docker和虚拟主机的对比

  • Docker与虚拟机在几个方面有所不同。首先,磁盘空间使用方面,Docker的镜像层一般很小,只有几十M,几百M,而虚拟机则通常以GB为单位。

  • 在性能方面,Docker依附于宿主机,所以性能接近宿主机,而虚拟机相对于原主机来说性能较差。[1]再者,资源利用率方面,Docker的资源利用率较高,而虚拟机对硬件资源消耗大,利用率较低。

  • 隔离性方面,Docker和虚拟机都具有安全隔离的特性。

  • Docker直接在宿主机内核上运行,而虚拟机运行在隔离层Hypervisor上。

  • Docker可以同时运行上千个容器,而虚拟机相对较厚重,最多只能启动几十个。

  • 在运行速度方面,Docker优于虚拟机,Docker容器的启动和停止可以在秒级实现,而传统的虚拟机方式要慢得多。
    下面是虚拟机和docker的底层原理图:
    vmware虚拟机
    在这里插入图片描述
    docker虚拟机:
    在这里插入图片描述

三、docker的三大要素:

1. 镜像:

镜像是一个只读的应用模板,它保存了容器需要的环境和应用的执行程序,可以将镜像看作是容器的代码,当代码执行起来的时候,就成了容器,镜像和容器的关系就类似于程序和进程之间的关系。
我们可以通过dockerfile文件,定义需要安装的程序,然后创建出镜像文件。

2. 容器:

容器是一个运行环境,是镜像的一个运行状态,他是镜像执行的动态表现。它里面的内容是可读可写的,容器是完全隔离的,我们不用担心容器之间会相互干扰。

3. 仓库:

仓库就是用来保存镜像的地方,像docker hub就是全世界最大的镜像库,用户可以将自己做好的镜像发布上去。

常用命令

以下图是镜像,容器,仓库的常用命令
在这里插入图片描述

一、镜像

1. 搜索镜像:

docker search [镜像名]

docker search nginx
2. 拉取镜像:

docker pull [镜像名]

docker pull nginx

如果报如下错误
Error response from daemon: Head "https://registry-1.docker.io/v2/library/nginx/manifests/latest": dial tcp: lookup registry-1.docker.io on 192.168.1.1:53: no such host
修改/etc/resolv.conf,改成如下DNS值

(宿主机是centos7,其他的操作系统可能不一样)

nameserver 114.114.114.114
nameserver 8.8.8.8
3. 查看镜像列表
docker images
或
docker image ls
4. 给镜像设置标签

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

# 这其实是给nginx镜像重新克隆了一个出来并打上标签
docker tag nginx:latest nginx:v1
5. 通过dockerfile构建镜像

docker build [OPTIONS] PATH
OPTIONS表示构建镜像时的参数配置,PATH表示指定的构建上下文路径,Dockerfile如果就在当前项目下,那么就是.表示
如果不指定Dockerfile,则默认使用当前目录下名为Dockerfile的文件
参数-t指定要构建的镜像名称和版本,-f指定要使用的Dockerfile文件
myapp, 表示上下文目录

例子1:app应用路径

myapp/
├── Dockerfile-dev
├── Dockerfile-prod
├── app.py
└── requirements.txt

此场景,就是当前应用下有开发环境,生成环境的不同的dockerfile,那么需要指定具体dockerfile的路径。

docker build -t myapp:dev -f Dockerfile-dev myapp/

如果要使用Dockerfile-prod文件进行构建,则可以使用如下命令:

docker build -t myapp:prod -f Dockerfile-prod myapp/

例子2:自定义的nginx

docker build -t nginx:v1 -f ./Dockerfile-test ../nginx-v1/

在这里插入图片描述

6. 镜像的导出

docker save -o [导出的文件名] [镜像名]

docker save -o nginx-img.tar.gz nginx:latest

在这里插入图片描述

7. 镜像的导入

docker load -i [导入的文件名]

docker load -i nginx-img.tar.gz

在这里插入图片描述

8. 删除镜像

镜像删除的时候,其关联的容器要先删除干净才行。

docker rmi [镜像名称]:[tag]

docker rmi nginx

若有标签的

docker rmi nginx:1.21
9. 构建镜像的过程

如果想要查看dockerfile构建镜像的过程,通过history命令来查看

格式 docker image history [镜像名]:[tab]

docker image history nginx:latest

在这里插入图片描述

二、容器

标注:为了更好的区分容器和镜像的命令,我们初学者一开始在docker后面加上container来表示容器,这样子比较直观
docker container [arg…]

1. 查看容器

我们在操作容器时,可以取容器id的前面四位,这个标识这个容器,前四位是唯一的。

# 当前正在运行的
docer ps

# 查看所有的容器
docker ps -a

# 查看最近的容器
docker ps -l
2. 创建并启动容器

docker run [选项] 镜像名 命令 [参数]
选项说明:
-d: 后台运行容器(守护进程) 并返回容器ID
-i: 以交互模式运行容器,通常与-t同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-p: 指定端口映射,格式:主机(宿主)端口:容器端口
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-v:绑定一个数据卷
-h “mars”: 指定容器的hostname;
-e username=“ritchie”: 设置环境变量;
–rm: 使用场景:默认情况下,如果你想要Docker自动清理容器,就在容器退出(docker stop)时,你可以添加–rm标志。这样子方便来调试用。
–env-file=[]: 从指定文件读入环境变量;
–cpuset=“0-2” or --cpuset=“0,1,2”: 绑定容器到指定CPU运行;
–volume: 和-v一样,绑定一个数据卷
–name=mongo-lb: 为容器指定一个名称
–privileged=true 容器具有root权限,可以读写宿主目录
–restart=always 开机自启动

启动nginx容器为例子:

# 表示以后台启动一个名为nginx容器,并且支持交互模式,并且宿主机和容器端口都是80
docker run -itd --name nginx  -p 80:80 nginx:latest

在这里插入图片描述
访问成功了
在这里插入图片描述

3. 容器启动

第一次可以通过docker run启动,之后都是通过docker start启动,并且如果镜像不存在会自动去拉取。

docker start [容器id或名称]

# 通过容器id启动
docker start 051c85d85e4a

# 通过容器名启动
docker start nginx

在这里插入图片描述

4. 容器重启

docker restart [容器id或名称]

docker restart nginx

在这里插入图片描述

5. 容器停止

docker stop [容器id或名称]

docker stop 051c85d85e4a

在这里插入图片描述

6. 容器暂停

docker pause [容器id或名称]

docker pause 051c85d85e4a
7. 恢复暂停

docker unpause [容器id或名称]

docker unpause 051c85d85e4a
  • 暂停和停止的差别在于操作系统的处理方式,如果容器进入暂停状态,操作系统会将容器内的进程挂起,容器关联的内存暂存下来。CPU不再执行这个进程。但是如何把它恢复了呢?内存空间恢复,程序接着运行。
  • 但是停止不同,停止直接把这个进程杀死,容器所占的内存回收。那保留下来的仅剩容器的文件系统了,也就是一些静态的东西,这就是暂停和停止的差别了,因此一旦停止,暂存在内存的数据没有办法恢复的。
8. 容器的删除

容器删除前,要先停掉容器,如果容器中存在重要数据,需要迁移到数据卷或宿主目录下

docker rm [容器id或容器名称]

docker rm 051c85d85e4a
9. 容器内执行命令

docker exec -it [容器名或id] -it

# 进入nginx容器内部
docker exec -it nginx /bin/bash

# 退出
exit

在这里插入图片描述

10. 查看容器详情

容器创建成功后,可以通过docker inspect命令查看容器的详细信息,这些容器的信息包括容器的名称,id,环境变量,运行命令,主机配置,网络配置,数据卷配置等等,

docker inspect -f{{格式化状态值}} [容器id或容器名]

# 筛选出数据卷信息
docker inspect -f='{{.Mounts}}' nginx

# 查看运行状态
docker inspect -f='{{.State.Running}}' niginx

在这里插入图片描述
也可以用grep来搜索内容,比如要查看容器的ip信息

docker inspect nginx-v1 | grep -i "ip"

在这里插入图片描述

11. 查看容器进程

docker top [容器id或容器名]

docker top nginx
12. 查看容器日志

docker logs [options] 容器id或容器名
-f: 实时看日志
–tail: 表示看默认的几行
-t: 表示显示时间

# 查看容器所有的日志
docker logs nginx

# 实时看日志,并显示最后5行,并显示日期时间
docker logs -f --tail=5 -t nginx

在这里插入图片描述

13. 容器导出

docker export [容器名或容器id] > [目标路径]

本地修改好的index.html文件上传到容器中,然后访问页面

vim ~/index.html

docker cp ~/index.html nginx:/usr/share/nginx/html/

在这里插入图片描述
重新刷新下nginx页面,就可以看到页面变了
在这里插入图片描述
导出操作

docker export nginx > ~/nginx.tar.gz

在这里插入图片描述

14. 容器导入

可以将前面的nginx容器删除,然后再导入,需要注意的是导入的容器,需要以命令行模式启动

docker run -itd --name=nginx -p 80:80 import-nginx bash

在这里插入图片描述

15. 容器的配置更新

可以更新一个或多个容器的配置,比如容器忘记设置开机重启,没读写权限

docker update [OPTIONS] 容器id1 [容器id2…]

以hyperf容器例子为例子:

docker update --restart=always hyperf

在这里插入图片描述
在portainer中的效果
在这里插入图片描述

16. 查看容器日志

docker logs [-f] 容器名|容器id
-f参数表示动态的去加载日志

比如查看nginx的容器执行日志
先找到所有的容器

docker ps -a

在这里插入图片描述

再根据容器id的前四位来查看日志

docker container logs 5237

在这里插入图片描述
动态加载日志:
我们在访问web站点时候,日志就会进nginx。这个时候就能实时看到日志了。

docker container logs -f 5237

在这里插入图片描述

17. 查看容器的进程

格式:docker [container] top 容器id|容器名称
容器其实就是一个进程,当进程退出时,容器也就关闭了。

比如查看nginx的容器进程:

docker container top 

在这里插入图片描述
同时可以通过pstree来查看nginx的父子进程的关系

pstree -halps 2528

在这里插入图片描述

18. 容器的插件安装

格式:docker plugin install [OPTIONS] PLUGIN [KEY=VALUE…]

安装vieux/sshfs插件并将其DEBUG环境变量设置为1。安装时,需要从Docker Hub中拉出插件,并提示用户接受插件所需的权限列表,设置插件的参数并启用插件。

docker plugin install vieux/sshfs DEBUG=1

插件安装完成后,会出现在插件列表中:

docker plugin ls

ID             NAME                 DESCRIPTION               ENABLED
1eba3fdfd738   vieux/sshfs:latest   sshFS plugin for Docker   true

在这里插入图片描述

19. 容器和宿主机之间的数据拷贝

语法:

  • 从容器中拷贝文件或目录到宿主机
docker cp [OPTIONS] 容器id:SRC_PATH 宿主机目录
  • 从宿主机拷贝文件或目录到容器中
docker cp [OPTIONS] 宿主机目录 容器id:DEST_PATH

举例

  • 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下,最后带上/表示拷贝
docker cp /www/runoob 96f7f14e99ab:/www/
  • 将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www,最后不带/表示重命名覆盖
docker cp /www/runoob 96f7f14e99ab:/www

文章参考:
https://www.cjavapy.com/mip/2985/
https://www.runoob.com/docker

三、容器运行背后原理?

举例:docker container run -d -P --name=nginx nginx:latest

按以下顺序执行:

    1. 在本地查找是否有nginx这个image镜像,如果没有发现
    1. 去远程的image registry查找nginx镜像,(默认的registry是Docker Hub上)
    1. 下载最新版的nginx镜像(默认是nginx:latest)
    1. 基于nginx镜像来创建一个新容器,并且准备运行
    1. docker engine分配给这个容器一个虚拟IP地址
    1. 在宿主机上打开80端口,并把容器的端口映射到宿主机上
    1. 启动容器,运行指定的命令,(这里是一个shell脚本去启动nginx)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值