- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Docker数据管理与网络通信的使用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
可以通过dokcer核心及安装来安装docker及简单操作.
一.docker镜像的创建方法 。
docker镜像除了是docker的核心技术之外,也是应用发布的标准格式。一个 完整的docker镜像可以支撑- -个docker 容器的运行,在docker的整个使用过程中,进入- -个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务,如果要把已经安装的服务进行迁移,就需要把环境及搭建的服务生成新的镜像.
(1)基于已有镜像创建 。
基于已有镜像创建主要使用docker commit命令。其实质就是把一个容 器里面运行的程序及该程序的运行环境打包起来生成新的镜像.
命令格式如下:
docker commit 【选项】 容器id/名称 仓库名称:【标签】 。
参数如下:
(1)先安装docker,在创建个镜像 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
[root@localhost ~]
# yum -y install docker
[root@localhost ~]
# systemctl start docker
[root@localhost ~]
# mount /dev/cdrom /media/
mount
:
/dev/sr0
写保护,将以只读方式挂载
[root@localhost ~]
# cd /media/
[root@localhost media]
# ls
apache-tomcat-8.5.16.
tar
.gz dhcp jdk-8u91-linux-x64.
tar
.gz
centos httpd registry.
tar
.gz
centos6 httpd_centos ubuntu-12.04-x86_64-minimal.
tar
.gz
[root@localhost media]
# docker load < dhcp \\zair载入镜像到本地
[root@localhost media]
# docker images \\查看镜像
[root@localhost media]
# docker create -it docker.io/networkboot/dhcpd /bin/bash \\创建容器
dfbe3a15f462d82674cfdfe87dfb7c4b4b1dcf2267e5c0043510cbe10f11a65b
[root@localhost /]
# docker ps -a \\查看容器
container
id
image
command
created status ports names
dfbe3a15f462 docker.io
/networkboot/dhcpd
"/entrypoint.sh /b..."
about a minute ago created determined_dubinsky
[root@localhost /]
# docker start dfbe3a15f462 \\启动容器
dfbe3a15f462
[root@localhost /]
# docker exec -it dfbe3a15f462 /bin/bash
root@dfbe3a15f462:/
# touch 123 \\创建俩个文件
root@dfbe3a15f462:/
# touch 456
|
(2) 启动一个镜像,在容器里做修改,然后将修改后的容器提交为新的镜像,需要记住该容器的d号,例如
1
2
3
|
[root@localhost /]
# docker ps -a
container
id
image
command
created status ports names
dfbe3a15f462 docker.io
/networkboot/dhcpd
"/entrypoint.sh /b..."
5 minutes ago up 2 minutes determined_dubinsky
|
(3)使用dockercommit命令创建一个新镜像,如下:
1
2
|
[root@localhost /]
# docker commit -m "newdhcp" -a "xws" dfbe3a15f462 docker:mydhcp
sha256:2c1acb192f78bbbb584fc52954a179eb0f10730e0cd58d120d952439ead45b00
|
(4)创建完成后.会返回新创建镜像的id信息。查看本地镜像列表可以看到新创建的镜像信息
1
2
3
4
|
[root@localhost /]
# docker images
repository tag image
id
created size
docker mydhcp 2c1acb192f78 about a minute ago 125 mb
docker.io
/networkboot/dhcpd
latest 6f98b6b9b486 19 months ago 125 mb
|
(2)基于本地模板创建 。
通过导入操作系统模板文件可以生成镜像,模板可以从openvz 开源项目下载,下载地址为 http://openvz.org/download/template/precreated. 。
用 命令下载如下 。
1
|
wget http:
//down1oad
. openvz . org/ template
/precreated/ubuntu-12
.04-x86_ 64-minimal.
tar
.gz
|
(3)基于dockerfile创建 。
除了手动生成docker镜像之外,可以使用dockerfile自动生成镜像。dockerfile 是由-组指令组成的文件,其中每条指令对应linux中的一条命令, docker 程序将读取dockerfile中的指令生成指定镜像.
dockerfile结构大致分为4个部分:基础镜像信息、维护者信息.镜像操作指令和容器启动时执行指令 。
在编写dockerfile时,有严格的格式需要遵循:第一行必须使用from指令指明所基于的镜像名称:之后使用maintainer指令说明维护该镜像的用户信息:然后是镜像操作相关指令,如run指令,每运行一条指令,都会给基础镜像添加新的一层;最后使用cmd指令来指定启动容器时要运行的命令操作.
案例:使用dockerfile创建镜像并在容器中运行 。
1.建立工作目录 。
1
2
|
[root@localhost /]
# mkdir apache
[root@localhost /]
# cd apache/
|
2.创建并编写dockerfile文件 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@localhost media]
# docker load < centos \\先把centos载入到本地
[root@localhost apache]
# vim dockerfile
from centos \\基于centos基础镜像
maintainer the centos projier \\维护该镜像用户信息,后面随便写
run yum -y update \\镜像操作指令安装apache软件包
run yum -y
install
httpd
expose 80 \\开启80端口
add index.html
/var/www/html/index
.html
//
复制网站首页文件
add run.sh
/run
.sh
//
将执行脚本复制到镜像中
run
chmod
775
/run
.sh
run systemctl disable httpd \\设置apache开启不启动
cmd 【“
/run
.sh”】 \\启动容器执行脚本
|
3.编写执行脚本内容 。
1
2
3
4
|
[root@localhost apache]
# vim run.sh
#!/bin/bash
rm
-rf
/run/httpd/
* \\清理http的缓存
exec
/usr/sbin/apachectl
-d foreground \\启动apache服务
|
4.创建测试页面 。
1
2
3
|
[root@localhost apache]
# echo "asd" >index.html
[root@localhost apache]
# ls
dockerfile index.html run.sh
|
5.使用dockerfile生成镜像 。
编写完成dockerfile及相关内容之后,可以通过docker build 命令来创建镜像.
docker build 【选项】 路径 。
使用方才编写的dockerfile自动生成镜像 。
1
|
[root@localhost apache]
# docker build -t httpd:centos .
|
在自动生成镜像的命令指定镜像后,一定不要忘记写新生成镜像的存放路径,也就是空格后的一个”."代表当前路径,否则会报错.
6.使用新的镜像运行容器 。
将新生成的镜像加载到容器中运行 。
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@localhost /]
# docker run -d -p 12345:80 httpd:centos
ee9adf324443b006ead23f2d9c71f86d1a4eb73358fb684ee3a2d058a0ac4243
[root@localhost apache]
# docker ps -a
container
id
image
command
created status ports names
99e9234cefe5 httpd:centos
"/run.sh"
8 seconds ago up 7 seconds 0.0.0.0:12345->80
/tcp
youthful_lumiere
dfbe3a15f462 docker.io
/networkboot/dhcpd
"/entrypoint.sh /b..."
56 minutes ago up 53 minutes determined_dubinsky
//
使用新生成的镜像加载到容器中运行
//
“-p”选项实现从本地端口12345到容器中80端口的映射
|
用浏览器访问网页 。
二.docker的数据管理 。
在docker中,为了方便查看容器内产生的数据或者将多个容器之间的数据实现共享,会涉及容器的数据管理操作。管理docker容器中的数据主要有两种方式:数据卷(data volumes)和数据卷容器(data volumes containers).
(1)数据卷 。
数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像.从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于linux下对目录进行的mount操作.
1.创建数据卷 。
1
2
|
[root@localhost /]
# docker run -d -v /data1 -v /data2 --name web httpd:centos
4944c63124d2f96bedd78b4016e6d96e464089626e97b913b06ec888e7ab8f65
|
1
2
3
4
5
|
[root@localhost /]
# docker exec -it web /bin/bash \\进入容器可以看到已经和宿主机一样了
[root@4944c63124d2 /]
# ls
anaconda-post.log boot data2 etc lib media opt root run.sh srv tmp var
bin data1 dev home lib64 mnt proc run sbin sys usr
[root@4944c63124d2 /]
#
|
(2)挂载主机目录作为数据卷 。
例如 。
1
2
|
[root@localhost /]
# docker run -d -v /var/www:/xws --name web-1 httpd:centos
05079057bf0c7c47b14fd457d1a5df0e29f080b6103753399654ef9d0aa4bf0f
|
中间:以前为宿主机的目录,后面为容器里的目录 。
1
2
3
4
|
[root@localhost /]
# cd /var/www/
[root@localhost www]
# touch asdasdasd
[root@localhost www]
# ls
asdasdasd
|
进入容器里看一下 。
1
2
3
4
5
6
7
|
[root@localhost /]
# docker exec -it web-1 /bin/bash
[root@05079057bf0c /]
# ls
anaconda-post.log boot etc lib media opt root run.sh srv tmp var
bin dev home lib64 mnt proc run sbin sys usr xws
[root@05079057bf0c /]
# cd xws
[root@05079057bf0c xws]
# ls
asdasdasd
|
可以看到宿主机与容器共享 。
(2)数据卷容器 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@localhost /]
# docker run -it --volumes-from web --name 777 httpd:centos /bin/bash
[root@d6324596cb2c /]
# cd data1
[root@d6324596cb2c data1]
# touch file
[root@d6324596cb2c data1]
# exit
exit
[root@localhost /]
# docker exec -it web /bin/bash
[root@4944c63124d2 /]
# ls
123 bin data1 dev home lib64 mnt proc run sbin sys usr
anaconda-post.log boot data2 etc lib media opt root run.sh srv tmp var
[root@4944c63124d2 /]
# cd data1
[root@4944c63124d2 data1]
# ls
file
[root@4944c63124d2 data1]
#
|
可以看到俩个容器共享 。
(3)docker网络通信 。
docker提供了映射容器端口到宿主机和容器互联机制来为容器提供网络服务。 实现端口映射,需要在运行docker run命令时使用-p (大写)选项实现随机映射,docker 会随机映射一个端口范围在49000~ 49900的端口到容器内部开放的网络端口, 。
1.端口映射 。
1
2
3
4
5
|
[root@localhost /]
# docker run -d -p httpd:centos
70762709d90a8365803b8b13be02e06e2f9c0b4fdb8624bad01d579817809
[root@localhost /]
# docker ps -a
container
id
image
command
created status ports names
70762709d90a httpd:centos
"/run.sh"
5 seconds ago up 4 seconds 0.0.0.0:**32768**->80
/tcp
kickass_bhaskara
|
可以看到端口变为32768 。
也可以指定端口 。
1
2
|
[root@localhost /]
# docker run -d -p 123:80 httpd:centos
9c7b1b3989b30f44c22276a62674e565daf410e05bdf0b4892c09dca22662253
|
2.容器互联 。
容器互联是通过容器的名称在容器间建立一条 专门的网络通信隧道从而实现的互联。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息,在运行docker run 命令时使用--link选项实现容器之间的互联通信。 格式为
--link name:alias \别名 。
创建源容器 。
1
2
|
[root@localhost /]
# docker run -d -p --name web1 httpd:centos
0105f396c69b15557af4c15a62143872e725a28050075b554a4d2765a504d558
|
创建接收容器 。
使用docker run 命令建立容器b,-- -name指定名称为web2. --link 指定连接容器以实现容器互联.
1
2
|
[root@localhost /]
# docker run -d -p --name web2 --link web1:web1 httpd:centos
10413ec7492d1d4bab724b4ecf2c2378dae6f496d14c2d68d27ee29b6a26bb1a
|
测试容器互联 。
1
2
3
4
5
6
7
8
9
|
[root@localhost /]
#** docker exec -it web2 /bin/bash**
[root@10413ec7492d /]
# **ping web1**
ping
web1 (172.17.0.8) 56(84) bytes of data.
64 bytes from web1 (172.17.0.8): icmp_seq=1 ttl=64
time
=0.153 ms
64 bytes from web1 (172.17.0.8): icmp_seq=2 ttl=64
time
=0.063 ms
64 bytes from web1 (172.17.0.8): icmp_seq=3 ttl=64
time
=0.064 ms
64 bytes from web1 (172.17.0.8): icmp_seq=4 ttl=64
time
=0.074 ms
64 bytes from web1 (172.17.0.8): icmp_seq=5 ttl=64
time
=0.065 ms
64 bytes from web1 (172.17.0.8): icmp_seq=6 ttl=64
time
=0.065 ms
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.51cto.com/14400213/2454223 。
最后此篇关于Docker数据管理与网络通信的使用的文章就讲到这里了,如果你想了解更多关于Docker数据管理与网络通信的使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
推荐使用以下哪种 javascript 数据管理方法? jLinq jOrder 我熟悉 jLinq,但不确定是否使用 jLinq 或 jOrder。更喜欢具有更好 API 的那个。 最佳答案 jLi
我正在用 C# 做一个项目,我遇到了以下问题: 我有一些数据类型的类,例如 Person 类,它保存有关一个人的信息。 另外,我还有一个DataManager类,负责管理我程序中的人员。如果您想添加、
我不太习惯使用 Ajax,因为我刚刚开始使用它。我的问题如下: 管理使用 Ajax 获取的数据的最佳方法是什么? 我有一个脚本,可以从数据库中获取数据并根据用户过滤器和订单条件以不同的方式显示数据。到
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在为 AngularJS 寻找一个简单的 CRUD 模板系统,该系统动态创建 UI 以通过 REST 管理实体。有没有已经做到这一点的东西或易于调整的模板? 理想情况下,我所要做的就是指定一个 R
我有以下收集政策演变的数据框: Df <- data.frame(Id_policy = c("A_001", "A_002", "A_003","B_001","B_002"),
我正在学习 .NET 中的 Xml 数据处理。我有以下 XML 格式。 book 1 author 1 10.90
我是一名优秀的程序员,十分优秀!