Docker必知必会

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Docker必知必会

一、安装docker



这里介绍在centos7系统上的docker安装,linux中不同系统不同版本安装docker都会有些差异。

具体步骤见后面链接:centos7中docker的安装


二、镜像的所有操作



这里介绍镜像操作的增删改查,这是docker中比较频繁的操作之一。做这些操作之前请正常安装完成docker并启动。使用docker version可查看是否正常启动了docker。


1.增加镜像(拉取镜像 )


docker image pull nginx:tag 
# *****************************************实战分割线*****************************************
#举例子:拉取nginx的最新版本镜像
docker image pull nginx:latest 
docker pull nginx:latest  


docker image pull 命令主体,其中image是可以省略的,在整个命令中nginx是镜像的名称,tag是版本号,他们使用冒号隔开。如果不显示指定tag时,则默认拉取最新版本也就是latest版本。


2.删除镜像


docker rmi 镜像:tag
docker image rm 容器名/容器id
# *****************************************实战分割线*****************************************
#举例子:删除tag为latest的nginx的镜像
docker rmi nginx:latest
#举例子:删除id为612开头的镜像(通过612能确认唯一id)
docker image rm 612
#举例子:强制删除id为612开头的镜像(即使镜像在使用也会删除)
docker image rm -f 612


这两个删除命令等价,都可以用来删除镜像,他们没有任何区别。只有使用容器名和id来做删除时会有区别。使用镜像名删除时只会删除当前镜像,不会删除与该镜像名同源的镜像,但是同源镜像的id都是相同的,所以若是使用id删除就会删除所有同源镜像。上面的示例中-f是强制的意思。这与linux的命令基本都是一致的。一般删除时还是建议使用镜像名来删除,若是使用id很可能会同时删除了多个镜像。


3.修改镜像


docker tag nginx:latest mynginx:3.3.3 
# *****************************************实战分割线*****************************************
#举例子:将latest版本的nginx更名为3.3.3版本的mynginx,更改后原先的镜像会依然存在
docker tag nginx:latest mynginx:3.3.3 
#举例子:使用该命令可以查看所有的镜像
docker images 


为本地镜像添加新的标签,本地镜像只能改镜像名称和标签,其他改不了。修改以后会出现一个新的镜像,这个镜像和原先的镜像其实都是一个镜像的不同名称而已。他们本质上还是一个。这就像java中一个对象有多个引用一样,也可以类比spring中为bean起的别名,其实他们指向的都是一个镜像。


4.查询镜像


docker images # 查询本地所有的镜像
docker image ls # 查询本地所有的镜像
docker image inspect nginx:latest # 查看本地tag为latest的nginx镜像的所有信息
docker inspect nginx:latest # 查看本地tag为latest的nginx镜像的所有信息
docker search nginx
# 举例子:查询标星在200以上的nginx
docker search -f=stars=200
docker search --filter=stars=200 nginx 


上面介绍了三个命令,分别是查看本地所有镜像的命令images、查看本地镜像详细信息的命令inspect、查看远端所有镜像的命令。使用的话也就是上面介绍的那样了。


三、容器的所有操作



这一章节介绍关于容器的所有操作,当然这里的操作介绍的并不是非常全,但是作为基础使用基本够了。


1.增加容器


docker create -it centos:centos8 # 创建一个tag为centos8的centos容器
docker run -it centos:centos8 /bin/bash
# *****************************************实战分割线*****************************************
docker create -it centos:centos8 
docker start 容器名/id
docker run -it -d centos:centos8 /bin/bash
docker ps -a # 查看本地的所有容器
docker ps # 查看所有运行中的容器


docker create和docker run命令需要说明的是,本地若是不存在该镜像,会先去远端拉取该镜像然后才会创建容器。docker run命令相当于docker create + docker start。所以说docker run是创建并启动。需要注意的是五路哪种方式创建的容器只要使用exit退出容器后,容器就会停止。


-it选项让 Docker 分配一个伪终端并绑定到容器的标准输入上,则让容器的标准输入保持打开。但是如果不连接这个终端是看不出效果的。


-d 让容器以守护进程的方式运行。容器以什么状态运行都是在创建容器时指定的,容器一旦创建完成则不能更改,若是想更改容器的运行方式只能是删除容器然后重新建立。

/bin/bash 创建容器的同时,打开一个bash终端。


2.删除容器


