Docker最新超详细教程——基本操作
需求:进入Nginx容器,修改HTML文件内容,添加“你好 Harmony3.0”
需求:创建一个nginx容器,修改容器内的html目录内的index.html内容
Docker最新超详细教程——基本操作
一、镜像操作
镜像名称
镜像的名称组成为2个部分:[repository]:[tag]。在没有指定tag时,默认是latest,代表最新版本的镜像。
注意:mysql:5.7 与 mysql:8.0 是两个不一样的镜像!!!
镜像命令
docker镜像操作的命令无非就是CRUD。
常见的镜像操作命令如下所示:
- docker build
- docker push
- docker pull
- docker images
- docker rmi
- docker save
- docker load
在本地获取镜像有两种方法:
(1)docker build:可以从本地获取,通过DockerFile的文件,将其构建成一个镜像
(2)docker pull:从服务器中拉取一个镜像(常用!)
想知道本地镜像的情况:
(1)docker images:查看镜像
(2)docker rmi:删除不需要的镜像
想把镜像分享给本人:
(1)docker push:将其上传到镜像服务器,可供本人拉去
(2)docker save、docker load:先将其打成压缩包,发送出去,再将压缩包加载为镜像
命令很多,不一定全都可以记住,但是我们可以使用help命令查看。
如果想看具体哪一个命令的参数有什么
docker images --help
案例一:拉取、查看镜像
我们可以先登入DockerHub,搜索想要拉取的镜像(以nginx为例)
先在Centos上启动Docker
sudo systemctl start docker
再执行pull拉取命令
sudo docker pull nginx
运行结果如下
查看刚刚拉取下来的镜像信息
sudo docker images
案例二:保存、导入镜像
需求:利用docker save将nginx镜像导出磁盘,然后再通过load加载回来
我们可以先查看一下save保存命令的要求。
option表示参数,例如这里的 -o 就是指定输出的文件路径;image表示导出的是哪一个镜像。
sudo docker save -o nginx.tar nginx:latest
运行截图如下
说明这样子已经导出成功了。
然后我们将docker中的nginx镜像删除
sudo docker rmi nginx:latest
再使用docker load命令将本地的nginx镜像推送到docker
我们也可以先看看load命令的帮助文档:
其中:-i表示要上传的文件名;-q是否打印日志。
sudo docker load -i nginx.tar
二、容器操作
我们在之前的章节中提到了容器这一概念,想必大家都知道了容器与镜像的异同,我们在这里就不赘述了。
容器相关命令
docker run:创建并运行一个容器,处于运行状态
docker pause:让一个运行的容器暂停
docker unpause:让一个容器从暂停状态恢复运行
docker stop:停止一个运行的容器
docker start:让一个停止的容器再次运行
docker rm:删除一个容器
docker exec:进入容器执行命令
docker logs:查看容器的运行日志
docker ps:查看所有的容器和运行状态
容器三个状态
-
运行:进程正常运行
-
暂停:进程暂停,CPU不再运行,并不释放内存
-
停止:进程终止,回收进程占用的内存、CPU等资源
暂停与停止有什么差别?
两者的差别在于操作系统层面!
如果容器处于暂停状态,操作系统会将容器中的进程挂起,容器关联的内存暂存下来,CPU不再执行这个进程;如果我们将其恢复,进程就会直接运行,内存空间恢复,程序继续运行。
如果容器处于停止状态,操作系统会将容器中的进程“杀死”,容器关联的内存回收下来,只有文件系统会被保留下来。如果我们还需要,只能重新start一个新的进程(容器),可以形象的理解为“投胎”。
案例一:创建并运行一个容器(nginx)
需求:创建并运行nginx容器的命令
docker run --name containerName -p 80:80 -d nginx
由于该命令比较复杂,我们可以通过查看DockerHub来创建:Nginx - 官方图片|Docker Hub
我们可以用官网描述的这个方式来创建
命令解读
默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。
容器是对外隔离的,任何请求来访问容器都会被拒绝, 所以我们这边将容器与主机的端口做映射,用户通过访问主机的端口来间接访问容器。
详细步骤
(1)创建一个名为 nginxname 的容器
首先我们已经有了nginx的镜像(没有的话先创建...)
docker run --name nginxname -p 80:80 -d nginx
容器名为 nginxname ,端口映射为80:80,镜像名称为nginx
(2)访问nginx容器
然后我们就可以通过 IP + 端口 的方式访问
(3)查看日志
使用 docker logs nginxname(容器名)查看日志
由于我们刚刚有对nginx进行访问,所以这里就会有GET请求的日志。
案例二:进入容器,修改文件
需求:进入Nginx容器,修改HTML文件内容,添加“你好 Harmony3.0”
命令解读
docker exec -it mn bash
docker exec :进入容器内部,执行一个命令
-it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
mn :要进入的容器的名称
bash:进入容器后执行的命令,bash是一个linux终端交互命令
详细步骤
(1)进入容器内部
我们已经进入了nginx容器内部,可以发现它的内部是有一套文件系统的。我们要实现上面的需求还需要了解nginx容器内部结构,如何了解?当然是通过查阅DockerHub官方文档啦!
(2)查看DockerHub官网
我们可以发现它的静态文件放在 /usr/share/nginx/html,直接进入
(3)修改index.html
容器内没有vi命令,无法直接修改,我们用下面的命令来修改
sed -i -e 's#Welcome to nginx#你好 Harmony3.0#g' index.html
sed -i -e 's#<head>#<head><meta charset="utf-8">#g' index.html
在次访问,如下所示: 修改成功!!!
其它命令Test
停止容器stop && 查看容器ps
学习完上面的两个案例,Docker的命令大体都了解了,但是还有几个在上面的案例中没有用到,我们现在就在来演示一下!
我们先将之间创建的名为nginxname容器停止
docker stop nginxname
此时如果我们只是使用docker ps不加参数的话是查看不到该容器的!
可以看看 docker ps --help 中的面描述
我们要加上 -a 这个参数就可以看到刚刚停止的容器了!!!
docker ps -a
删除容器rm
(我们先将stop的容器启动),直接使用rm删除,可以发现失败了
通过查看,想要加上参数 -f 表示强制执行!
docker rm -f nginxname
或者在nginxname处于 stop状态 的时候,可以直接 rm 掉!!!
小结
docker run命令的常见参数有哪些
-
--name:指定容器名称
-
-p:指定端口映射
-
-d:让容器后台运行
查看容器日志的命令
-
docker logs
-
添加 -f 参数可以持续查看日志
删除容器命令rm
-
docker rm nginxname:只能删除处于stop状态的容器
-
docker rm -f nginxname:强制删除!
查看容器状态
-
docker ps
-
docker ps -a 查看所有容器,包括已经停止的
三、数据卷(容器的数据管理)
目前存在的问题
在之前的nginx案例中,修改nginx的html页面时,需要进入nginx内部。并且因为没有编辑器,修改文件也很麻烦。
我们对一个容器进行了修改,这些修改都是对外不可见的,时间久了,你会忘记曾经改了什么东西!并且,当你想创建一个与之一模一样的容器,你可能要把之前的修改操作重新做一遍!
这就是因为容器与数据(容器内文件)耦合带来的后果。
要解决这个问题,必须将数据与容器解耦,这就要用到数据卷了。
什么是数据卷?
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。
这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了。
所以上面提到的3个问题就都解决了!!!
- 修改宿主机文件系统,就相当于修改了容器。
- 支持多个容器的数据共享,将两个容器挂载同一个数据卷
- 不小心删除了容器,但是并不会删除数据卷,只要重新创建一个容器,再挂载到之前的数据卷数据就可以恢复!(共享之前的旧数据卷)
数据集操作命令
数据卷操作的基本语法
docker volume [COMMAND]
-
create 创建一个volume
-
inspect 显示一个或多个volume的信息
-
ls 列出所有的volume
-
prune 删除未使用的volume
-
rm 删除一个或多个指定的volume
案例一:CRUD数据卷
需求:创建一个数据卷,并对其进行CRUD
(1)创建数据卷
docker volume create html
(2)查看所有数据
docker volume ls
(3)查看数据卷详细信息卷
docker volume inspect html
可以看到这就是数据卷的详细信息了!Mountpoint 表示的是挂载点。
(4)删除未使用的数据卷
方法一:prume
docker volume prune
由于我们刚刚只是创建了名为 html 的数据卷,还未进行使用,故会被删除。
方法二:rm
docker volume rm html
所以可以使用rm删除指定的数据卷。
案例二:数据卷挂载到指定容器
需求:创建一个nginx容器,修改容器内的html目录内的index.html内容
在上面个案例中,我们进入nginx容器内部,已经知道nginx的html目录所在位置/usr/share/nginx/html ,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。
命令解读
运行容器时使用 -v 参数挂载数据卷
详细步骤
(1)创建容器并挂载数据卷到容器内的HTML目录
docker run --name nginxname -v html:/usr/share/nginx/html -p 80:80 -d nginx
执行上述命令,假如在创建容器的时候没有数据卷,做数据卷挂载时,docker会自动创建一个数据卷!
(2)进入html数据卷所在位置,并修改HTML内容
# 查看html数据卷的位置
docker volume inspect html
(3)修改方式
我们进入上述目录,可以使用vim修改文件内容了!!!
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
但是这里我们还要提一下,此处推荐使用第三方工具——FinalShell
进入相应的目录,然后可以看见下图:
然后选择index.html右键打开直接修改即可!!
注意点
Finallshell软件本身有一个小坑!如果在打开文件的过程中出现了下面的这一种情况,大多数是因为权限所导致的!
chmod 777 /var/lib/docker/volumes/html
如果还是不能解决,应该就是sftp的问题,取安装一个破解版吧.......