首先要明白,docker中的镜像和容器,挂载卷的概念,这几个搞清楚了, 就成功了一半
镜像
镜像就是我们使用 docker pull 命令去各大厂商的镜像仓库中拉下来的, 记住, 这是镜像,就是你来创建容器的模板, 你的容器创建是依赖镜像的 , 镜像是各大公司 比如nginx , mysql 等公司,专门制作的 docker 的镜像,供开发者使用的
docker pull mysql:5.7
docker pull nginx //这里没有写版本号,就默认是 latest
容器
容器才是我们用的目的, 我们的所有服务都是容器中提供的,也就是我们使用 docker run -d 来创建出来的
docker run -d --name mynginx -p 80:80 nginx
docker run -d --name testmysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 TZ=Asia/Shanghai mysql5.7
解释一下这个命令
docker run -d -d 的作用是让进程在后面运行, 也就是说要启动(创建一个容器了)
--name testmysql 是给新建的容器起了一个名称
-p 3306:3306 这是说把 宿主机的 3306 和 容器中的 3306 端口作了绑定
-e MYSQL_ROOT_PASSWORD=123 TZ=Asia/Shanghai 这里是给mysql 的root用户设置了一个密码123 ,时区是上海, 这个参数因镜像的不同是有差异的, 具体要看制作镜像的厂商要求填什么参数, 可以自行查找对应的文档
通过以上的命令,我们就已经把容器创建好了, 此时我们可以操作 镜像和容器了
查看镜像 删除镜像
docker images //查看
docker rmi mysql:5.7 //删除
查看所有的容器
docker ps // 查看运行中的容器
docker ps -a //查看所有的容器(停止的,运行的都有)
docker stop testmysql // 停止一个容器
docker rm testmysql //删除一个容器
我们还可以进入容器的内部,来简单的操作容器
docker exec -it testmysql bash
docker exec 就是进入容器内部的命令
-it
-i(--interactive):保持标准输入(STDIN)打开。即使没有附着到容器,也允许你向容器内输入内容。简单说,就是让你能敲键盘。
-t(--tty):分配一个伪终端(Pseudotty)。这会让命令输出带上格式(比如颜色、表格对齐、终端提示符 root@...)。简单说,就是让界面像本地命令行一样美观,而不是纯文本流。
如果不加 -t:你看不到 root@xxxx:/# 这种提示符,输入命令时也没有回显,就像在对着一个黑洞说话。
如果不加 -i:你无法交互输入,执行 bash 后容器会直接退出,因为没东西可读。
testmysql 是容器名
bash 是开启一个交互式的终端来进行交互
我们还可以查看,镜像或 容器的信息, 比如容器的ip地址(虽然容器的ip 没什么用处)
docker inspect mynginx // 查看容器的信息 其中可以看到容器的 ip 等信息
//如果我们要看镜像的信息
docker image inspect nginx //注意这里最后是镜像的名称, 不是容器哟
挂载卷
挂载卷可以理解为在 宿主机中开辟了一个文件夹与容器中的一个文件夹实现了双向绑定, 更改任意地方的文件, 宿主机和容器中的文件都会发生变化
说一下为什么要这么做, 因为我们使用的容器都是最小化的系统, 用的甚至连 vim cat 等工具都没有提供, 但是这些工具, 我们的宿主机是有的,而且操作也方便, 也有我们就使用挂载卷的功能,然后在宿主机上修改文件,达到修改容器中的文件的目的
挂载卷的使用
docker run -d --name mynginx -p 80:80 -v html:/usr/share/nginx/html nginx
这个命令和创建一个容器是一样的, 就是多了一个 -v 的参数
-v html:/usr/share/nginx/html 是指在宿主机的 创建一个 html 卷 ,这里也可以指定成目录,如果是/html 表示根目录下的html 目录, 如果是 html 表示数据卷名, 对应容器中的 /usr/share/nginx/html
当我们创建好了之后, 如果我们想查看所有的挂载卷
docker volume ls
# 查看所有卷在宿主机上的实际存储位置
docker volume inspect $(docker volume ls -q)
如果想要查看,挂载卷和容器的对应关系
docker inspect -f '{{.Name}} -> {{range .Mounts}}{{.Destination}} (宿主机: {{.Source}}) {{end}}' $(docker ps -aq)