Docker 数据管理与网络通信

本文涉及的产品
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
简介: Docker 镜像除了是 Docker 的核心技术之外也是应用发布的标准格式。一个完整的 Docker 镜像可以支撑一个 Docker 容器的运行。

Docker 数据管理与网络通信



一、Docker 镜像的创建


   1.基于已有镜像创建

   2.基于本地模板创建

   3.基于 Dockerfile 创建


二、Docker的数据管理


   1.数据卷

      1)创建数据卷

      2)挂载主机目录作为数据卷

   2.数据卷容器


三、Docker的网络通信


   1.端口映射

   2.容器互联


准备工作:


image.png



  • 提取码:8qf2


安装 Docker 服务:


[root@Docker ~]# ls
anaconda-ks.cfg  centos7  docker-18.03.1-ce.tgz
[root@Docker ~]# tar xf docker-18.03.1-ce.tgz 
[root@Docker ~]# cp docker/* /usr/bin/
[root@Docker ~]# dockerd &


image.png


载入 centos7 镜像:


[root@Docker ~]# docker load < centos7 
f972d139738d: Loading layer  208.8MB/208.8MB
Loaded image: centos:latest


一、Docker 镜像的创建



Docker 镜像除了是 Docker 的核心技术之外也是应用发布的标准格式。一个完整的 Docker 镜像可以支撑一个 Docker 容器的运行。


  • 创建镜像的三种方法:基于已有镜像创建、基于本地模板创建、基于 Dockerfile 创建。


1.基于已有镜像创建


主要使用 docker commit 命令,其实质就是把一个容器里面运行的程序及该程序的运行环境打包起来生成新的镜像。


  • 命令格式:docker commit [选项] 容器ID/名称 仓库名称:[标签]


常用选项


  • -m:说明信息


  • -a:作者信息


  • -p:生成过程中停止容器的运行


1)创建一个容器,并启用


[root@Docker ~]# docker create -it --name www centos:latest /bin/bash
[root@Docker ~]# docker start www
[root@Docker ~]# docker ps | grep www      #如果不显示表示没有启动成功

image.png


2)使用 docker commit 命令创建一个新的镜像


[root@Docker ~]# docker commit -m "Hello" -a "zhangsan" www docker:mycentos
[root@Docker ~]# docker images | grep docker


image.png


2.基于本地模板创建


  • 通过导入操作系统模块文件可以生成镜像,模板可以从 OPENVZ 开源项目 下载。


下面介绍的是 ubuntu 模板压缩包,将下载好的压缩包拖入:


[root@Docker ~]# ls
anaconda-ks.cfg  centos7  docker  docker-18.03.1-ce.tgz  ubuntu-12.04-x86-minimal.tar.gz
[root@Docker ~]# cat ubuntu-12.04-x86-minimal.tar.gz | docker import - ubuntu:v12
[root@Docker ~]# docker images | grep ubuntu


image.png


3.基于 Dockerfile 创建


Dockerfile 是由一组指令组成的文件,其中每条指令对应 Linux 中的一条命令,Docker 程序将读取 Dockerfile 中的指令生成指定镜像。Dockerfile 结构大致分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。


Dockerfile 每行支持一条指令,每条指令可携带多个参数,支持使用以 # 号开头的注释。


在编写 Dockerfile 时,有严格的格式要遵循:


  1. 第一行必须使用 FROM 指令指明所基于的镜像;
  2. 之后使用 MAINTAINER 指令说明维护该镜像的作者信息;
  3. 然后是镜像操作相关指令,如 RUN 指令;
  4. 最后使用 CMD 指令来指定容器要运行的命令操作。


常用的 Dockerfile 操作指令:


image.png


1)创建 Apache 镜像


[root@Docker ~]# yum -y install httpd && systemctl start httpd
[root@Docker ~]# cd /var/www/html/
[root@Docker html]# mkdir centos7
[root@Docker html]# mount /dev/cdrom centos7/


使用浏览器访问测试:


image.png


2)建立工作目录


