docker 学习使用记录

前段时间使用甲骨文云免费实例,因为不可以重新设置系统,所以就把本来的实例终止,然后再重新创建一个,当时出了点问题,总是访问不到,总是报错 503,然后找了一个大佬排查问题,虽然最后没有查出来(最后知道是甲骨文云免费实例后面创建的实例有时候跟不上子网,然后子网放行的端口实际上在实实例内部并没有放行,所以导致访问不到),在排查时跟大佬说我使用服务器是使用宝塔面板,因为比较方便,然后装 x-ui 的时候也是使用了面板,大佬说这玩意不安全,之前也是爆出过很多乱七八糟的问题,不如使用 docker,然后之前在公司也是第一次解除到 docker,但是没有放在心上,后来看网上 docker 满天飞,所以学习一下

docker 英文官网

docker 中文官网

dockerHub 仓库

docker 分为镜像和容器
首先将镜像 pull 下来
然后用docker run生成一个容器,生成容器时指定镜像

我这里拿 centos7.x 举例,安装就不举例了,根据官网安装很简单

基本查看命令

使用docker -v查看是否安装成功
docker -v 示例
使用docker images查看镜像列表,可以看到目前是没有镜像的
docker images 示例
使用docker ps查看运行着的容器列表,可以看到目前是没有容器的
docker ps 示例
使用docker ps -a查看所有容器列表,-a 代表 --all 的意思,我这里举例所以搞了一个已停止的容器
在这里插入图片描述
使用docker ps -aq仅查看所有容器的 ID 的列表,-q不知道啥意思,反正就是带上只返回 ID
查看所有容器的ID的列表示例

拉取镜像

拿 ubuntu 的镜像举例
在 docker Hub 仓库的 Explore 找到 ubuntu,点击去之后
docker Hub 的 ubuntu 示例
使用docker pull ubuntu将 ubuntu 镜像 pull 下来
docker pull ubuntu 示例
这时候再使用docker images查看镜像列表就可以看到有 ubuntu 这个镜像了,这个容器之所以这么小,是因为只含有 ubuntu,不存在另外的任何例如 vim 这种东西
docker images 查看 ubuntu 镜像

运行容器

ubuntu

然后使用docker run -it ubuntu /bin/bash运行一个容器,容器使用 ubuntu 镜像
–name 自定义容器名称
-d 启动后在后台运行
-i 以交互模式运行容器,通常与-t 一起使用
-t 运行后返回一个伪终端,通常与-i 一起使用
-P 随机映射端口
-p 指定映射端口,可以有多个,例如-p 80:80 -p 443:443,也可以范围映射,例如-p 8000-9000:9000-10000
/bin/bash shell 交互命令的接口,一般就只用 bash 或者/bin/bash 即可
还有一些其他的,目前我只用到这些,以后了解了再补充
不使用-d的话会直接进入到 ubuntu 容器内部
运行 ubuntu 容器 不带-d 示例
使用-d 的话会返回一串 id,并将启动的容器在后台运行
运行 ubuntu 容器 带-d 示例
然后在这个容器内部就可以当做一个 ubuntu 系统使用了

nginx

再说一个 nginx,示例端口映射,先拉 nginx 的镜像
拉取nginx镜像
然后使用docker run -it -d -p 80:80 nginx /bin/bash运行一个容器,镜像使用 nginx 镜像
这个-d就是指创建后在后台跑,-p 80:80就是指将容器内部的 80 端口映射到本机的 80 端口,在访问本机 80 端口时就会访问到 nginx 容器里的 80 端口的信息,可以写多个-p,例如-p 80:80 -p 81:81就是映射多个端口
运行nginx容器示例
进入nginx容器
使用nginx启动 nginx 服务
启动nginx服务
然后访问服务器 ip 就可以看到了
查看页面示例
nginx 配置的话就不在这说了。。。

操作容器

  1. 退出容器
    进入容器内部后可以使用ctrl+d或输入exit或输入ctrl+p+q退出容器
    如果进入容器的时候使用exec进入的,退出时容器不会停止
    如果直接run进入的容器,使用ctrl+dexit退出容器时,容器会停止,使用ctrl+p+q不会停止
    我这里举例刚才使用了一次-d,所以使用exec进入的,退出时容器不会停止
    退出容器后查看运行容器

  2. 进入已退出但还在后台运行的容器
    使用docker attach 容器ID或者使用docker exec -it 容器ID /bin/bash进入已退出的容器
    区别:使用attach进入容器,退出容器时容器会停止,使用exec进入容器,退出时容器不会停止
    attach进入容器退出示例
    exec进入容器退出示例

  3. 停止已退出但是还在后台运行的容器
    使用docker stop 容器ID停止已经退出但是还在运行的容器
    停止已经退出但是还在运行的容器示例
    另外还有一个命令是docker kill 容器ID也是停止运行的容器
    区别:使用stop是让容器自行停止,kill是强制停止,就像电脑的关机和拔电源一样(应该吧)

  4. 删除已停止的容器
    使用docker rm 容器ID
    在这里插入图片描述

  5. 删除还在运行的容器
    这个时候还用上面的方法删除会报错,提示容器还在运行,如果想要直接删除的话要带上-f
    使用docker rm -f 容器ID
    删除还在运行的容器示例

  6. 启动已停止的容器
    使用docker start 容器ID启动已停止的容器
    启动已停止的容器示例

  7. 删除所有已停止的容器
    使用docker rm $(docker ps -aq)删除所有已停止的容器,使用rm -f的话是删除所有容器
    使用docker rm是删除,使用docker ps -aq是获取所有容器的 ID
    $()在其他地方也可以用,例如停止所有,启动所有
    删除所有已停止的容器示例

