docker入门,自定义镜像,创建私有镜像仓库,外部存储,docker容器与真实机端口映射(二)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/ck784101777/article/details/102520810

[docker入门(一)]https://blog.csdn.net/ck784101777/article/details/102496159

一、自定义镜像

1.何时用到自定义镜像

-利用裸系统(最简化配置),制作自定义系统并保存为镜像

-将当前运行的容器做成镜像,保留改动

-将当前运行的容器转移到其他主机上

2.制作镜像-commit方式

运行容器->查看容器id->执行命令->查看镜像

命令:docker commit 镜像id 新镜像名

  1. [root@docker1 docker_images]# docker run -it docker.io/centos  //运行镜像
  2. [root@docker1 docker_images]# docker ps   //查看容器id
  3. [root@docker1 docker_images]# docker commit 8d07ecd7e345 docker.io/myos:latest
  4. sha256:ac3f9c2e8c7e13db183636821783f997890029d687b694f5ce590a473ad82c5f
  5. [root@docker1 ~]# docker images
  6. REPOSITORY TAG IMAGE ID CREATED SIZE
  7. docker.io/myos latest 87feda116c17 6 weeks ago 321.6 MB

3.制作镜像-Dockerfile方式

Dockerfile是通过脚本的方式制作镜像,不需要手动启动容器.我们需要手写一个名为Dockerfile的文件,并且按照语法格式配置一些参数.然后执行它

Dockerfile语法格式:

– FROM:基础镜像

– MAINTAINER:镜像创建者信息(说明)

– EXPOSE:开放的端口

– ENV:设置环境变量

– ADD:复制文件到镜像

– RUN:制作镜像时执行的命令,可以有多个,多个命令通过&隔开

– WORKDIR:定义容器默认工作目录

– CMD:容器启动时执行的命令,仅可以有一条CMD

通过一个案例来讲解每个参数的用法,下面是制作一个httpd容器的实验

  1. [root@docker1 ~]# mkdir bulid        //创建一个目录
  2. [root@docker1 ~]# cd bulid
  3. [root@docker1 bulid]# touch Dockerfile       //Dockerfile文件第一个字母要大写
  4. [root@docker1 bulid]# cp /etc/yum.repos.d/local.repo ./    //将yum源拷贝到当前路径下
  5. [root@docker1 bulid]#echo test > index.html                         //新建一个html页面
  6. [root@docker1 bulid]# vim Dockerfile          //编辑Dockerfile
  7. FROM docker.io/myos:latest                                                //基础镜像,这里写参照的镜像名
  8. RUN yum -y install httpd               //制作镜像时执行的命令
  9. ENV EnvironmentFile=/etc/sysconfig/httpd       //指定执行环境,这是httpd进程执行时参照的环境
  10. WORKDIR /var/www/html/                      //定义容器默认工作目录
  11. ADD index.html index.html             //将当前路径下的index.html拷贝到镜像里,命名为index.html
  12. EXPOSE 80                                                                        //设置开放端口号
  13. CMD ["/usr/sbin/httpd", "-DFOREGROUND"]                    //启动httpd服务,你可以通过httpd -T找到CMD这一行查看
  14. [root@docker1 bulid]# docker build -t docker.io/myos:http .  //别忘了加. 代表当前路径
  15. [root@docker1 bulid]# docker run -d docker.io/myos:http       
  16. d9a5402709b26b42cd304c77be442559a5329dc784ec4f6c90e4abac1c88e206
  17. [root@docker1 bulid]# docker inspect d9         //查看容器ip
  18. [root@docker1 bulid]# curl 172.17.0.7          //访问一下,是我们刚才写的文件吧
  19. test

二、创建私有镜像仓库

  镜像仓库结构图,我们来看看这个结构图.首先是Images(镜像)和Containers(容器),他们之间的关系是run与commit的关系,镜像通过run变成容器,镜像也可以通过tag(标签)根据原镜像生成一个硬连接.容器通过commit生成镜像,而容器又可以执行stop(停止),start(开始),restart(重启)命令

  在看看Dockerfile这个文件,这个文件就是用来构造镜像的,通过build命令生成镜像

  然后是backup.tar,镜像通过save生成本地镜像,通过load命令读取本地镜像

  Docker registry是镜像仓库,分为私有仓库和公共仓库,仓库是存储镜像的地方,我们公共push上传镜像到仓库,通过pull命令下载镜像

  

 

