Docker技术(下)

本文详细介绍了如何在Docker中创建自定义镜像,包括安装软件包、配置YUM源、使用Dockerfile进行自动化构建,以及如何通过自定义网络模型和端口映射来运行容器。同时,探讨了如何利用NFS实现数据持久化和共享存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义镜像

制作模板(包含yum源,软件包net-tools psmisc  vim-enhanced)

[root@docker01 ~]# docker run -it  centos:latest  /bin/bash
[root@a341db7d6937 /]# cd /etc/yum.repos.d/       
[root@a341db7d6937 yum.repos.d]# rm -rf *.repo
[root@a341db7d6937 yum.repos.d]# ls
[root@a341db7d6937 yum.repos.d]# vi local.repo
[server]
name=server
baseurl=ftp://192.168.1.254/CentOS7.4
gpgcheck=0
enabled=1
[root@a341db7d6937 yum.repos.d]# yum repolist
repolist: 9591
[root@a341db7d6937 yum.repos.d]# yum provides pstree
psmisc-22.20-15.el7.x86_64...
Filename    : /usr/bin/pstree...
[root@a341db7d6937 yum.repos.d]# yum -y install psmisc net-tools vim-enhanced
[root@a341db7d6937 ~]# exit

退出容器,创建模板  docker commit   IDs  镜像文件:标签