操作镜像

  1. 删除镜像
    使用docker rmi 镜像ID删除镜像,i应该是image的意思吧,所以是删除镜像
    删除镜像示例
    加上-f删除正在使用的镜像,例如被容器使用,不管容器有没有停止都是使用中
    删除正在使用的镜像
    使用docker images -a查看已经没有镜像了
    查看所有镜像
    但是使用docker ps -a查了一下那个使用了 nginx 镜像的容器还在,试了一下可以正常启动,还可以正常使用,这个应该是容器和镜像的使用关系,这个没搞懂不乱说了,一般删除时应该先删除容器,再删除镜像
    查看容器列表

配置 nginx

重新拉了一下 nginx 镜像,然后使用docker run -it -d -p 80:80 -p 81:81 nginx /bin/bash生成容器映射 80 和 81 端口
生成nginx容器
使用docker exec -it 67e5d51670e0 /bin/bash进入容器
进入容器
切换镜像源地址,不然apt-get update慢,下载东西也慢,切换可以参考apt-get update 太慢,如何解决,里面有写 docker 镜像里面如何更改镜像源
切换镜像源示例
apt-get update更新镜像源
更新镜像源
使用apt-get install vim下载 vim 编译器
过程报了个错

The following packages have unmet dependencies:
 ncurses-base : Breaks: libtinfo5 (< 6.1) but 6.0+20161126-1+deb9u2 is to be installed
E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.

缺少依赖报错
说什么没有满足的依赖项,这种缺啥装啥就行,这里看到少libtinfo5,就用apt-get install libtinfo5安装
填写示例
确认安装的时候一个字符都不能输错,包括英文逗号感叹号和空格
安装完成后安装 vim,然后使用 vim 配了一下 nginx,然后在相应文件下创建 index.html 写些东西测试
配置nginx示例
启动 nginx
nginx测试示例
nginx测试示例
完事,这个就相当于自己做完的东西,想做成自己的镜像,方便交付转移或保存

生成自己的镜像

docker commit -m="注释" -a="作者" 容器ID 要创建的镜像的名字:[版本号]

使用 docker ps 查看容器,这个容器就是刚才被操作的容器,装了 vim,写了文件
查看容器列表
使用docker commit -m="添加vim,配置80、81端口的nginx" -a="sywdebug" 67e5d51670e0 my_nginx生成镜像
生成镜像
然后使用docker images查看就可以看到生成的 my_nginx
查看镜像列表
然后停止原来的容器,使用docker run -it -d -p 80:80 -p 81:81 my_nginx /bin/bash生成一个新的容器使用 my_nginx 镜像
生成容器使用新生成的镜像
然后进入容器
进入容器
可以看到是有之前使用创建的文件夹的
查看文件列表
启动 nginx
测试示例
可以正常访问

推送镜像到私有云

此处我使用的是腾讯云的容器镜像服务
首先新建命名空间
新建命名空间
然后新建镜像仓库
新建镜像仓库
创建完成后可以看到仓库右侧右快捷指令
仓库列表
快捷指令
可以看到有登陆,拉取镜像,推送镜像,上面我已经生成了自己的镜像,现在将镜像推送到仓库里

首先使用登陆指令登录腾讯云容器镜像服务 Docker Registry,登录时要输入密码,密码好像是启动容器镜像服务时设置的,因为我这个之前弄过忘记是不是了,如果不记得登陆密码可以在腾讯云控制台的容器镜像服务的实例管理重置登陆密码
登录腾讯云容器镜像服务 Docker Registry
查看一下镜像的 ID
查看镜像ID
使用向 Registry 推送指令的第一条docker tag 5fe746e6ea98 hkccr.ccs.tencentyun.com/sywdebug/my_nginx创建一个标签标记
然后再次查看,可以看到多出一个镜像
创建标签标记
然后使用推送的第二条指令docker push hkccr.ccs.tencentyun.com/sywdebug/my_nginx推送到仓库
我这里前面推送过一次,所以这里提示layer already exists,但是也已经推送上去了
推送镜像到仓库
查看腾讯云容器镜像服务刚刚创建的仓库 my_nginx,里面有一条记录
在这里插入图片描述
至此,推送完成

从仓库拉取镜像测试