1.自定义一个私有仓库

1)安装仓库

创建私有仓库需要安装 docker-distribution服务

仓库镜像存储地址:/var/lib/registry

仓库配置文件:/etc/docker-distribution/registry/config.yml

  1. [root@docker1 bulid]# yum install docker-distribution
  2. [root@docker1 bulid]# systemctl start docker-distribution  //启动服务
  3. [root@docker1 bulid]# systemctl enable docker-distribution

2)配置文件修改

上传镜像需要关闭https验证(仅限私有仓库)和添加一个仓库

  1. [root@docker1 ~]#vim /etc/hosts         //添加一条域名解析 
  2. 192.168.1.31 docker1
  3. [root@docker1 ~]# vim /etc/sysconfig/docker
  4. ADD_REGISTRY='--add-registry docker1:5000'        //添加一个仓库
  5. INSECURE_REGISTRY='--insecure-registry docker1:5000'   //将这个仓库通过安全授权
  6. [root@docker1 ~]# systemctl restart docker          //重启docker

3)上传本地镜像到仓库

首先要为镜像创建标签,命令:docker tag 新镜像名:新标签名 ip/主机名:5000/镜像:镜像标签

然后是上传命令:docker push ip/主机名:5000/镜像:镜像标签

  1. [root@docker1 ~]# docker tag docker.io/busybox:latest 192.168.1.31:5000/docker.io/busybox:latest
  2. //打标签
  3. [root@docker1 ~]# docker push 192.168.1.31:5000/docker.io/busybox:latest
  4. //上传
  5. [root@docker1 ~]# docker tag docker.io/myos:http 192.168.1.31:5000/ docker.io/myos:http
  6. [root@docker1 ~]# docker push 192.168.1.31:5000/docker.io/myos:http

4)其他主机下载镜像

如果你想下载仓库里的镜像,你也要安装docker-distribution服务,并且修改配置文件

  1. [root@docker2 ~]# yum install docker-distribution
  2. [root@docker2 ~]# systemctl start docker-distribution     //启动服务
  3. [root@docker2 ~]# systemctl enable docker-distribution
  4. [root@docker2 ~]#vim /etc/hosts                 //添加一条域名解析 
  5. 192.168.1.31 docker1
  6. [root@docker2 ~]# vim /etc/sysconfig/docker
  7. ADD_REGISTRY='--add-registry docker1:5000'        //添加一个仓库
  8. INSECURE_REGISTRY='--insecure-registry docker1:5000'   //将这个仓库通过安全授权
  9. [root@docker2 ~]# systemctl restart docker          //重启docker
  10. [root@docker2 ~]#docker pull 192.168.1.31:5000/docker.io/busybox:latest                                   //下载镜像到本地

5)查看镜像仓库

查看私有镜像仓库中的镜像名称:curl http://ip:5000/v2/_catalog

查看某一仓库的标签:cutl http://ip:5000/v2/镜像名/tags/list

仓库镜像存储地址:/var/lib/registry

仓库的ip和主机名都可,主机名必须添加域名解析,如果v2找不到就试一下v1,v3这个我也讲不定

  1. [root@docker1 bulid]# curl http://docker1:5000/v2/_catalog //查看所有镜像
  2. {"repositories":["docker.io/busybox","docker.io/myos"]}   
  3. [root@docker1 bulid]# curl http://docker1:5000/v2/docker.io/busybox/tags/list //查看镜像标签
  4. {"name":"docker.io/busybox","tags":["latest"]}

三、持久化存储(外部存储)-存储卷

1.为什么使用外部存储

docker容器不是保存任何数据的,所以我们将重要的数据保存在外部磁盘上(存储卷),容器可以通过挂载真机的实际目录使用存储数据