[root@docker01 ~]# docker ps -aq
a341db7d6937
[root@docker01 ~]# docker commit a34 mycentos:latest    //另存为一个新的镜像
sha256:bd08de39637c3304402119bad6e97944cea33289b1c4838e9dea5abcdcae445f
[root@docker01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            latest              bd08de39637c        15 seconds ago      362.9 MB
[root@docker01 ~]# docker history mycentos
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
bd08de39637c        40 seconds ago      /bin/bash                                       164.3 MB            
e934aafc2206        9 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
<missing>           9 months ago        /bin/sh -c #(nop)  LABEL org.label-schema.sch   0 B                 
<missing>           9 months ago        /bin/sh -c #(nop) ADD file:f755805244a649ecca   198.6 MB    

使用新的模板验证(刚才创建的模板是否有我们安装的内容)

[root@docker01 ~]# docker run -it mycentos:latest  /bin/bash  
[root@23e6c3a9bd6b /]# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 0.0.0.0
...
[root@23e6c3a9bd6b /]# pstree -p
bash(1)---pstree(17)
[root@23e6c3a9bd6b /]# yum repolist
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
repo id                                             repo name                                          status
server                                              server                                             9591
repolist: 9591

Dockerfile制作

格式:touch  Dockerfile(文件名必须为这个)

            FROM                                            基础镜像

            MAINTAINER                                 镜像创建者信息

            EXPOSE                                        开放的端口

            ENV                                                设置变量

            ADD(复制文件到镜像)               当前路径文件(不支持绝对路径)                      镜像内文件路径

            RUN                                                制作镜像时执行的命令,可以有多个(容器内运行的命令)

            WORKDIR                                      定义容器默认工作目录

            CMD                                                容器启动时执行的命令,仅可以有一条CMD ["/路径/命令","选项","参数"]

使用Dockerfile工作流程

mkdir  build;cd build  

vim Dockerfile

制作镜像      docker build -t  imagename  Dockerfile所在目录

制作一个yum镜像

[root@docker01 ~]# cp /etc/yum.repos.d/local.repo  .
[root@docker01 ~]# vim Dockerfile 
FROM  centos:latest
RUN   rm -rf /etc/yum.repos.d/*.repo
ADD   local.repo    /etc/yum.repos.d/local.repo
RUN   yum -y install psmisc  net-tools vim-enhanced
[root@docker01 ~]# docker build -t test:latest  .
Complete!
 ---> e7e6df25bf17
Removing intermediate container 59f262e70de7
Successfully built e7e6df25bf17
[root@docker01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                latest              e7e6df25bf17        2 minutes ago       310.8 MB

在yum镜像的基础上,运行ssh服务

  查看systemd是如何启动的,/usr/lib/systemd/system/sshd.service 

    环境变量:EnvironmentFile=/etc/sysconfig/sshd

   ExecStart=/usr/sbin/sshd -D $OPTIONS(在环境变量里没有相关说明,可以省略)

[root@guo ~]# vim Dockerfile

FROM mycentos:latest
RUN  yum -y install openssh-server initscripts
RUN  sshd-keygen
RUN  echo '123456' | passwd --stdin root
ENV  EnvironmentFile=/usr/sysconfig/sshd
EXPOSE 22
CMD  ["/usr/sbin/sshd","-D"]

书写Dockerfile 安装apache   默认启动为httpd 修改首页 设置默认工作目录为 /var/www/html

[root@docker01 ~]# vim Dockerfile 
FROM  mycentos:latest
RUN   yum -y install httpd
RUN   echo 'ServerName  localhost' >  /etc/httpd/conf.d/aa.conf
ENV   EnvironmentFile=/etc/sysconfig/httpd
WORKDIR /var/www/html
RUN   echo 'hello world' > /var/www/html/index.html
EXPOSE 80
EXPOSE 443
CMD   ["/usr/sbin/httpd","-DFOREGROUND"]
[root@docker01 ~]# docker build -t centos:httpd .
...
Successfully built 3685501bb754
[root@docker01 ~]# docker run -itd centos:httpd 
012effeca693034b9d66c81e5539d1472985902054e89513fb4a8aeb05ac114e
[root@docker01 ~]# curl 172.17.0.2
hello world
[root@docker01 ~]# docker  ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
012effeca693        centos:httpd        "/usr/sbin/httpd -DFO"   33 seconds ago      Up 30 seconds            80/tcp              jolly_raman

自定义镜像仓库

 registry 共享镜像的一台服务器( 镜像化的一台服务器)

docker run   -p: 端口映射,格式为:主机(宿主)端口:容器端口

[root@docker01 ~]# vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.1.11:5000"]                 //使用私有仓库运行容器
}     
[root@docker01 ~]# systemctl restart docker
[root@docker01 ~]# docker run -itd -p 5000:5000 registry
0b709d150d29af22d93c476bb49f953818b5eba7fb57cd10c28abfe60d2a2779
[root@docker01 ~]# curl 192.168.1.11:5000/v2/
{}                                                            //出现括号
[root@docker01 ~]# docker tag busybox:latest   192.168.1.11:5000/busybox:latest
[root@docker01 ~]# docker push 192.168.1.11:5000/busybox:latest
The push refers to a repository [192.168.1.11:5000/busybox]
683f499823be: Pushed 
latest: digest: sha256:511cc7e65ef7ccf13f417962c2f71297d3b132f12c95909de6c85ac3c326a827 size: 527
[root@docker01 ~]# curl http://192.168.1.11:5000/v2/busybox/tags/list    //查看镜像的标签busybox为镜像的名字
{"name":"busybox","tags":["latest"]}
[root@docker01 ~]# curl  192.168.1.11:5000/v2/_catalog                  //查看镜像
{"repositories":["busybox"]}
[root@docker01 ~]# 

在客户端验证

[root@docker02 ~]# scp docker01:/etc/docker/daemon.json  /etc/docker   //因为没做域名
ssh: Could not resolve hostname docker01: Name or service not known
[root@docker02 ~]# scp 192.168.1.11:/etc/docker/daemon.json  /etc/docker
Are you sure you want to continue connecting (yes/no)? yes
root@192.168.1.11's password: 
daemon.json                                 100%   48     2.4KB/s   00:00    
[root@docker02 ~]# systemctl restart docker
[root@docker02 ~]# cat /etc/docker/daemon.json 
{
"insecure-registries":["192.168.1.11:5000"]
}
[root@docker02 ~]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
192.168.1.11:5000/busybox   latest              3a093384ac30        2 weeks ago         1.199 MB
[root@docker02 ~]# docker run -it 192.168.1.11:5000/busybox:latest
[root@docker02 ~]# docker ps -a
CONTAINER ID        IMAGE                              COMMAND             CREATED             STATUS                              PORTS               NAMES
fad382004219        192.168.1.11:5000/busybox:latest   "sh"                5 minutes ago       Up 5 minutes                                            romantic_nobel

持久化存储

docker容器不保持任何数据,重要数据使用外部卷存储(数据持久化) 容器可以挂载真实机目录或共享存储为卷

主机卷的映射:将真实机目录挂载到容器中提供持久化存储

共享存储:一台共享存储服务器可以提供给所有Docker主机使用,如共享存储服务器(NAS,SAN,DAS等)

docker run  -itd 镜像:标签   -v  宿主机路径:容器内路径

案例:拓扑简易模型如下,要求实现客户端挂载共享,并将目录映射到容器,docker1更新文件,daoker2实现同步更新

          NFS服务器(192.168.1.254)——switch——Docker主机1(192.168.1.10)

                                                                         \——Docker主机2(192.168.1.20)

  NFS服务器

[root@room9pc01 ~]# yum -y install nfs-utils
[root@room9pc01 ~]# mkdir /content
[root@room9pc01 ~]# vim /etc/exports
/content     *(rw,no_root_squash)
[root@room9pc01 ~]# systemctl restart nfs-server.service
[root@room9pc01 ~]# systemctl restart nfs-secure.service
[root@room9pc01 ~]# exportfs  -rv
exporting *:/content
[root@room9pc01 ~]# chmod 777 /content
[root@room9pc01 ~]# echo 11 > /content/index.html

NFS客户端

[root@docker1 oo]# yum -y install nfs-utils
[root@docker1 oo]# systemctl restart nfs-server.service
[root@docker1 oo]# showmount -e 192.168.1.254
Export list for 192.168.1.254:
/content *
[root@docker1 ~]# mkdir /mnt/test
[root@docker1 ~]# mount -t nfs 192.168.1.254:/content /mnt/test
[root@docker1 ~]# ls /mnt/test
index.html
[root@docker1 ~]# cat  /mnt/test/index.html 
11
[root@docker1 ~]# docker run  -d -p 80:80 -v /mnt/test:/var/www/html -it myos:http
224248f0df5d795457c43c2a7dad0b7e5ec86abdc3f31d577e72f7929f020e01
[root@docker1 ~]# curl 192.168.1.10
11
[root@docker2 ~]# yum -y install nfs-utils
[root@docker2 ~]# showmount -e 192.168.1.254
Export list for 192.168.1.254:
/content *
[root@docker2 ~]# mkdir /mnt/test
[root@docker2 ~]# mount -t nfs 192.168.1.254:/content /mnt/test
[root@docker2 ~]# docker run  -d -p 80:80 -v /mnt/test:/var/www/html -it 192.168.1.10:5000/myos:http
00346dabec2c7a12958da4b7fee6551020249cdcb111ad6a1058352d2838742a
[root@docker2 ~]# curl 192.168.1.20
11
[root@docker1 ~]# touch /mnt/test/a.sh
[root@docker1 ~]# echo 22 > /mnt/test/index.html
[root@docker2 ~]#ls  /mnt/test/
a.sh  index.html
[root@docker2 ~]# cat /mnt/test/index.html 
22

Docker网络架构

案例:

自定义网桥——创建网桥设备docker01 设定网段为172.30.0.0/16  启动nginx容器,桥接到docker01  映射真实机8080端口与容器的80端口

 新建docker1网络模型

[root@docker1 ~]# docker  network  create  --subnet=172.30.0.0/16 docker01
c9cf26f911ef2dccb1fd1f670a6c51491e72b49133246f6428dd732c44109462
[root@docker1 ~]# docker  network  list
NETWORK ID          NAME                DRIVER              SCOPE
bc189673f959        bridge              bridge              local               
6622752788ea        docker01             bridge             local               
53bf43bdd584        host                host                local                
ac52d3151ba8        none                null                local                
[root@docker1 ~]# ip  a   s
[root@docker1 ~]# docker  network   inspect   docker01
[
    {
        "Name": "docker01",
        "Id": "c9cf26f911ef2dccb1fd1f670a6c51491e72b49133246f6428dd732c44109462",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.30.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

 使用自定义网桥启动并映射端口

[root@docker1 ~]# docker  run  --network=docker01   -id   nginx   #使用自定义网桥

[root@docker1 ~]# docker  run  -p  8080:80  -id  nginx            #端口映射
e523b386f9d6194e53d0a5b6b8f5ab4984d062896bab10639e41aef657cb2a53
[root@docker1 ~]# curl 192.168.1.10:8080

如果发现自己创建的网桥名字却不显示,需要这么做

例如新建一个网桥docker02

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

[root@docker1 ~]# docker  network  list            //查看显示docker02(查看加粗字样)
NETWORK ID          NAME                DRIVER              SCOPE
bc189673f959        bridge              bridge              local               
5496835bd3f5        docker02             bridge             local               
53bf43bdd584        host                host                local               
ac52d3151ba8        none                null                local

2)我们注意到bridge的NETWORK ID 为 bc189673f959

3)查看其信息

[root@docker2 ~]# docker network inspect bc189673f959 
...
       "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
       "com.docker.network.bridge.name": "docker0",    #可以看到有一个这样的字段
       "com.docker.network.driver.mtu": "1500"
     },
     "Labels": {}
   }
]

4)把刚才创建的docker02删除

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

5)如果想在创建其他网段时候也显示名字 比如创建docker03

[root@docker1 ~]# docker network create docker03 --subnet=172.30.0.0/16 -o com.docker.network.bridge.name=docker03
f003aa1c0fa20c81e4f73c12dcc79262f1f1d67589d7440175ea01dc0be4d03c
[root@docker1 ~]# ifconfig           //ifconfig查看,显示的是自己定义的网段
docker03: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.30.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:27:9b:95:b3  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值