docker pause 容器名/id,#暂停容器,不会删除容器,应该还可以重新启动。
docker unpause 容器名/id, #取消暂停,此时容器会恢复运行状态。
docker stop 容器名/id #暂停容器的运行
docker kill 容器名/id  #这是直接杀死容器
docker container prune #删除所有不在运行状态的容器。
# docker rmi (删镜像)、docker image rm(删除镜像),这俩命令与下面命令不一样需注意。
docker rm -f 容器名/id #强制删除容器,正在运行也会删除。


此命令区别与容器的删除与镜像没有关系,事实上容器是在只读镜像的基础上增加了一些操作数据而已。这也就是常说的镜像和容器的结构是分层的。


需要注意的是docker stop命令会经过两个阶段,该命令会首先向容器发送 SIGTERM 信号,等待一段超时时间后(默认为 10 秒),再发送SIGKILL 信号来终止容器,所以stop命令并不会立即停止容器,但是docker kill 命令则会立即杀死容器。


3.修改容器


严格意义上来说容器是不可以修改的,这里所指的修改是进入到容器内部,可以对容器内部进行一些操作。我们可以将容器看成虚拟机里装了某个镜像然后构成了容器。我们可以进入到这个容器然后然后修改这个虚拟机的配置项。这里就介绍到如何进入到容器内部。

docker attach 容器名/id
docker exec -it 容器名/id /bin/bash
#举例子:使用attach命令通过redis容器id进入到容器内部
docker attach 3b93 # 3b93是redis容器的id
#举例子:使用exec命令进入到redis容器的内部
docker exec -it 3b93 /bin/bash


注意进入容器后使用exit退出时,容器就会停止。默认退出方式是ctrl+p、ctrl+q(这里注意这两个都需要执行的,先执行ctrl+p再执行ctrl+q才可以正常退出容器 ),退出时不影响容器的正确运行。不过也可以指定退出的快捷键,没什么意义,使用默认就好。不过attach命令有个很明显的缺陷,就是所有连接 到容器的客户端都是同步显示的,也就是一个终端执行命令,所有都会看到,一个终端卡住了,所有终端也会卡

住,这样总感觉不对,好像是单线程同步操作,对于多个连接来说,自己的操作很容易被打断,所有又有了exec命令。这个命令是异步的,各个终端谁操作谁的,互不影响。可以看出是多线程应用。这里的-it与创建容器的-it都是一样 的作用就是创建一个伪终端然后保持打开,上面说只能在创建容器时使用-it是对于exec命令出来之前的docker来说的。并且exec -it id /bin/bash 是推荐的打开方式。默认退出方式都是一致的都是:ctrl+p、ctrl+q。


4.查看容器

docker ps -a # 查看所有容器,包含停止运行和正在运行的容器
docker ps # 查看正在运行的所有容器
docker container inspect 容器名/id  # 查看某容器的具体信息
docker top 容器名/id # 这里的top与linux系统的top命令类似
docker stats 容器名/id # 查看容器中内存、cpu等的使用情况
docker container port 容器名/id # 查看容器内的端口映射情况


这里第一、二个和最后一个可能会比较常用,第一、二个没啥需要多余声明的,最后一个命令使用时docker container port是命令,后面跟容器的id或者名称即可。


5.启动容器


docker start 容器名/id # 使用create命令创建的容器默认是关闭的,需要启动,还有容器一旦执行stop后也需要使用start启动。
docker restart 容器名/id # 重启运行中容器。
docker run -it 镜像:tag /bin/bash # 创建一个容器并运行他,并通过bash打开一个终端。


这三个是比较常用的命令,第一个是启动容器,第二个是重启,第三个是创建加启动,docker run相当于docker create 加 docker start命令的组合。


6.容器的状态:


Created : 创建后未运行过,使用create命令。

Up : 正在运行,使用run、start、unpause等命令

Up paused :被暂停,使用了pause命令

Exited :退出了,执行stop,或者bash中使用exit


四、docker使用常见问题



1.docker的登录


不登录其实并不影响我们从docker官网下载镜像,只是我们不登录便不能上传自己的镜像了,若是想要将自己的镜像上传到远端仓库则是需要登录的,登录页比较简单。

docker login # 然后根据提示输入用户名和密码即可。


2.配置阿里云镜像加速


详情请参考这篇文章:阿里云镜像加速


3.端口映射问题


# 下面是创建并打开mysql容器的典型命令,其中-p便是作端口映射使用的,-p后面冒号左面是宿主机端口,后面则是容器的占用端口。
docker run -d -e MYSQL_ROOT_PASSWORD=password --name=mymysql -p 3306:3306 mysql:5.7 


