Docker数据卷/镜像/网络

数据卷
commit 构建镜像
#提交container为一个镜像(以容器为基础创建一个新镜像)
docker commit -m="message" -a="author" container-id image-name[:tag]

#容器数据卷,主机和容器的目录同步实现数据共享 -v
docker run  -v 主机目录:容器目录  container-id

#查看卷是否挂载成功
docker inspect container-id
 "Mounts": [
           {
               "Type": "bind",
               "Source": "/home/test",  #主机目录
               "Destination": "/home/test", #容器目录
               "Mode": "",
               "RW": true,
               "Propagation": "rprivate"
           }
有以上信息说明挂载成功
匿名挂载

-v 容器内路径

具名挂载

-v 卷名:容器内路径

指定路径挂载

-v /主机路径:容器内路径

#查看所有卷信息
docker volume ls
注:没有指定路径挂载卷时,卷数据存储在宿主机的 /var/lib/docker/volumes/卷名/_data 路径下

#数据卷容器访问权限设置,宿主机无影响。
-v 卷名:容器路径:ro   只读
-v 卷名:容器路径:rw   可读可写
mysql安装示列
#下载mysql镜像
docker pull mysql:5.7
#后台运行mysql5.7,并设置数据卷挂载
docker run --name mysql01 -d -p 3300:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
--name 自定义容器名字
-d 后台运行
-p 端口映射 主机端口:容器端口
-v 数据卷挂载 主机目录:容器目录
-e 环境设置
容器删除后,卷对应的主机目录数据不会删除!即实现数据持久化功能
数据卷容器(容器间数据共享)
# container1 --volumes-from  container2 实现两个容器自己的数据卷挂载,container2为container1的数据卷容器
docker run -it --name c1 --volumes-from c2 centos #使用centos镜像启动名为c1的容器其挂载于c2容器,实现容器间的数据共享,c2删除c1的数据不会受影响
Dockerfile 构建镜像

dockerfile:用于构建docker镜像的构建文件

dockerfile的指令:

FROM 		指定基础镜像
MAINTAINER  指定维护者,镜像作者,姓名+邮箱
RUN   		镜像构建时需要运行的命令
ADD  		添加其他需要的镜像
WORKDIR 	设置当前镜像工作目录,通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
VOLUME 		挂载的目录
EXPOSE 		指定暴露端口
CMD 		容器启动时运行的命令。对于输入到镜像文件后的命令,会替换CMD后的命令。
ENTRYPOINT 	容器启动时运行的命令。对于输入到镜像文件后的命令,会追加到ENTRYPOINT后的命令。
ONBUILD  	是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。
COPY  		将文件拷贝到此镜像中,相当于ADD
ENV  		构建时设置环境变量
通过dockerfile制作一个centos镜像

1.编写dockerfile构建文件:

vim centos-df  #创建并打开centos-df 文件
#写入以下代码
FROM centos
MAINTAINER ztind<1356798719@qq.com>
RUN yum -y install vim
RUN yum -y install net-tools
ENV MYPATH /usr/local
WORKDIR $MYPATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
cat  centos-df #查看文件内容

2.构建dockerfile文件为一个镜像

格式: docker build -f dockerfile文件地址 -t 构建成的镜像文件名[:tag]  输出地址
docker build -f centos-df -t mycentos:1.0 . 

构建成功最后打印出:

Successfully built 59b771c8f1c7
Successfully tagged mycentos:1.0

查看镜像列表docker images:

[root@VM-0-9-centos dockerfile]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            1.0                 59b771c8f1c7        48 seconds ago      295MB

3.启动构建成功的镜像文件

docker run -it mycentos:1.0  

运行容器后bash状态,可以用vim,ifconfig
[root@VM-0-9-centos dockerfile]# docker run -it mycentos:1.0
[root@32129408b569 local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src
[root@32129408b569 local]# 

查看镜像的构建历史信息

docker history 镜像id

注:dockerfile文件名官方推荐使用Dockerfile,-f xxx 就可以省略书写。docker build 会自动构建这个文件

4.发布镜像到Dockerhub

#登陆Dockerhub
docker login -u you-docker-id 
Password:

#push推送镜像到Dockerhub
docker push you-docker-id/image-name:tag

问题:
[root@VM-0-9-centos dockerfile]# docker push docker1581/mycentos:1.0
The push refers to repository [docker.io/docker1581/mycentos]
An image does not exist locally with the tag: docker1581/mycentos

解决,重新为镜像生成一个tag版本,然后push这个版本:
docker tag image-id you-docker-id/image-name:tag

5.发布镜像到阿里云

  • 登陆阿里云
  • 选择容器镜像服务
  • 创建命名空间
  • 创建镜像服务
  • 点击进入创建的镜像,看文档操作

6.退出登陆

docker logout
Docker 网络

查看网路相关命令

docker network --help 
[root@VM-0-9-centos /]# docker network --help

Usage:	docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.

查看容器内部网路地址

 docker ... ip addr

–link 实现容器之间的互链

docker run -d --name tomcate01 --link tomcate02  #tomcate01链到tomcate02

查看所有的docker网路

docker netwoek ls

网路模式

bridge 桥接模式,docker默认
host 和宿主机共享网路
none  不配置网路
container 容器网路互相连通

默认网络

docker run -d -P --name tomcat01  tomcat
等同
docker run -d -P --name tomcat01 --net bridge tomcat
# 默认创建的容器被添加到docker0网路
# --net bridge 命令就是创建默认的docker0网络,docker0为默认使用的网络,域名不可访问

1.创建一个网路

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# --driver bridge 桥接模式
# --subnet 192.168.0.0/16 子网
# --gateway 192.168.0.1 网关

2.查看刚创建的网路详情

[root@VM-0-9-centos /]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "8537ffad0dc5a8aff65d7b37b7ff03f4b75d27f4445cb054fe9893e857460e80",
        "Created": "2020-09-14T11:17:36.373620202+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
[root@VM-0-9-centos /]# 

3.将容器添加到刚创建的网络

#将启动的tomcat02添加到mynet网路
docker run -d -P --name tomcat02 --net mynet tomcat 

4.此时,docker network inspect mynet命令可以看到tomcat02容器已经被添加到Containers配置里

[root@VM-0-9-centos /]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "8537ffad0dc5a8aff65d7b37b7ff03f4b75d27f4445cb054fe9893e857460e80",
        "Created": "2020-09-14T11:17:36.373620202+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "81bc42046109c25b26124602fb8d1c12bb3f5fa9ff88d01117b661cec4610b4f": {
                "Name": "tomcat02",
                "EndpointID": "4ddced28d74e1022b717509bdb769229e3afa3c562a23fc5dfea8db8ef116761",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

5.自定义网路不使用–link,使用 ping container-name 也可以实现两容器之间的互连

6.使用 docker network connect [OPTIONS] NETWORK CONTAINER 实现在不同网路之间的容器链接到网路。
即tomcat01容器默认在docker0网路,tomcat02容器在我们刚创建的mynet网路。要实现tomcat01容器能通信到tomcat02容器,得使tomcat01链接到mynet网路即可(本质为在mynet的Containers配置下添加tomcat01容器的信息)。

docker network connect mynet tomcat01

ping测试:

[root@VM-0-9-centos /]# docker exec tomcat01 ping tomcat02  
ping: tomcat02: Name or service not known   #在未链接请ping失败,不可互通
[root@VM-0-9-centos /]# docker network connect mynet tomcat01  #将tomcat01容器链接到mynet网路
[root@VM-0-9-centos /]# docker network inspect mynet  #查看mynet网路详情
[
    {
        "Name": "mynet",
        "Id": "8537ffad0dc5a8aff65d7b37b7ff03f4b75d27f4445cb054fe9893e857460e80",
        "Created": "2020-09-14T11:17:36.373620202+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "5a06929e51f110ad5f514a49d9eed9e26ca2ca201c47fd138beb339828cd40f9": {
                "Name": "tomcat03",
                "EndpointID": "1a11b2c4b1c148a82a419aa2b1caed583f8a7de550e99821a5e3beb9f5f7c4c7",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "81bc42046109c25b26124602fb8d1c12bb3f5fa9ff88d01117b661cec4610b4f": {
                "Name": "tomcat02",
                "EndpointID": "4ddced28d74e1022b717509bdb769229e3afa3c562a23fc5dfea8db8ef116761",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "c03642d14a8d5aa92df392d022a930dea680614dfe152c6ce559fd1c024653b6": {
                "Name": "tomcat01",
                "EndpointID": "91bbaffee4070f92f49d75ba31a7579b1f8d6bf243b4d83e621548f73e8f6d76",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
[root@VM-0-9-centos /]# docker exec tomcat01 ping tomcat02   
PING tomcat02 (192.168.0.2) 56(84) bytes of data.   #connect后,ping成功
64 bytes from tomcat02.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.056 ms
64 bytes from tomcat02.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.051 ms
64 bytes from tomcat02.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.046 ms
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值