Docker的基本操作

目录

1. 镜像操作

1.1 镜像名称

 1.2 镜像命令

1.3 拉取、查看镜像

1.4 保存、导入镜像

1.5 练习

2. 容器操作 

2.1 容器相关命令

2.2 创建并运行一个容器

2.3 进入容器,修改文件

2.4 小结

 3. 数据卷

3.1 什么是数据卷

3.2 数据集操作命令

3.3 创建和查看数据卷

3.4 小结

3.5 挂载数据卷

3.6 给nginx挂载数据卷

3.7 给MySQL挂载本地目录

3.8 小结


1. 镜像操作

1.1 镜像名称

首先来看下镜像的名称组成:

  • 镜像名称一般分为两部分组成:[repository]:[tag]。
  • 在没有指定tag时,默认时latest,代表最新版本的镜像

如图:

这里的mysql就是repository,5.7就是tag,合在一起就是镜像名称,代表5.7版本的MySQL镜像。

 1.2 镜像命令

常见的镜像操作命令,如图:

1.3 拉取、查看镜像

需求:从镜像仓库中拉取一个ngix镜像并查看

DockerHub好像是无法访问了,也拉取不了镜像。我这里的镜像仓库地址改成了阿里云的

 

1)拉取自己需要的镜像,通过命令docker pull nginx

2)通过命令:docker images查看拉取到的镜像

 

nginx就是刚拉取下来的镜像。

1.4 保存、导入镜像

需求: 利用docker save将nginx镜像导出磁盘,然后再通过load加载回来

1)利用docker xx--help命令查看docker save和docker load的语法

例如,查看save命令,可以输入命令:

docker save --help

结果:

 

命令格式:

docker save -o [保存的目标文件名称][镜像名称] 

查看load命令,可以输入命令: 

docker load --help

结果如图:

 

 命令格式:

docker load -i [需要加载的镜像压缩包]

2)使用docker save导出镜像到磁盘

运行命令:

docker save -o nginx.tar nginx:latest

结果如图:

 

PS:这里你是位于哪个文件夹中,导出的镜像文件就保存在哪个文件夹中。 

3)使用docker load加载镜像

 先删除本地的nginx镜像包:

docker rmi nginx:latest

 结果如图:

 这时候可以输入docker images命令,看看想要删除的镜像是否被删除了:

这时候已经没有nginx:latest镜像,看样子已经全部删除了。然后运行命令,加载本地文件: 

docker load -i nginx.tar

结果:

这时候可以用docker images命令查看镜像是否成功加载完成:

 

1.5 练习

鲁迅先生曾说过:”光听不练假把式,光练不听傻把式。“ 这里给各位小伙伴留下一个小练习来巩固上面的几个命令,各位可以先做,再跟下面的我的来对比,有报错的可以私信或评论沟通。

需求:去镜像仓库拉取一个Redis镜像

目标

1)利用docker pull命令拉取镜像

2)利用docker save命令将redis:latest打包成一个redis.tar包

3)利用docker rmi删除本地的redis:latest

4)利用docker load重新加载redis.tar文件

各位练习完了吗?

练习完了就该我了。

1) 利用docker pull命令拉取镜像

输入docker pull命令拉取镜像:

利用docker images命令查看镜像是否正确拉取到:

 

2)利用docker save命令将redis:latest打包成一个redis.tar包

我这里打包完之后用命令ls查看到,的确打包成功。

3)利用docker rmi删除本地的redis:latest

先用docker rmi删除本地redis:latest镜像:

然后用docker images命令查看镜像是否已经删除:

 

发现已经没有redis:latest镜像,的确是已经删除了。 

4)利用docker load重新加载redis.tar文件

先利用docker load命令重新加载redis.tar文件:

再用docker images命令查看redis.tar包是否正确加载:

 

各位是不是已经掌握了docker的这几个命令?接下来,我们来学习一下,容器操作相关的命令。

2. 容器操作 

2.1 容器相关命令

容器操作的命令如图:

容器保护的三个状态:

  • 运行:进程正常运行
  • 暂停:进程暂停,CPU不再运行,并不释放内存
  • 停止:进程终止,回收进程占用的内存、CPU等 

其中:

  • docker run:创建并运行一个容器,处于运行状态
  • docker pause:让一个运行的容器暂停
  • docker unpause:让一个容器从暂停的状态恢复成运行状态
  • docker stop:停止一个运行的容器
  • docker start:让一个停止的容器再次运行
  • docker rm:删除一个容器 

2.2 创建并运行一个容器

创建并运行nginx容器的命令:

docker run --name containerName -p 80:80 -d nginx

