一、配置镜像加速器
1、创建阿里云容器镜像
登录阿里云-容器镜像服务:
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
页面:
找到对应系统的加速地址:
2、终端修改 /etc/docker/daemon.json文件
简述:
linux命令 vim 修改文件
将内容添加到 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命令 查看并检查一下,文件是否修改成功了
5)重启docker服务
6)检查加速器是否生效
执行 docker info,有以下语句则成功:
二、拉取镜像
1、拉取mysql镜像
1)拉取:docker pull <镜像>:<版本(标签)>
2)查看docker镜像:docker images
2、拉取 nginx 镜像
拉取: docker pull <镜像>
如果不标记版本,默认取最新版本 latest
三、启动容器
1、启动命令: docker run
参数说明:
-it
:这是两个参数,一个是-i
:交互式操作,一个是-t
终端。我们这里打算进入bash
执行一些命令并查看返回结果,因此我们需要交互式终端。--rm
:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动docker rm
。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用--rm
可以避免浪费空间。mysql:5.7
:这是指用 mysql:5.7 镜像为基础来启动容器。bash
:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是bash
另外
1)docker run —help 可以看到所有的参数说明
2)mysql —help|grep Distrib
mysql —help 查看帮助信息,并在结果集中 查找 Distrib ,
“|”单竖线表示命令的连续执行,同时以前一个命令值域作为后一个命令的定义域
3)进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 cat /etc/os-release
,这是 Linux 常用的查看当前系统版本的命令
2、退出命令:exit
此操作会关闭 mysql 服务
(对于创建的bush 容器,exit 退出后,容器也会退出。
这是因为对Docker 来说,容器中的应用退出了,容器也就没有必要继续运行了。
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 表示作为一个守护进程在后台运行
4、关于mysql容器的开启外部访问
命令如下:
看一下虚拟机的IP :ifconfig
然后用windows 连接一下navicat 测试是否可以访问:
5、终止容器:docker container stop xxx
6、启动已终止的容器:docker container start xxx
7、进入容器 docker exec
四、定制镜像
1、nginx定制新镜来理解docker commit
定制一个Web服务器:
docker run —name webserver -d -p 80:80 nginx
用 nginx
镜像启动一个容器,命名为 webserver
,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx
服务器
然后打开浏览器,输入localhost出现如下画面:
如果要修改这个页面显示的内容,改成欢迎 Docker 的文字,我们可以使用 docker exec
命令进入容器,修改其内容
命令:
docker exec -it webserver bash
echo ‘
Hello, Docker!
‘ > /usr/share/nginx/html/index.html刷新页面:
我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过
docker diff
命令看到具体的改动:将修改的保存下来当镜像:
docker commit
命令,可以将容器的存储层保存下来成为镜像就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化
个人认为跟 svn或git 提交一个版本一样
语法:
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
举例:
运行新镜像:
直接访问 http://localhost:81 看到结果
慎用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.html3)构建镜像:
docker build [选项] <上下文路径/URL/->
注意末尾有个点 .
这个点表示当前目录,上下文路径
FROM
RUN
1)执行命令行命令的
2)格式两种:
- shell格式:RUN<命令>
- exec格式:RUN [“可执行文件”, “参数1”, “参数2”]
3)特点,Dockerfile中每个指令建立一层,每个RUN行为,都是一层,容易造成臃肿
4)正确写法:
每个命令用 && 串联起来,简化为一层,对于无关内容 ,rm掉
五、删除镜像
1、删除命令
docker image rm [选项] <镜像1> [<镜像2> …]
其中<镜像>可以是 镜像短 ID
、镜像长 ID
、镜像名
或者 镜像摘要
2、举例
例如:删除mysql最新版本的镜像,根据镜像名删除是 :
docker image rm mysql
如果删除mysql5.7版本的镜像,语句为:
docker image rm mysql:5.7
六、导入导出镜像
1、导出 docker export
2、导入 docker import
七、dockerHub
1、注册docker
https://cloud.docker.com 免费注册一个 Docker 账号
2、命令登录
3、查找镜像
4、推送镜像
docker push
用户也可以在登录后通过 docker push
命令来将自己的镜像推送到 Docker Hub
5、私有库
这将使用官方的 registry
镜像来启动私有仓库。默认情况下,仓库会被创建在容器的 /var/lib/registry
目录下。你可以通过 -v
参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的 /opt/data/registry
目录
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
上传标记的镜像。
用 curl
查看仓库中的镜像。
先删除已有镜像,再尝试从私有仓库中下载这个镜像
删除:
从私有库拉取:
八、docker数据管理
docker内部与容器之间的管理数据,两种方式:
数据卷(volumes)
挂载主机目录(bind mounts)
1、数据卷定义
可供多个容器使用的特殊目录:
1)可以在容器之间共享和重用
2)对数据卷的修改可立马生效
3)对数据卷的修改,不会影响镜像
4)数据卷默认会一直存在,即使容器被删除
2、创建数据卷
3、启动一个挂载数据卷的容器
在用 docker run
命令的时候,使用 --mount
标记来将 数据卷
挂载到容器里。在一次 docker run
中可以挂载多个 数据卷
。
下面创建一个名为 web
的容器,并加载一个 数据卷
到容器的 /webapp
目录。
查看数据卷的具体信息
4、删除数据卷
docker volume rm xxx
删除时遇到了问题:说数据卷在使用中,不允许删除,于是我把容器停止后、删除了容器、再删除数据卷,就成功了
无主的数据卷可能会占据很多空间,要清理请使用以下命令