尤其需要注意宿主机端口是否放行了,若是不放行累死也是访问不到的,最开始可以先用telnet命令测试下端口是否可以正常访问,若是不支持telnet命令请看第5部分,telnet不通就可以查看防火墙了,请看第4部分。


4.防火墙放行端口问题


下面列出了防火墙的常用操作命令,以供参考。

sudo systemctl status firewalld # 查看防火墙是否运行,若是运行会显示running
sudo firewall-cmd --list-ports #查看端口有没有被防火墙放行,若是没有对应端口则说明未放行。
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent # 放行3306端口,然后一定要重启防火墙
sudo systemctl restart firewalld.service # 重启防火墙
sudo firewall-cmd --list-ports # 再次查看端口有没有放行成功,下面出现3306就表示成功了
# 部分参数解释
# –zone 用以标识该端口放行的范围
# --add-port=3306/tcp 标识端口与通讯协议
# --permanent 标识重启放行依然生效


5.容器不支持telnet命令


参考这位大佬的文章:linux下安装telnet命令


6.容器不支持ps命令


以下是ps的安装命令


apt-get update && apt-get install procps


7.容器不支持vim命令


以下是安装vim命令的命令

apt-get update
apt-get install vim


相关文章
|
Linux
Linux下安装中文输入法总结
Linux下安装中文输入法总结
4991 0
|
2月前
|
人工智能 数据可视化 数据挖掘
一个悄然崛起的国产软件,AiPy已开源
当前AI大模型虽智能飙升,却难落地日常。AiPy另辟蹊径,为LLM接上“手脚”,打通Python执行环境,让其真正自动分析数据、生成图表、完成任务,实现从“思考”到“行动”的闭环,被誉为“中国版Manus”,获1.9k星好评。
|
2月前
|
机器学习/深度学习 数据采集 自然语言处理
Python 常用的第三方库
Python 常用的第三方库
388 0
|
人工智能 安全 芯片
【通义】AI视界|谷歌 Tensor G5 芯片揭秘:1+5+2 八核 CPU,支持光线追踪
本文由【通义】自动生成,涵盖黄仁勋宣布台积电协助修复Blackwell AI芯片设计缺陷、苹果分阶段推出Apple Intelligence、OpenAI保守派老将辞职、英伟达深化与印度合作推出印地语AI模型,以及谷歌Tensor G5芯片支持光线追踪等最新科技资讯。点击链接或扫描二维码,获取更多精彩内容。
|
存储 NoSQL 算法
全链路营销|基于事件驱动的流程编排系统
本文主要介绍了 AE 策略中心的技术方案选型与落地实战。
|
编解码 供应链 搜索推荐
虚拟现实与教育:沉浸式学习的潜力
【10月更文挑战第2天】虚拟现实(VR)技术正在革新教育领域,通过沉浸式体验提升学习效果和兴趣。本文探讨了VR在教育中的应用潜力,特别是在历史、地理、自然科学和语言教育中的案例。虽然面临设备成本和技术支持等挑战,但随着技术进步和成本降低,VR有望成为教育的重要工具,带来更丰富的学习体验。
|
监控 安全 算法
云上智能风控:构建金融安全的智能防线
云上智能风控系统具有良好的灵活性和可扩展性。随着金融市场的不断变化和技术的不断发展,系统能够灵活调整风控策略和算法模型以适应新的风险类型和场景。同时,系统还能够根据业务需求进行功能扩展和升级以满足不同金融机构的个性化需求。
960 7
|
移动开发 安全 前端开发
uniapp打包iOS应用并通过审核:代码混淆的终极解决方案 ✨
本篇博客将教你如何使用 JavaScript-obfuscator 插件来一键发行和混淆 iOS 上的 uniapp 代码。通过安装插件、创建运行脚本,并执行混淆操作,你将能够轻松通过审核,提高应用程序的安全性。🔒
|
人工智能 数据可视化 物联网
vivo AI全球研究院 BlueLM-7B系列开源!魔搭社区最佳实践教程来了!
BlueLM 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型,本次发布包含 7B 基础模型、7B 对话模型,4bits量化的7B对话模型,支持 32K 的长文本基础模型和对话模型。
|
缓存 Ubuntu Unix
统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序
在ubuntu上发布qt程序相对还好,使用脚本,但是在统信UOS麒麟上发布的时候,因为银河麒麟等不同版本,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的效果,使用linuxdeployqt发布qt程序。
27495 7