一、配置镜像加速器

这里用了阿里云的镜像加速,可配置其他镜像源

1、创建阿里云容器镜像

登录阿里云-容器镜像服务:
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
页面:
image.png
找到对应系统的加速地址:
image.png

2、终端修改 /etc/docker/daemon.json文件

简述:
linux命令 vim 修改文件
image.png
将内容添加到 daemon.json 中:
{
“registry-mirrors”: [“https://dp8xyn0g.mirror.aliyuncs.com“]
}
编辑完重启 docker
具体操作:
1)vim命令打开daemon.json 文件
2)按i 或者 insert 键,进行文件编辑
将内容 copy进去,手输入容易打错 ,注意中英文符号,这里都是英文符号
{
“registry-mirrors”: [“https://dp8xyn0g.mirror.aliyuncs.com“]
}
3)按ESC退出编辑,输入 :wq 进行保存并退出
4)cat命令 查看并检查一下,文件是否修改成功了
image.png
5)重启docker服务
image.png
6)检查加速器是否生效
执行 docker info,有以下语句则成功:
image.png

二、拉取镜像

拉取mysql和 nginx 镜像举例

1、拉取mysql镜像

1)拉取:docker pull <镜像>:<版本(标签)>
image.png
2)查看docker镜像:docker images

2、拉取 nginx 镜像

拉取: docker pull <镜像>
如果不标记版本,默认取最新版本 latest

image.png

三、启动容器

以启动mysql容器为例:

1、启动命令: docker run

参数说明:

  • -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
  • --rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
  • mysql:5.7:这是指用 mysql:5.7 镜像为基础来启动容器。
  • bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash

image.png
另外
1)docker run —help 可以看到所有的参数说明
2)mysql —help|grep Distrib
mysql —help 查看帮助信息,并在结果集中 查找 Distrib ,
“|”单竖线表示命令的连续执行,同时以前一个命令值域作为后一个命令的定义域
3)进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 cat /etc/os-release,这是 Linux 常用的查看当前系统版本的命令
image.png

2、退出命令:exit

此操作会关闭 mysql 服务
(对于创建的bush 容器,exit 退出后,容器也会退出。
这是因为对Docker 来说,容器中的应用退出了,容器也就没有必要继续运行了。
image.png

3、想要服务一直运行可以设定容器参数

docker run -p 3306:3306 —name wmnmysql5.7 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
参数:
-p 设置端口
—name 取名
-e MYSQL_ROOT_PASSWORD=123456 设置 账号为 root ,密码为 123456
-d 表示作为一个守护进程在后台运行
image.png

4、关于mysql容器的开启外部访问

命令如下:
image.png
看一下虚拟机的IP :ifconfig
image.png
然后用windows 连接一下navicat 测试是否可以访问:

image.png
5、终止容器:docker container stop xxx

image.png

6、启动已终止的容器:docker container start xxx

image.png

7、进入容器 docker exec

image.png

四、定制镜像

1、nginx定制新镜来理解docker commit

定制一个Web服务器:
docker run —name webserver -d -p 80:80 nginx
nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器
image.png
然后打开浏览器,输入localhost出现如下画面:
image.png
如果要修改这个页面显示的内容,改成欢迎 Docker 的文字,我们可以使用 docker exec 命令进入容器,修改其内容
命令:
docker exec -it webserver bash
echo ‘

Hello, Docker!

‘ > /usr/share/nginx/html/index.html
刷新页面:
image.png
我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过 docker diff 命令看到具体的改动:
image.png
将修改的保存下来当镜像:
docker commit 命令,可以将容器的存储层保存下来成为镜像
就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化
个人认为跟 svn或git 提交一个版本一样
语法:
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
举例:
image.png
运行新镜像:
image.png
直接访问 http://localhost:81 看到结果
image.png

慎用docker commit
原因:
意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 docker diff 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的

2、dockerfile定制镜像

1) 建立一个文本文件 Dockerfile
mkdir mynginx
cd mynginx
touch Dockerfile
2) vim命令 给Dockerfile添加内容:
FROM nginx
RUN echo ‘

hello,Dreamer!

‘ > /usr/share/nginx/html/index.html
image.png
3)构建镜像:
docker build [选项] <上下文路径/URL/->
image.png
注意末尾有个点 .
这个点表示当前目录,上下文路径

FROM

1)指定基础镜像是什么
2)是必备的指令,且必须是第一条指令

RUN

1)执行命令行命令的
2)格式两种:

  • shell格式:RUN<命令>
  • exec格式:RUN [“可执行文件”, “参数1”, “参数2”]

3)特点,Dockerfile中每个指令建立一层,每个RUN行为,都是一层,容易造成臃肿
image.png
4)正确写法:
image.png
每个命令用 && 串联起来,简化为一层,对于无关内容 ,rm掉

五、删除镜像

1、删除命令

docker image rm [选项] <镜像1> [<镜像2> …]
其中<镜像>可以是 镜像短 ID镜像长 ID镜像名 或者 镜像摘要

2、举例

例如:删除mysql最新版本的镜像,根据镜像名删除是 :
docker image rm mysql
如果删除mysql5.7版本的镜像,语句为:
docker image rm mysql:5.7
image.png

六、导入导出镜像

1、导出 docker export

image.png

2、导入 docker import

image.png

七、dockerHub

1、注册docker
https://cloud.docker.com 免费注册一个 Docker 账号
image.png

2、命令登录

docker login
登出:docker logout
image.png

3、查找镜像

docker search xxx
image.png

4、推送镜像

docker push
用户也可以在登录后通过 docker push 命令来将自己的镜像推送到 Docker Hub
image.png

5、私有库

这将使用官方的 registry 镜像来启动私有仓库。默认情况下,仓库会被创建在容器的 /var/lib/registry 目录下。你可以通过 -v 参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的 /opt/data/registry 目录
image.png

6、在私有仓库上传、搜索、下载镜像

创建好私有仓库之后,就可以使用 docker tag 来标记一个镜像,然后推送它到仓库。例如私有仓库地址为 127.0.0.1:5000
使用 docker tag 将 nginx:v0.0.2 这个镜像标记为 127.0.0.1:5000/nginx:v0.0.2
格式为 docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
使用 docker push 上传标记的镜像。
image.png
curl 查看仓库中的镜像。
image.png
先删除已有镜像,再尝试从私有仓库中下载这个镜像
删除:
image.png
从私有库拉取:
image.png

八、docker数据管理

docker内部与容器之间的管理数据,两种方式:
数据卷(volumes)
挂载主机目录(bind mounts)

1、数据卷定义

可供多个容器使用的特殊目录:
1)可以在容器之间共享和重用
2)对数据卷的修改可立马生效
3)对数据卷的修改,不会影响镜像
4)数据卷默认会一直存在,即使容器被删除

2、创建数据卷

docker volume create
image.png

3、启动一个挂载数据卷的容器

在用 docker run 命令的时候,使用 --mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中可以挂载多个 数据卷
下面创建一个名为 web 的容器,并加载一个 数据卷 到容器的 /webapp 目录。
image.png
查看数据卷的具体信息
image.png
image.png

4、删除数据卷

docker volume rm xxx
image.png
删除时遇到了问题:说数据卷在使用中,不允许删除,于是我把容器停止后、删除了容器、再删除数据卷,就成功了

无主的数据卷可能会占据很多空间,要清理请使用以下命令
image.png