首先来看下镜像的名称组成:
[repository]:[tag]
。tag
时,默认是latest
,代表最新版本的镜像如图:
这里的mysql
就是repository
,5.7
就是tag
,合一起就是镜像名称,代表5.7
版本的MySQL
镜像。
常见的镜像操作命令如图:
需求:从DockerHub
中拉取一个nginx
镜像并查看
1)首先去镜像仓库搜索nginx
镜像,比如DockerHub:
2)根据查看到的镜像名称,拉取自己需要的镜像,通过命令:docker pull nginx
3)通过命令:docker images
查看拉取到的镜像
需求:利用docker save
将nginx
镜像导出磁盘,然后再通过load
加载回来
1)利用docker xx --help
命令查看docker save
和docker load
的语法
例如,查看save
命令用法,可以输入命令:
docker save --help
结果:
命令格式:
docker save -o [保存的目标文件名称] [镜像名称]
2)使用docker save
导出镜像到磁盘
运行命令:
docker save -o nginx.tar nginx:latest
结果如图:
3)使用docker load
加载镜像
先删除本地的nginx
镜像:
docker rmi nginx:latest
然后运行命令,加载本地文件:
docker load -i nginx.tar
结果:
容器操作的命令如图:
容器保护三个状态:
CPU
不再运行,并不释放内存CPU
等资源其中:
docker run
:创建并运行一个容器,处于运行状态
docker pause
:让一个运行的容器暂停
docker unpause
:让一个容器从暂停状态恢复运行
docker stop
:停止一个运行的容器
docker start
:让一个停止的容器再次运行
docker rm
:删除一个容器
创建并运行nginx
容器的命令:
docker run --name containerName -p 80:80 -d nginx
命令解读:
docker run
:创建并运行一个容器--name
: 给容器起一个名字,比如叫做containerName
-p
:将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口-d
:后台运行容器nginx
:镜像名称,例如nginx
这里的-p
参数,是将容器端口映射到宿主机端口。
默认情况下,容器是隔离环境,我们直接访问宿主机的80
端口,肯定访问不到容器中的nginx
。
现在,将容器的80
与宿主机的80
关联起来,当我们访问宿主机的80
端口时,就会被映射到容器的80
,这样就能访问到nginx
了:
需求:进入Nginx
容器,修改HTML
文件内容,添加“我爱北京天安门”
提示:进入容器要用到docker exec
命令。
步骤:
1)进入容器。进入我们刚刚创建的nginx
容器的命令为:
docker exec -it containerName bash
命令解读:
docker exec
:进入容器内部,执行一个命令
-it
: 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
containerName
:要进入的容器的名称
bash
:进入容器后执行的命令,bash
是一个linux
终端交互命令
2)进入nginx
的HTML
所在目录 /usr/share/nginx/html
容器内部会模拟一个独立的Linux
文件系统,看起来如同一个linux
服务器一样:
nginx
的环境、配置、运行文件全部都在这个文件系统中,包括我们要修改的html
文件。
查看DockerHub
网站中的nginx
页面,可以知道nginx
的html
目录位置在/usr/share/nginx/html
我们执行命令,进入该目录:
cd /usr/share/nginx/html
查看目录下文件:
3)修改index.html
的内容
容器内没有vi
命令,无法直接修改,我们用下面的命令来修改:
sed -i -e 's#Welcome to nginx#我爱北京天安门#g' -e 's###g' index.html
在浏览器访问自己的虚拟机地址,即可看到结果:
docker run
命令的常见参数有哪些?
--name
:指定容器名称-p
:指定端口映射-d
:让容器后台运行查看容器日志的命令:
docker logs
-f
参数可以持续查看日志查看容器状态:
docker ps
docker ps -a
查看所有容器,包括已经停止的在之前的nginx
案例中,修改nginx
的html
页面时,需要进入nginx
内部。并且因为没有编辑器,修改文件也很麻烦。
这就是因为容器与数据(容器内文件)耦合带来的后果。
要解决这个问题,必须将数据与容器解耦,这就要用到数据卷了。
数据卷(volume
)是一个虚拟目录,指向宿主机文件系统中的某个目录。
一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。
这样,我们操作宿主机的/var/lib/docker/volumes/html
目录,就等于操作容器内的/usr/share/nginx/html
目录了
数据卷操作的基本语法如下:
docker volume [COMMAND]
docker volume
命令是数据卷操作,根据命令后跟随的command
来确定下一步的操作:
create
创建一个volume
inspect
显示一个或多个volume
的信息ls
列出所有的volume
prune
删除未使用的volume
rm
删除一个或多个指定的volume
需求:创建一个数据卷,并查看数据卷在宿主机的目录位置
① 创建数据卷
docker volume create html
② 查看所有数据
docker volume ls
结果:
③ 查看数据卷详细信息卷
docker volume inspect html
结果:
可以看到,我们创建的html
这个数据卷关联的宿主机目录为/var/lib/docker/volumes/html/_data
目录。
小结:
数据卷的作用:
数据卷操作:
docker volume create
:创建数据卷docker volume ls
:查看所有数据卷docker volume inspect
:查看数据卷详细信息,包括关联的宿主机目录位置docker volume rm
:删除指定数据卷docker volume prune
:删除所有未使用的数据卷我们在创建容器时,可以通过-v
参数来挂载一个数据卷到某个容器内目录,命令格式如下:
docker run --name mn -v html:/root/html -p 10080:80 -d nginx
这里的-v
就是挂载数据卷的命令:
-v html:/root/htm
:把html
数据卷挂载到容器内的/root/html
这个目录中nginx
挂载数据卷需求:创建一个nginx
容器,修改容器内的html
目录内的index.html
内容
分析:上个案例中,我们进入nginx
容器内部,已经知道nginx
的html
目录所在位置/usr/share/nginx/html
,我们需要把这个目录挂载到html
这个数据卷上,方便操作其中的内容。
提示:运行容器时使用-v
参数挂载数据卷
步骤:
① 创建容器并挂载数据卷到容器内的HTML
目录
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
② 进入html
数据卷所在位置,并修改HTML
内容
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:
如图:
语法:
目录挂载与数据卷挂载的语法是类似的:
-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件]
需求:创建并运行一个Nginx
容器,将宿主机目录直接挂载到容器
实现思路如下:
1)创建Nginx
配置文件
启动前需要先创建
Nginx
外部挂载的配置文件(/home/nginx/conf/nginx.conf
)
之所以要先创建 , 是因为Nginx
本身容器只存在/etc/nginx
目录 , 本身就不创建nginx.conf
文件
当服务器和容器都不存在nginx.conf
文件时, 执行启动命令的时候docker
会将nginx.conf
作为目录创建 , 这并不是我们想要的结果 。
cd /home/nginx
mkdir html
mkdir log
mkdir conf
2)容器中的nginx.conf
文件和conf.d
文件夹复制到宿主机
# 生成容器
docker run --name homeNginx -p 80:80 -d nginx
# 将容器nginx.conf文件复制到宿主机
docker cp homeNginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp homeNginx:/etc/nginx/conf.d /home/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp homeNginx:/usr/share/nginx/html /home/nginx/
3)创建Nginx
容器并运行
# 直接执行docker rm nginx或者以容器id方式关闭容器
# 找到nginx对应的容器id
docker ps -a
# 关闭该容器
docker stop homeNginx
# 删除该容器
docker rm homeNginx# 删除正在运行的nginx容器
docker rm -f homeNginx
docker run \
-p 80:80 \
--name homeNginx \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /home/nginx/log:/var/log/nginx \
-v /home/nginx/html:/usr/share/nginx/html \
-d nginx
docker run
的命令中通过-v
参数挂载文件或目录到容器中:
-v volume 名称:容器内目录
-v 宿主机文件:容器内文
-v 宿主机目录:容器内目录
数据卷挂载与目录直接挂载的区别:
docker
来管理目录,但是目录较深,不好找