首先去下载一个模板(centos-6-x86-minimal.tar.gz)下载速度比较慢,可以先试用浏览器或者第三方工具下载。
http://openvz.org/Download/templates/precreated
wget http://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz
导入该镜像的命令为:
[[email protected] ~]# cat centos-6-x86_64-minimal.tar.gz |docker import - centos6_x64
sha256:86a54774427e90ef93645d415c8fce46d3496929dd290a67d6fd1bfd0d81413d
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6_x64 latest 86a54774427e 5 seconds ago 553MB
导出为一个文件:
docker save -o centos7_vim.tar centos_vim
有时候在删除镜像的时候发现镜像已经启动,这个时候我们就需要强制删除(线上需要再三考虑)
docker -rmi -f centos_vim
再或者先停掉docker容器:
docker stop centos_vim
恢复本地镜像:
docker load < centos7_vim.tar
docker push image_name
//可以把自己的镜像传到dockerhub官方网站上去,但前提是需要先注册一个用户,后续如果有需求再研究吧。
扩展知识点:docker save与docker export的区别:
docker save:
docker save是用来将一个或多个image打包保存的工具。
例如我们想将镜像库中的postgres和mongo打包,那么可以执行:
docker save -o images.tar postgres:9.6 mongo:3.4
打包之后的images.tar包含postgres:9.6和mongo:3.4这两个镜像。
将打包后的镜像载入进来使用docker load,例如:
docker load -i images.tar
上述命令将会把postgres:9.6和mongo:3.4载入进来,如果本地镜像库已经存在这两个镜像,将会被覆盖。
docker export:
docker export是用来将container的文件系统进行打包的。例如:
docker export -o postgres-export.tar postgres
docker export需要指定container,不能像docker save那样指定image或container都可以。
将打包的container载入进来使用docker import,例如:
docker import postgres-export.tar postgres:latest
从上面的命令可以看出,docker import将container导入后会成为一个image,而不是恢复为一个container。
总结一下docker save和docker export的区别:
docker save保存的是镜像(image),docker export保存的是容器(container);
docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。
创建一个容器
docker create -it centos6 bash
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e847983f09cc centos "bash" 16 seconds ago Created compassionate_goldberg
启动容器后,可以使用 docker ps 查看到,有start 就有stop,和restart
之前我们使用的docker run 相当于先** create再start**
docker start container_id
当执行如下(不带 -d 参数)当你退出时,这个容器也会显示退出的状态!
docker run -it centos bash
可以让容器在后台运行
docker run -d
比如:
docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"
–name 给容器自定义名字
docker run --name cs6 -itd centos bash
下次我们就可以直接使用名称进入:
[root@zhdy01 ~]# docker exec -it cs6 bash
[root@72d8c92176d4 /]#
–rm 可以让容器退出后直接删除,在这里命令执行完容器就会退出。
[root@zhdy01 ~]# docker run -itd centos bash -c "echo 123"
e5424b102eb48406a163860b80372cc999ad672fa0c90e6037953aa2b0419d71
[root@zhdy01 ~]# docker logs e5424b //可以获取到容器的运行历史信息
123
删除一个容器:
docker rm container_id
或者
docker rm -f container_id
删除一个镜像:
docker rm images_id
当执行如上一条命令出现一个错误:
WARNING: IPv4 forwarding is disabled. Networking will not work.
解决办法:
# vi /etc/sysctl.conf
或者
# vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1
重启network服务
# systemctl restart network
查看是否修改成功
# sysctl net.ipv4.ip_forward
如果返回为“net.ipv4.ip_forward = 1”则表示成功了
当我们pull一个镜像,一般都是从官网直接拉取的,一般的都是比较纯净的,但是在公司内一般这种镜像没有任何作用,我们需要的是基础环境都配置好的,可以直接在此基础上面运行服务的系统。
综上所述,我们需要搭建一个在我们服务器内部的一个镜像仓库,需要哪个直接拉取即可!(类似于gitlab),我们需要在本地创建一个仓库:
下载registry 镜像,registy为docker官方提供的一个镜像,我们可以用它来创建本地的docker私有仓库。
docker pull registry
以registry镜像启动容器,-p会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口
docker run -d -p 5000:5000 registry
假如有这么一种情况,咱们的容器需要对外进行提供服务,虚拟机内的IP地址肯定不可以直接作为访问地址的,但是我们ens33的地址可以配置成对外的公网IP 然后通过端口映射,是不是我们的docker容器也可以跑web服务了?
docker run -d -p 80:80 registry
访问
curl 127.0.0.1:5000/v2/_catalog
上传到私有仓库
docker tag centos6_x64
标记一下tag,必须要带有私有仓库的ip:port
[[email protected] ~]# docker tag centos6_x64 192.168.59.131:5000/centos6
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.59.131:5000/centos6 latest 86a54774427e 2 hours ago 553MB
把标记的镜像上传到私有仓库:
[[email protected] ~]# docker push 192.168.59.131:5000/centos6
The push refers to a repository [192.168.59.131:5000/centos6]
Get https://192.168.59.131:5000/v2/: http: server gave HTTP response to HTTPS client
//如上报错了!
解决方案:
更改配置文件
vi /etc/docker/daemon.json //更改为
{
"insecure-registries":["192.168.59.131:5000"]
}
重启docker服务:
systemctl restart docker
docker ps -a //查看容器已经关闭,还需要启动
docker start id //这里的id为 registry 容器id
再次push
[[email protected] ~]# docker push 192.168.59.131:5000/centos6
The push refers to a repository [192.168.59.131:5000/centos6]
dbcc6b3893af: Pushed
latest: digest: sha256:cfb4b4759d1f96bca4cadbb15f5a4dfbed02299e79b651e977d38f186f2cf178 size: 529
[[email protected] ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos6"]}
//可以查看到推送上来的镜像
第一步:打标签
[[email protected] ~]# docker tag centos_vim 192.168.59.131:5000/centvim
第二步:上传
[[email protected] ~]# docker push 192.168.59.131:5000/centvim
The push refers to a repository [192.168.59.131:5000/centvim]
6d8d4efa36d8: Pushing [===============> ] 22.9MB/76.2MB
b65181ce69a7: Pushed
cf516324493c: Pushing [===> ] 12.47MB/196.6MB
第三步:检查:
[root@zhdy01 ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos6","centvim"]}
配置完毕后,内网机器如何去连接呢?
第一步:
客户机需要安装并启动docker服务;
第二步:
配置私有仓库地址:
vi /etc/docker/daemon.json //更改为
{
"insecure-registries":["192.168.59.131:5000"]
}
第三步:
下载镜像:
docker pull 192.168.59.131:5000/centvim
假如我们的某个容器跑了一个线上的业务,不可抵抗的情况发生了,数据呢?数据具体在什么位置呢?他会一并删除,如何保证数据不删除呢?
把我们宿主机的目录挂载到容器内,让容器的数据全部写到咱们指定的宿主机目录。
-v 参数!
[[email protected] ~]# docker run -itd -v /data/:/data centos_vim bash
a0a88cb8ec12d44ce05b1021f053bafb3510ef923a06d0b415b38b6ff9acceb3
//左边是宿主机的目录,右边是容器的目录(当然可以不一样)
[[email protected] ~]# ls /data/
mysql redis wwwroot
[[email protected] ~]# docker exec -it a0a88cb8ec1 bash
[[email protected] /]# ls /data/
mysql redis wwwroot
测试在容器内创建一个文件
[[email protected] /]# cd data/
[[email protected] data]# ls
mysql redis wwwroot
[[email protected] data]# touch test.txt
[[email protected] data]# ls
mysql redis test.txt wwwroot
[[email protected] data]# exit
[[email protected] ~]# ls /data/
mysql redis test.txt wwwroot
//看来已经自动的存储到了宿主机的硬盘上!
先找到我们所需要使用的数据卷:
[root@zhdy01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0a88cb8ec12 centos_vim "bash" 7 minutes ago Up 7 minutes elastic_rosalind
启动一台新的容器并使用如上容器的数据卷:
[root@zhdy01 ~]# docker run -itd --volumes-from elastic_rosalind centos6_x64 bash
ae45871c4714dad19cdf605cb96459ebfb2f55f5a71f50534e87245b95690889
[root@zhdy01 ~]# docker exec -it ae45871c47 bash
[root@ae45871c4714 /]# ls /data/
mysql redis test.txt wwwroot
其实这个在咱们真实的主机当中是不是很类似于NFS的共享功能?