2.启动时使用存储卷

命令:docker run -it -v /真机目录:/容器目录 容器名

本命令是将目录挂载到容器中提供持久化存储,目录不存在就自动创建,目录存在就覆盖掉,所以你要确认容器上是否有重名目录

3.实验-将NFS共享文件映射到两个容器中,使用共享资源

实验流程

1.服务器创建NFS共享存储目录,权限为rw

2.客户端挂载共享,将共享目录映射到容器中

3.docker1启动nginx

4.docker2启动apache

5.niginx和apache共享同一web目录

拓扑结构

镜像准备:

1个nginx镜像一个httpd镜像,用docker search 搜索即可

1)配置NFS服务器

  1. [root@nfs ~]# yum -y install nfs-utils       //安装nfs服务
  2. [root@nfs ~]# mkdir /webroot                //创建共享目录
  3. [root@nfs ~]# vim /etc/exports              //编辑nfs配置文件
  4. /webroot *(rw,no_root_squash)                        //rw root不降权
  5. [root@nfs ~]# systemctl restart nfs-server.service
  6. [root@nfs ~]# systemctl restart nfs-secure.service
  7. [root@nfs ~]# chmod 777 /content            //在其他主机上挂载nfs文件使用的用户是nfs用户没有写权限,将文件修改为777 所有用户有权限写
  8. [root@nfs ~]# echo hello wrold > /content/index.html   //指定一个测试页面

2)docker1主机配置-apache服务

  1. [root@docker1 bulid]# yum -y install nfs-utils              //安装nfs服务
  2. [root@docker1 bulid]# systemctl restart nfs-server.service   
  3. [root@docker1 bulid]# showmount -e 192.168.1.254   //查看可以挂载的nfs服务
  4. Export list for 192.168.1.254:
  5. /webroot *
  6. [root@docker1 ~]# mkdir /mnt/webroot              //创建挂载目录
  7. [root@docker1 ~]# mount -t nfs 192.168.1.254:/content /mnt/webroot   //挂载
  8. [root@docker1 ~]# ls /mnt/webroot                
  9. index.html
  10. //启动http容器 -p将端口映射到真机 -v映射真机存储卷
  11. [root@docker1 ~]# docker run -d -p 80:80 -v /mnt/webroot:/var/www/html -it docker.io/myos:http   
  12. 224248f0df5d795457c43c2a7dad0b7e5ec86abdc3f31d577e72f7929f020e01
  13. [root@docker1 ~]# curl 192.168.1.31:80       //由于已经将端口映射到真机 直接访问真机80端口即可
  14. hello wrold

 3)docker2主机配置-nginx服务

与上面配置差不多

  1. [root@docker2 ~]# yum -y install nfs-utils
  2. [root@docker2 ~]# showmount -e 192.168.1.254
  3. Export list for 192.168.1.254:
  4. /webroot *
  5. [root@docker2 ~]# mkdir /mnt/webroot
  6. [root@docker2 ~]# mount -t nfs 192.168.1.254:/content /mnt/webroot
  7. [root@docker2 ~]# docker run -d -p 80:80 -v /mnt/qq:/usr/share/nginx/html -it docker.io/nginx
  8. 00346dabec2c7a12958da4b7fee6551020249cdcb111ad6a1058352d2838742a
  9. [root@docker2 ~]# curl 192.168.1.32
  10. hello wrold

四、自定义网桥

1.为什么要自定义网桥?

-创建容器时默认创建的ip为172.17.0.0/24 这个网段的

-自定义网桥更容易记忆

-为了方便规划网络拓扑

-容器的特征是可以把宿主机变成对应的服务,为了外部网络的主机访问容器内的资源,必须配置网桥

2.如何使将容器端口与宿主端口绑定

使用-p 参数可以将容器端口与宿主端口绑定

命令: docker run  -p 宿主机端口:容器端口 -it 镜像名

如将httpd容器变为宿主机httpd服务

docker run itd -p 80:80 docker.ip/httpd

3.实验-自定义网桥

1)查看docker网卡

命令:docker network list

