文章目录
三、Docker的基本操作
先来两张图,可以当做笔记复习用:
图1、Docker镜像的常用操作指令:
图2、Docker容器的常用操作指令:
了解Docker操作镜像之前,首先普及一下镜像的命名规范:
镜像名称一般由两部分组成:[repository]:[tag],例如8.0版本的mysql,就是 mysql:8.0,而如果我们没有指定tag的话,那么默认是最新版本。
镜像操作命令:
命令 | 描述 |
---|---|
docker build | 根据Dockerfile构建本地镜像 |
docker pull | 从镜像服务器拉取镜像 |
docker push | 将本地镜像推送到镜像服务器 |
docker images | 查看本地镜像 |
docker rmi | 删除镜像 |
docker save | 将本地镜像保存为一个压缩包 |
docker load | 将压缩包加载成一个镜像 |
要想详细查看某个命令的用法,可以使用 docker [相应命令] --help
进行查看,例如,我想知道 docker save 的用法,那么我可以使用命令 docker save --help
,如下:
文档告诉我们,docker save 后面可以跟options,而该options的可选项就是最下面的 Options,这里只有一个 -o,这个 -o 表示把他写到一个文件来替代输出到控制台。然后后面是镜像文件的名称(记得命名规范:[repository]:[tag])。
下面,我们就试着跑一下吧。
首先是,从镜像服务端拉取镜像(点击这里进入DockerHub官网)。我们以Nginx为例:
点击,进入上图中的Docker官方镜像页面,可以看到他告诉我们可以使用指令docker pull nginx
直接拉取最新版的Nginx官方镜像文件。
如果要指定某个版本可以往下拉,有一个Supported tags and respective Dockerfile links,里面的版本都是可以指定下载的,这里我们指定一下,下载那个1.22版本。
在Linxu中使用命令docker pull nginx:1.22
进行镜像文件的拉取。
然后我们输入docker images
查看我们本地的镜像文件。
然后我们再使用命令docker save -o nginx1.22.tar nginx:1.22
拷贝我们的nginx1.22镜像文件成一个压缩包。(可以看到,我们打包了一个叫nginx1.22.tar的压缩包)
然后我们先使用命令docker rmi nginx:1.22
删除本地的nginx:1.22的镜像文件,然后再用docker images
命令查看现在的本地镜像,确保真的有把刚才的nginx:1.22镜像删除干净:
接着,我们使用命令docker load -i nginx1.22.tar
解压我们刚才的nginx1.22.tar成镜像。然后使用docker images
查看当前的本地镜像如下:
容器操作命令:
介绍容器的操作命令前,首先我们介绍一个容器的三个状态。
- 运行:占用CPU资源和内存资源
- 暂停:暂存到内存,但不再分配CPU资源
- 停止:杀死进程(不再分配内存和CPU资源)
命令 | 描述 |
---|---|
docker run | 创建容器,此时容器处于运行状态 |
docker pause | 暂停容器(运行 -> 暂停) |
docker unpause | 恢复容器的运行状态(暂停 -> 运行) |
docker stop | 停止容器(运行 -> 停止) |
docker start | 再次运行容器(停止 -> 运行) |
docker rm | 删除容器 |
docker ps | 查看所有运行的容器和容器的状态 |
docker logs | 查看容器的运行日志 |
docker exec | 进入容器执行命令 |
案例一、创建并运行Nginx容器
这里由于启动容器的命令比较长,建议在DockerHub官网查看他是怎么运行容器的。我们要启动Nginx容器,我们就找到Nginx镜像,然后再到它里面,往下拉,找到标题为How to use this image的内容。
这里以一句比较简单的为例,并解释下其中的参数:
docker run --name tmp-nginx-container -p 80:80 -d nginx
- docker run:表示的是启动容器
- –name tmp-nginx-container:表示该容器名,我们打算叫他tmp-nginx-container
- -p 8090:80:表示将宿主机端口与容器端口进行映射,冒号左侧表示宿主机端口号,冒号右侧表示容器端口号,即当用户访问宿主机的8090端口时,就映射到容器的80端口。
- -d nginx:表示我们以nginx:lastest(默认为:lastest)为镜像
因此,我们现在如果要启动一个nginx1.22的容器,名称我们就叫myNginx,使用宿主机的8090端口号映射到容器的80端口号,那么命令如下:
docker run --name myNginx -p 8090:80 -d nginx:1.22
此时,我们使用命令docker ps
可以看到容器成功运行。
然后,我们让防火墙把宿主机的8090端口号开放出来。
#防火墙开启8090端口号
firewall-cmd --add-port=8090/tcp --permanent
#防火墙重新加载配置
firewall-cmd --reload
#查看当前防火墙开放的端口号
firewall-cmd --list-all
此时,我们就可以使用宿主机的ip地址加8090端口号访问我们的Nginx容器了。
例如,如果你的宿主机的ip地址是 192.168.10.11,那么你就访问 192.168.10.11:8090,如果看到这个页面,那么就说明访问成功了。
此时,我们还可以使用命令docker logs [容器名]
来查看我们容器的日志信息,如果要跟踪日志,那么就使用docker logs -f [容器名]
命令。
针对上面的例子,我们要查看我们的容器的日志就应该使用命令:
docker logs myNginx
如果我们要监听/跟踪我们的日志,那么我们就使用命令
docker logs -f myNginx
案例二、进入Nginx容器,修改HTML文件内容,添加“Hello,World!”
进入容器命令如下:
docker exec -it myNginx bash
命令解读:
-
docker exec :进入容器内部,执行一个命令
-
-it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
-
myNginx:要进入的容器的名称
-
bash:进入容器后执行的命令,bash是一个linux终端交互命令
进入容器后,我们使用命令 ls
可以看到容器内的结构像一个Linux服务器一样,前面解释过Docker会把库还有依赖什么都打包进来,作为一个镜像,所以他其实是由Docker模拟出来的一个独立的Linux文件系统,如下:
我们使用命令cd usr/share/nginx/html/
进入Nginx的“欢迎页面” 的目录,并使用命令sed -i -e 's#Welcome to nginx#Hello,World!#g' -e 's#<head>#<head><meta charset="utf-8">#g' index.html
修改页面的显示结果。然后用我们服务器的ip地址加端口号再次访问我们的Nginx,结果如下:
然后我们可以使用命令exit;
退出我们的容器。
使用命令docer pause myNginx
暂停我们的容器(暂停容器,使用命令docker ps
仍然可以看到容器,但是在状态后面会有一个括号将Pause括起来),如果想要启动被暂停的容器,只需要使用命令docker unpause myNginx
即可。
如果我们使用docker stop myNginx
直接停止我们的容器的话,那么我们用docker ps
是看不到此时的容器的,必须得用docker ps -a
进行查看才行。被stop的容器要想再次启动,就得使用命令docker start myNginx
。
如果在运行docker start myNginx
的时候出现以下报错信息:
那么重启一下我们的docker,命令如下:
systemctl restart docker
然后,再使用命令docker start myNginx
重新启动我们的 myNginx 容器即可。