前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker 配置安装(Ⅱ)

Docker 配置安装(Ⅱ)

作者头像
老七Linux
发布2018-05-31 10:42:27
1.1K0
发布2018-05-31 10:42:27
举报
文章被收录于专栏:Laoqi's Linux运维专列
一、通过模板创建镜像

首先去下载一个模板(centos-6-x86-minimal.tar.gz)下载速度比较慢,可以先试用浏览器或者第三方工具下载。

代码语言:javascript
复制
http://openvz.org/Download/templates/precreated

wget http://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz

导入该镜像的命令为:

代码语言:javascript
复制
[[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

导出为一个文件:

代码语言:javascript
复制
docker save -o centos7_vim.tar centos_vim

有时候在删除镜像的时候发现镜像已经启动,这个时候我们就需要强制删除(线上需要再三考虑)

代码语言:javascript
复制
docker -rmi -f centos_vim

再或者先停掉docker容器:

代码语言:javascript
复制
docker stop centos_vim

恢复本地镜像:

代码语言:javascript
复制
docker load < centos7_vim.tar
代码语言:javascript
复制
docker push image_name
//可以把自己的镜像传到dockerhub官方网站上去,但前提是需要先注册一个用户,后续如果有需求再研究吧。

扩展知识点:docker save与docker export的区别:

docker save:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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的区别

代码语言:javascript
复制
docker save保存的是镜像(image),docker export保存的是容器(container);
docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。
二、Docker容器管理

创建一个容器

代码语言:javascript
复制
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**

代码语言:javascript
复制
docker start  container_id

当执行如下(不带 -d 参数)当你退出时,这个容器也会显示退出的状态!

代码语言:javascript
复制
docker run -it centos bash

可以让容器在后台运行

代码语言:javascript
复制
docker run -d

比如:

代码语言:javascript
复制
docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"

–name 给容器自定义名字

代码语言:javascript
复制
docker run --name cs6 -itd centos bash

下次我们就可以直接使用名称进入:

[root@zhdy01 ~]# docker exec -it cs6 bash
[root@72d8c92176d4 /]#

–rm 可以让容器退出后直接删除,在这里命令执行完容器就会退出。

代码语言:javascript
复制
[root@zhdy01 ~]# docker run -itd centos bash -c "echo 123"
e5424b102eb48406a163860b80372cc999ad672fa0c90e6037953aa2b0419d71

[root@zhdy01 ~]# docker logs e5424b     //可以获取到容器的运行历史信息
123

删除一个容器:

代码语言:javascript
复制
docker rm container_id
或者
docker rm -f container_id

删除一个镜像:

代码语言:javascript
复制
docker rm images_id

当执行如上一条命令出现一个错误:

代码语言:javascript
复制
WARNING: IPv4 forwarding is disabled. Networking will not work.

解决办法:

代码语言:javascript
复制
# 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私有仓库。

代码语言:javascript
复制
docker pull registry

以registry镜像启动容器,-p会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口

代码语言:javascript
复制
docker run -d -p 5000:5000 registry

假如有这么一种情况,咱们的容器需要对外进行提供服务,虚拟机内的IP地址肯定不可以直接作为访问地址的,但是我们ens33的地址可以配置成对外的公网IP 然后通过端口映射,是不是我们的docker容器也可以跑web服务了?

代码语言:javascript
复制
docker run -d -p 80:80 registry

访问

代码语言:javascript
复制
curl 127.0.0.1:5000/v2/_catalog

上传到私有仓库

代码语言:javascript
复制
docker tag centos6_x64

标记一下tag,必须要带有私有仓库的ip:port

代码语言:javascript
复制
[[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

把标记的镜像上传到私有仓库:

代码语言:javascript
复制
[[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

//如上报错了!

解决方案:

更改配置文件

代码语言:javascript
复制
vi /etc/docker/daemon.json  //更改为

{
"insecure-registries":["192.168.59.131:5000"]
}

重启docker服务:

代码语言:javascript
复制
systemctl restart docker
代码语言:javascript
复制
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到私有仓库呢?):

第一步:打标签

代码语言:javascript
复制
[[email protected] ~]# docker tag centos_vim 192.168.59.131:5000/centvim

第二步:上传

代码语言:javascript
复制
[[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

第三步:检查:

代码语言:javascript
复制
[root@zhdy01 ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos6","centvim"]}

配置完毕后,内网机器如何去连接呢?

代码语言:javascript
复制
第一步:
客户机需要安装并启动docker服务;

第二步:
配置私有仓库地址:
vi /etc/docker/daemon.json  //更改为

{
"insecure-registries":["192.168.59.131:5000"]
}

第三步:
下载镜像:
docker pull 192.168.59.131:5000/centvim
四、Docker 数据管理

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

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

-v 参数!

代码语言:javascript
复制
[[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

测试在容器内创建一个文件

代码语言:javascript
复制
[[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

//看来已经自动的存储到了宿主机的硬盘上!
创建一个新容器,让某一个容易的数据卷作为这个新容器的数据卷:
代码语言:javascript
复制
先找到我们所需要使用的数据卷:
[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的共享功能?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/03/14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、通过模板创建镜像
  • 二、Docker容器管理
  • 三、Docker 仓库管理
    • 总结下(如何上传一个images到私有仓库呢?):
    • 四、Docker 数据管理
      • 创建一个新容器,让某一个容易的数据卷作为这个新容器的数据卷:
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档