或者 docker network inspect 网卡名

  1. [root@docker1 ~]# docker network list
  2. NETWORK ID NAME DRIVER SCOPE
  3. 996943486faa bridge bridge local
  4. 63c88dcc3523 host host local
  5. 5e5ab3d45e27 none null local 

2)创建docker网卡 

命令:docker network create --subnet=ip 网卡名

  1. [root@docker1 ~]# docker network create --subnet=10.10.10.0/24 docker1
  2. b447cacc0373631ff7c534f119047946be5c1498b5b2e31a31180c5ee6320ab5
  3. [root@docker1 ~]# docker network list
  4. NETWORK ID NAME DRIVER SCOPE
  5. 996943486faa bridge bridge local
  6. 63c88dcc3523 host host local
  7. 5e5ab3d45e27 none null local 
  8. [root@docker1 ~]# docker network inspect docker1
  9. [
  10. {
  11. "Name": "docker1",
  12. "Id": "b447cacc0373631ff7c534f119047946be5c1498b5b2e31a31180c5ee6320ab5",
  13. "Scope": "local",
  14. "Driver": "bridge",
  15. "EnableIPv6": false,
  16. "IPAM": {
  17. "Driver": "default",
  18. "Options": {},
  19. "Config": [
  20. {
  21. "Subnet": "10.10.10.0/24"
  22. } ]
  23. },
  24. "Internal": false,
  25. "Containers": {},
  26. "Options": {},
  27. "Labels": {}
  28. }
  29. ]

3)使用创建的网卡

命令:docker run --network=网卡名 -itd 镜像名

  1. [root@docker1 ~]# docker run --network=docker1 -itd docker.io/myos
  2. 5270cba305c06c3da3f56185b35dc059aabcf2884a12ef717d89a768360e5326

4.修改宿主机网卡名

我们通过docker 命令创建的网卡,通过ifconfig看到的名字默认是br-网卡id ,可读性很差,下面演示如何修改默认网卡名

1)创建一个网卡并查看网卡名

  1. [root@docker1 ~]# docker network create --driver bridge docker02
  2. //新建一个 名为docker02的网络模型
  3. 5496835bd3f53ac220ce3d8be71ce6afc919674711ab3f94e6263b9492c7d2cc
  4. [root@docker1 ~]# ifconfig     
  5. //但是在用ifconfig命令查看的时候,显示的名字并不是docker02,而是br-5496835bd3f5
  6. br-5496835bd3f5: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
  7. inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
  8. ether 02:42:89:6a:a2:72 txqueuelen 0 (Ethernet)
  9. RX packets 8 bytes 496 (496.0 B)
  10. RX errors 0 dropped 0 overruns 0 frame 0
  11. TX packets 8 bytes 496 (496.0 B)
  12. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

2)查看inspect对于命名的规定

上面可以通过ifconfig查看到id号,前3位即可,或者通过docker network list 查看

我们再通过inspect查看一下docker网卡底层信息,看到"com.docker.network.bridge.name": "docker0"字样

[root@docker2 ~]# docker network inspect bc5

3)自定义命名创建

命令:docker network create 网卡名 -o com.docker.network.bridge.name=你要修改的网卡名

  1. [root@docker1 ~]# docker network rm docker02  //删除docker02重新创建
  2. docker02
  3. [root@docker1 ~]# docker network create \
  4. docker02 -o com.docker.network.bridge.name=docker02
  5. //创建docker02网桥
  6. 648bd5da03606d5a1a395c098662b5f820b9400c6878e2582a7ce754c8c05a3a
  7. [root@docker1 ~]# ifconfig                 //ifconfig查看有docker02
  8. docker02: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
  9. inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
  10. ether 02:42:94:27:a0:43 txqueuelen 0 (Ethernet)
  11. RX packets 0 bytes 0 (0.0 B)
  12. RX errors 0 dropped 0 overruns 0 frame 0
  13. TX packets 0 bytes 0 (0.0 B)
  14. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

猜你喜欢

转载自blog.csdn.net/ck784101777/article/details/102520810