命令解读:

  • docker run:创建并运行一个容器
  • --name:给容器起一个名字,这个是自定义的,随自己喜欢
  • -p:将宿主端口与容器端口映射,冒号做测试宿主机端口,右侧是容器端口
  • -d:后台运行容器
  • nginx:镜像名称,例如nginx

这里的-p参数,是将容器端口映射到宿主机端口。

默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。

现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx了:

 运行nginx容器命令之后,结果如下图:

这里显示的是容器的唯一ID,运行命令docker ps就可以看到,目前运行的所有容器:

我们可以看到,刚刚创建的容器已经开始运行了,这里的容器ID跟之前系统返回的一长串字符是一样的,只是ID太长,所以只显示前面几位。

2.3 进入容器,修改文件

需求:进入Nginx容器,修改HTML文件,添加”Hello World!“

提示:进入容器要用到docker exec命令。

步骤:

1)进入容器。进入我们刚刚创建的nginx容器的命令为:

docker exec -it lyf bash

命令解读:

  • docker exec:进入容器内部,执行一个命令
  • -it:给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
  • lyf:要进去的容器的名称,这是我的nginx的容器名称,你们根据自己的实际情况改
  • bash:进入容器后执行的命令,bash是一个linux终端交互命令 

然后,我们直接访问http://虚拟机:80,是不是就可以看见启动的nginx,端口号80可以省略不写,如图:

 

这时候,我们访问是不是就会有日志产生,使用命令docker logs可以查看:

 

这里显示docker logs命令要加上容器名才能查看到日志,我这里容器名是lyf,所以我的命令是:

docker logs lyf

然后可以看到日志:

2) 进入nginx的HTML所在目录/usr/share/nginx/html

容器内部会模拟一个独立的Linux文件系统,看起来如同一个linux服务一样:

 ngixn的环境、配置、运行文件全部都在这个文件系统中,包括我们要修改的html文件。

查看DockerHub网站中的nginx页面,可以知道nginx的html目录位置在/usr/share/nginx/html

我们执行命令,进入该目录:

cd /usr/share/nginx/html

查看目录下文件:

3)修改index.html的内容

看到这里,我们是不是想到的修改命令,首先是vim,我们来试试:

这里直接返回,没有这个命令。 这是因为镜像封装时,只是封装了镜像必备的函数库还有一些命令,这里的vim命令,跟我们的nginx没有关系,所以它里面没有封装这个命令。再一次证明镜像里面的文件和函数库都是阉割版的,它需要什么就会只封装什么。

接下来,我们用cat命令看看index.html的文件内容:

容器内没有vim命令,无法直接修改,我们用下面的命令来修改:

sed -i \
 -e 's#Welcome to nginx#Hello World!#g' \
 -e 's#<head>#<head><meta charset="utf-8">#g' index.html

 这条sed命令就是进行两次内容替换的作用:

  • -i:直接修改文件内容,而不是输出到终端
  • -e 's#Welcome to nginx#Hello World!#g':将Welcome to nginx内容替换成Hello World!
  • -e 's#<head>#<head><meta charset="utf-8">#g':将<head>替换成<head><meta charset="utf-8">,这里加上字符串的编码信息

修改前:

 在浏览器访问自己的虚拟机地址,既可看到修改前的结果:

2.4 小结

 docker run命令的常见参数:

  • --name:指定容器名称
  • -p:指定端口映射
  • -d:让容器后台运行

查看容器日志的命令:

  •  docker logs xx:xx指的是容器的名称
  • 添加-f参数可以持续查看日志

查看容器状态:

  • docker ps:查看正在运行的容器
  • docker ps -a:查看所有容器,包括已经停止的 

删除容器:

  • docker rm:删除已经停止的容器
  • 添加-f参数,删除运行中的容器

进入容器:

  • 命令是docker exec -it [容器名] [要执行的命令] 
  • exec命令可以进去容器修改文件,但是在容器内修改文件是不推荐的,第一是没有记录,第二是不方便

 3. 数据卷

在上面的介绍中,修改nginx的html页面时,需要进入nginx内部。并且没有编辑器,修改文件也很麻烦。

这就是容器与数据(容器内文件)耦合带来的后果。

要解决这个问题,必须讲述与容器解耦,这就要用到数据卷了。

3.1 什么是数据卷

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。

一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录下。

这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了。

3.2 数据集操作命令

数据卷操作的基本语法如下:

docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

  • create:创建一个volume
  • inspect:显示一个或多个volume的信息
  • ls:列出所有的volume
  • prune:删除未使用的volume
  • rm:删除一个或多个指定的volume 

3.3 创建和查看数据卷

需求:创建一个数据卷,并查看数据卷在宿主机的目录位置

1)创建数据卷

docker volume create html

结果:

 

2)查看所有数据卷

docker volume ls

 结果:

