Docker 配置安装(Ⅱ)

一、通过模板创建镜像

首先去下载一个模板(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容器管理

创建一个容器

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 相当于先** createstart**

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”则表示成功了

三、Docker 仓库管理

当我们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"]}
//可以查看到推送上来的镜像
总结下(如何上传一个images到私有仓库呢?):

第一步:打标签

[[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

四、Docker 数据管理

假如我们的某个容器跑了一个线上的业务,不可抵抗的情况发生了,数据呢?数据具体在什么位置呢?他会一并删除,如何保证数据不删除呢?

把我们宿主机的目录挂载到容器内,让容器的数据全部写到咱们指定的宿主机目录。

-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的共享功能?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Rainbond开源「容器云平台」

Dockerfile,你给我站住!

1465
来自专栏大魏分享(微信公众号:david-share)

如何有效地对Docker的镜像进行管理?

容器的存储空间如何提供? 前段时间,笔者看到一篇文章,题目是“容器就是Linux”,写的不错。容器说简单点就是容器级别的虚拟化,在一个Kernel Space...

4526
来自专栏性能与架构

如何 build 出尽可能小的 docker image?

1. 简介 我们自己构建 Docker image 时都希望结果镜像越小越好,那么如何才能尽量变小呢? 下面我们通过一个简单的案例,了解下优化思路,看一个简单的...

3136
来自专栏IT派

使用 Docker 搭建 Java Web 运行环境

Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都听说过它。Docker 是一种“轻量级”容器技术,它几乎动摇了传统虚拟化技术的地位,现在国内...

1612
来自专栏康怀帅的专栏

Docker 实践遇到的问题(持续更新)

本文列举了使用 Docker 过程中遇到的问题。 时区 基于 Debian 的镜像通过设置 环境变量 改变时区,在 Dockerfile 中增加 ENV 或在启...

4245
来自专栏散尽浮华

Docker容器学习梳理--基础知识(1)

Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0...

28010
来自专栏Linyb极客之路

使用 Docker 搭建 Java Web 运行环境

Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都听说过它。Docker 是一种“轻量级”容器技术,它几乎动摇了传统虚拟化技术的地位,现在国内...

4105
来自专栏Grace development

五分钟快速了解Docker

使用docker搭建开发环境将近1年了,自我感觉docker的强大并非如此,不过没有机会将docker部署生产环境,有位架构师曾说过,最新的未必是最好的,架构要...

1414
来自专栏java技术学习之道

如何使用 Docker 搭建 Java Web 运行环境

2415
来自专栏北京马哥教育

Docker Swarm学习笔记(一)

Docker Swarm概述 Docker Swarm是Docker官方提供的集群工具。它可以将一些关联的Docker主机转变成一个虚拟Docker主机。因为D...

3185

扫码关注云+社区