Docker必知必会

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云防火墙,500元 1000GB
简介: 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


相关文章
|
3月前
|
存储 运维 安全
docker使用
总之,Docker 的使用为软件开发和部署带来了极大的便利。通过合理地运用 Docker 技术,可以提高开发效率、降低运维成本、增强系统的稳定性和可扩展性。随着技术的不断发展,Docker 将在更多领域发挥重要作用,成为现代软件开发和运维的重要工具之一。
126 63
|
3月前
|
Linux 网络安全 文件存储
docker中使用opwrt详解
在docker中配置opwrt
260 5
|
9月前
|
存储 运维 持续交付
Docker 是什么
Docker 是什么
|
5月前
|
安全 Linux 虚拟化
Docker到底是什么?为什么它这么火!
如果你是数据中心或云计算IT圈子的人,这一年多来应该一直在听到普通的容器、尤其是Docker,关于它们的新闻从未间断过。
68 9
|
9月前
|
关系型数据库 MySQL Linux
初识 Docker
在这个快速发展的技术时代 , 我们经常面临着应用部署的复杂性、环境差异以及不同操作系统之间的兼容性问题 . 这些问题不仅消耗大量时间 , 还可能导致项目延期和成本增加 . Docker 的出现解决了我们在应用部署过程中遇到的障碍和挑战 . 通过将应用程序及其依赖环境封装在一个轻量级的、可移植的容器中 , Docker 不仅简化了开发和部署流程 , 还确保了不同环境间的无缝衔接和一致性 .
87 9
|
9月前
|
关系型数据库 MySQL Shell
|
关系型数据库 MySQL Docker
|
数据可视化 应用服务中间件 nginx
|
9月前
|
运维 Java 虚拟化
[Docker] Docker为什么出现
[Docker] Docker为什么出现