[root@Docker html]# cd /root/
[root@Docker ~]# mkdir apache
[root@Docker ~]# cd apache/
[root@Docker apache]# vim Dockerfile
# 基于 CentOS 基础镜像
FROM centos
# 作者信息
MAINTAINER The zhangsan
# 删除无用文件
RUN rm -rf /etc/yum.repos.d/*
# 上传新的文件到镜像目录 (这个 .repo 文件要和 Dockerfile 文件位于同一个目录)
ADD CentOS7.repo /etc/yum.repos.d/
# 安装 Apache 服务
RUN yum -y install httpd
# 开启 80 端口
EXPOSE 80
# 复制网址首页到镜像中
ADD index.html /var/www/html/
# 将启动脚本复制到镜像中
ADD run.sh /
RUN chmod 755 /run.sh
# 配置 Apache 服务开机自启
RUN systemctl enable httpd
# 启动容器时执行脚本
CMD ["/run.sh"]


3)创建 .repo 文件


[root@Docker apache]# cat <<END > CentOS7.repo
[zhangsan]
name=zhangsan
baseurl=http://192.168.1.1/centos7
enabled=1
gpgcheck=0
END


image.png


4)编写执行脚本内容


[root@Docker apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*                               # 清理 HTTP 缓存
exec /usr/sbin/apachectl -D FOREGROUND                  # 启用 Apache 服务


5)创建测试页面


[root@Docker apache]# echo "This is beijing" > index.html
[root@Docker apache]# ls
CentOS7.repo  Dockerfile  index.html  run.sh


image.png


6)使用 Dockerfile 生成镜像


  • -t 表示生成新的镜像 名字: 标签


[root@Docker apache]# docker build -t httpd:centos .
[root@Docker apache]# docker images | grep httpd


image.png


7)使用新的镜像运行容器


[root@Docker ~]# docker run -d -p 888:80 --name mmm httpd:centos
[root@Docker ~]# docker ps | grep mmm


image.png


8)访问容器中的网页测试


image.png


二、Docker的数据管理



在Docker中,为了方便查看容器内产生的数据或者将多个容器中的数据实现共享,就是涉及到容器的数据管理操作。


  • 主要有两种方式:数据卷(Data Volumes)和数据卷容器(Data Volumes Containers)。


1.数据卷


数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似 Linux 下对目录进行 mount 操作。


1)创建数据卷


[root@Docker ~]# docker run -itd -v /data1 -v /data2 --name web1 centos:latest
[root@Docker ~]# docker ps | grep web1
[root@Docker ~]# docker exec -it web1 /bin/bash
[root@941a16b013ae /]# ls


image.png


  • 注意:上面这种创建方式只是创建数据卷,只可以实现宿主机的容量,给容器使用,还不可以实现数据通信。


2)挂载主机目录作为数据卷


  • 使用 -v 选项可以在创建数据卷同时,将宿主机的目录挂载到数据卷上使用,以实现宿主机与容器之间的数据迁移;


  • 宿主机的本地路径必须为绝对路径,如果路径不存在,则会在本地自动创建。


创建一个新的容器 web2 ,将宿主机的 /www 目录挂载到容器的 /data1 目录上:


[root@Docker ~]# docker run -itd -v /www:/data1 --name web2 centos:latest
[root@Docker ~]# docker ps | grep web2


image.png


在宿主机的 /www 的目录下,创建几个文件,并进入容器中查看:


[root@Docker ~]# cd /www/
[root@Docker www]# touch test{1..5}.txt
[root@Docker www]# ls


image.png


进入容器查看:


[root@Docker www]# docker exec -it web2 /bin/bash
[root@c2581b676431 /]# cd /data1/
[root@c2581b676431 data1]# ls


image.png


2.数据卷容器


如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器就是一个普通的容器,专门提供数据卷给其他容器挂载使用。


  • 使用方法:首先,需要创建一个容器作为数据卷容器,之后在其他容器创建时用 --volumes-from 挂载数据卷容器中的数据卷使用。


  • 注意:这里使用预先创建好的数据卷容器 web1 ,就是刚刚创建的名字为 web1 的容器。


web1 容器中创建的数据卷是 /data1 与 /data2;把这两个数据卷挂载到新的容器 db1 当中:


[root@Docker ~]# docker run -itd --volumes-from web1 --name db1 centos:latest
[root@Docker ~]# docker ps | grep db1
[root@Docker ~]# docker exec -it db1 /bin/bash
[root@37f24ebbdc0b /]# cd /data1/
[root@37f24ebbdc0b data1]# ls
[root@37f24ebbdc0b data1]# touch zhangsan{1..3}.txt
[root@37f24ebbdc0b data1]# ls
zhangsan1.txt  zhangsan2.txt  zhangsan3.txt
[root@37f24ebbdc0b data1]# exit
exit
[root@Docker ~]# docker exec -it web1 /bin/bash
[root@941a16b013ae /]# cd /data1/
[root@941a16b013ae data1]# ls
zhangsan1.txt  zhangsan2.txt  zhangsan3.txt


image.png


三、Docker的网络通信



  • Docker 提供了映射容器端口到宿主机和容器互联机制来为容器提供网络服务。


1.端口映射


在启动容器的时候,如果不指定对应的端口,在容器外将无法通过网络来访问容器内的服务。


Docker 提供端口映射机制来将容器内的服务提供给外部网络访问,实质上就是将宿主 主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。


实现端口映射,使用 run 命令 -P(大写) 命令实现随机映射,Docker 会随机映射宿主机端口范围在 49000~49900 的端口,到容器内部所有开发的网络端口,但范围也不是绝对的。


[root@Docker ~]# docker run -d --name Web1 -P httpd:centos
[root@Docker ~]# docker ps | grep Web1

image.png


在运行 docker run 命令使用小写 p 可以指定要映射的端口:


[root@Docker ~]# docker run -d --name Web1 -P httpd:centos
[root@Docker ~]# docker ps | grep Web1


image.png


  • 注意:-P 选项会自动映射容器中所有的端口,而 -p 需要一个一个的指定。


现在使用浏览器访问宿主机 IP 加上刚才转化的端口即可访问到容器的 80 端口:


image.png


image.png


2.容器互联


  • 容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道从而实现容器的互联。


  • 简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。


在运行 docker run 命令使用 --link 选项实现容器之间的互联通信:


  • 命令格式: --link name: alias :name 是要连接的容器名称(此名称有唯一性),alias 是这个连接的别名。


1)创建源容器 Apache1


[root@Docker ~]# docker run -itd --name Apache1 centos:latest
[root@Docker ~]# docker ps | grep Apache1       


image.png


2)创建接受容器 Apache2


[root@Docker ~]# docker run -itd --name Apache2 --link Apache1:zhangsan centos:latest
[root@Docker ~]# docker ps | grep Apache2
[root@Docker ~]# docker exec -it Apache2 /bin/bash
[root@d2ce248898ab /]# ping -c 2 Apache1
[root@d2ce248898ab /]# ping -c 2 zhangsan


image.png


  • 此时,接收容器和源容器已经建立互联关系,是一个安全隧道,不暴露端口到宿主机,从而避免了暴露端口到外部网络;


  • 但是,在 Apache1 中是 ping 不通 Apache2 因为只有接收容器,可以主动发起连接。


相关实践学习
MySQL基础-学生管理系统数据库设计
本场景介绍如何使用DMS工具连接RDS,并使用DMS图形化工具创建数据库表。
相关文章
|
1月前
|
缓存 网络协议 网络架构
Docker 网络 IP 地址冲突,就该这么处理!
Docker 网络 IP 地址冲突,就该这么处理!
|
5天前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
29天前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
22天前
|
存储 数据管理 应用服务中间件
Docker的数据管理实战篇
关于Docker数据管理实战的教程,涵盖了Docker数据卷的使用、特点、场景以及数据卷容器的概念和应用。
47 13
Docker的数据管理实战篇
|
22天前
|
Shell Linux Docker
自定义Docker网络
这篇文章介绍了如何使用Docker命令自定义网络,并通过创建和配置网络来实现容器间的通信。
26 6
自定义Docker网络
|
22天前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
70 0
Docker跨宿主机容器通信-通过网络跨宿主机互联
|
15天前
|
Kubernetes 安全 Docker
|
1月前
|
Kubernetes 网络安全 网络架构
Docker不同宿主机网络打通
【8月更文挑战第20天】在不同宿主机上打通Docker网络可通过多种方法:1) 使用Docker原生的Overlay或Macvlan网络驱动实现跨主机通信,如Overlay网络利用VXLAN技术连接多台宿主机,Macvlan则让容器直接接入物理网络;2) 利用第三方工具如Weave Net或Flannel构建虚拟网络,Weave Net简化网络配置,Flannel则适用于Kubernetes环境并通过UDP封装数据包实现通信。实施前需确保宿主机间网络畅通且防火墙设置适当。
|
1月前
|
存储 Docker 容器
在Docker中,容器退出后,通过docker ps命令查看不到,数据会丢失么?
在Docker中,容器退出后,通过docker ps命令查看不到,数据会丢失么?
|
2月前
|
JSON 数据格式 Docker
Docker 网络命令大全,建议收藏!
【7月更文挑战第22天】
126 7
Docker 网络命令大全,建议收藏!