3)查看数据卷详细信息

docker volume inspect html

 结果:

可以看到,我们创建的html这个数据卷关联的宿主机目录为/var/lib/docker/volumes/html/_data。

3.4 小结

数据卷的作用:

  • 将容器与数据分离,解耦合,方便操作容器内的数据,保证数据安全

数据卷操作:

  • docker volume create:创建数据卷
  • docker volume ls:查看所有数据卷
  • docker volume inspect:查看数据卷详细信息,包括关联的宿主机目录为止
  • docker volume rm:删除指定数据卷
  • docker volume prune:删除所有未使用的数据卷 

3.5 挂载数据卷

我们在创建容器时,可以通过-v参数来挂载一个数据卷到某个容器内目录,命令格式如下:

docker run \
 --name lyf \
 -v html:/root/html \
 -p 8080:80 \
 nginx \

 这里的-v就是挂载数据卷的命令:

  • -v html:/root/html:把html数据卷挂载到容器内的/root/html这个目录中

3.6 给nginx挂载数据卷

需求: 创建一个nginx容器,修改容器中html目录内的index.html内容

分析:在第二小节中,我们进入容器内部,已经知道nginx的html目录所在位置/usr/share/nginx/html,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。

提示:运行容器时使用-v参数挂载数据卷

步骤:

1)创建容器并挂载数据卷到容器内的HTML目录

docker run --name lyf -v html:/usr/share/nginx/html -p 80:80 -d nginx

2)进入html数据卷所在为止,并修改HTML内容

# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vim index.html

操作结果:

修改index.html文件:

 

保存之后,访问http://虚拟机IP,得到结果如下:

3.7 给MySQL挂载本地目录

容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:

  • 带数据卷模式:宿主机目录-->数据卷-->容器内目录
  • 直接挂载模式:宿主机目录-->容器内目录

如图:

语法

目录挂载与数据卷挂载的语法是类似的:

  • -v [宿主机目录] :[容器内目录]
  • -v [宿主机文件]:[容器内文件]

 需求:创建并运行一个MySQL容器,将宿主目录直接挂载到容器

步骤如下:

1)从镜像仓库中拉取MySQL镜像

输入拉取MySQL镜像命令:

docker pull mysql

结果:

 

2)创建目录/tmp/mysql/data

输入创建/tmp/mysql/data目录命令:

mkdir -p /tmp/mysql/data

结果如下:

3)创建目录/tmp/mysql/conf,新建hmy.cnf文件到/tmp/mysql/conf

输入创建/tmp/mysql/conf目录命令:

mkdir -p /tmp/mysql/conf

结果如下:

在/tmp/mysql/conf目录下,新建一个hmy.cnf空白文件:

touch /tmp/mysql/conf/hmy.cnf

文件hmy.cnf的内容如下:

[mysqld]
skip-grant-tables
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
  • skip-grant-tables:表示跳过数据库权限验证,如果不加这个,首次linux登陆会报1045的错
  • skip-name-resolve:这个配置项告诉 MySQL 服务器在用户登录时不要进行域名解析,可以提高连接速度。
  • character_set_server=utf8:表示服务器端使用的字符集为 utf8,这是为了确保数据的正确存储和检索
  • datadir=/var/lib/mysql:这个配置项指定了 MySQL 数据库文件的存储路径,即数据库的数据文件将存储在 /var/lib/mysql 目录下
  • server-id=1000:这个配置项指定了 MySQL 服务器的唯一标识号,用于在主从复制等场景中识别不同的服务器

将hmy.cnf文件内容写入文件:

vim /tmp/mysql/conf/hmy.cnf

结果如下:

 

4)创建并运行MySQL容器,要求:

① 挂载/tmp/mysql/data到mysql容器内数据存储目录

② 挂载/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件

③ 设置MySQL密码

命令:

docker run \
  --name lyf-mysql \
  -p 3306:3306 \
  -v /tmp/mysql/data:/var/lib/mysql \
  -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -d \
  mysql
  •  --name:表示创建的容器名称为lyf-mysql,这个是自定义的
  • -p:将宿主端口与容器端口映射,冒号做测试宿主机端口,右侧是容器端口
  • -v:把/tmp/mysql/data数据卷挂载到容器内的/var/lib/mysql这个目录中
  • -e:表示环境变量,这里表示给mysql的root用户设置密码
  • -d:后台执行容器

3.8 小结

docker run命令中通过-v参数挂载文件或目录到容器中:

  • -v volume名称:容器内目录
  • -v 宿主机文件:容器内文件
  • -v 宿主机目录:容器内目录

 数据卷挂在与目录直接挂载的:

  • 数据卷挂载耦合度低,由docker来管理目录,但是目录比较深,不好找
  • 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看
  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值