因为我 windows 电脑上也是有装 docker 的,所以拉下来测试一下
先登录腾讯云容器镜像服务 Docker Registry
登录腾讯云容器镜像服务 Docker Registry
然后使用从 Registry 拉取镜像指令docker pull hkccr.ccs.tencentyun.com/sywdebug/my_nginx拉取镜像
从 Registry 拉取镜像
可以看到已经拉下来了
查看镜像列表
生成容器运行一下这个镜像
生成容器运行my_nginx镜像
进入容器查看,可以看到没什么问题
进入容器查看
用 vim 查看 nginx.conf 配置也是没问题
nginx配置
这里 nginx 就不启动了,因为上面配置了域名而不是使用 127.0.0.1,而域名是解析到服务器,这里启动也是访问不到,整体来说 docker 镜像推拉仓库没什么问题

容器数据卷

提示

Docker 挂载主机目录访问如果出现cannot open directory:Permission denied,表示没有权限
解决:在挂载目录后加一个--privileged=true参数即可,开启这个容器内才拥有真正的 root 权限,否则容器内的 root 只是外部的一个普通用户权限

使用

容器数据卷作用是将 docker 容器内的目录映射到宿主机的目录,众所周知,容器被删除后里面的数据都没有了,使用容器数据卷可以实现数据的持久化到本地主机目录,方便备份数据,容器卷更改实时生效
运行一个带有容器卷存储功能的容器实例

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内的目录 镜像名

-v 也可以像上面的端口映射-p 一样使用多个,也就是挂载多个目录

举例:
使用以下命令运行一个镜像为 ubuntu 并且带有数据卷的容器,容器将 docker 内部的/tmp/docker_data 映射到宿主机的/tmp/host_data 目录

docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data ubuntu

可以看到 docker_data 目前为空,宿主机的 host_data 也为空
docker_data目录
host_data
然后在 docker 内部的 docker_data 创建一个文件
创建docker_file文件
然后查看宿主机的 host_data 目录的文件,可以看到 docker 内部创建的这个文件
host_data目录
在宿主机的 host_data 创建一个文件
创建host_file文件
然后查看 docker 内部的 docker_data 目录的文件,可以看到宿主机创建的这个文件
docker_ddata目录
就像是 vue 的双向绑定一样
docker 修改,主机同步获得
主机修改,docker 同步获得
docker 容器 stop,主机修改,docker 依然获得

查看是否挂载

使用docker inspect 容器ID可以查看是否挂载成功
查看容器挂载信息

权限
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内的目录 镜像名

上面默认创建命令是 docker 容器对于映射目录可读可写 rw(read write),相当于

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内的目录:rw 镜像名

如果要让 docker 容器对于映射目录只可读,可以将权限改为 ro(read only)

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内的目录:ro 镜像名

修改为仅可读,再进行写操作就会提示Read-only file system

继承
docker run -it --privileged=true --volumes-from 容器ID 镜像名

--volumes-from是父类的意思,也就是继承于哪个容器,按上面命令运行容器,父类容器什么样,这个新创建的就什么样,容器卷等等也是相同的
举例

当然,我会帮助你记录学习Docker的知识点。下面是一份Docker学习笔记: 1. 什么是DockerDocker是一个开源的容器化平台,可以帮助开发者创建、打包、部署和运行应用程序,使应用程序可以在不同的环境中无缝运行。 2. Docker的优势有哪些? - 轻量化:Docker容器与虚拟机相比更加轻量级,启动和停止速度更快。 - 可移植性:Docker容器可以在任何支持Docker的平台上运行,无需担心环境不一致的问题。 - 隔离性:Docker使用容器技术进行隔离,每个容器之间相互独立,不会相互影响。 - 效率:Docker可以将应用程序及其依赖项打包为一个镜像,部署和扩展非常方便。 3. Docker常用的概念: - 镜像(Image):一个只读的模板,包含了运行应用程序所需的所有文件和依赖项。 - 容器(Container):基于镜像创建的可执行实例,可以运行、停止、删除等操作。 - 仓库(Registry):用于存储和分享镜像的地方,常用的有Docker Hub。 - Dockerfile:用于定义镜像构建过程的文本文件,包含了一系列的指令和配置。 4. Docker基本使用命令: - `docker pull <image-name>`:从仓库中拉取指定镜像。 - `docker run <image-name>`:创建并运行一个新的容器。 - `docker ps`:查看当前正在运行的容器。 - `docker stop <container-id>`:停止指定容器的运行。 - `docker rm <container-id>`:删除指定容器。 - `docker rmi <image-name>`:删除指定镜像。 5. Docker常见应用场景: - 镜像管理:可以通过Docker镜像进行应用程序开发、测试和部署。 - 微服务架构:通过容器化实现应用程序的模块化,方便管理和扩展。 - CI/CD:在持续集成和持续部署过程中使用Docker来构建、测试和发布应用程序。 这些是Docker学习过程中的一些基础知识点和常用命令。希望对你有帮助!如果你还有其他问题,可以随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值