如何创建一个docker service 服务

如何创建一个docker service 服务,第1张

1 运行一个Docker实例
Docker首先会尝试从本地取得并运行所需的镜像,如果在本地主机上没有发现,它就会从Docker公共注册中心拉取。这里,我们将会拉取镜像并在 Docker 容器中创建一个Fedora实例,并连接到它的 tty 上的bash shell。
# docker run -i -t fedora bash
2安装Apache网络服务器
现在,在我们的Fedora基本镜像实例准备好后,我们将会开始交互式地安装Apache网络服务器,而不是为它创建Dockerfile。为了做到这点,我们需要在终端或者shell运行以下命令。
# yum update
# yum install >1、使用的镜像
sudo docker pull networkboot/dhcpd
2、测试的局域网拓扑结构如下:h为 DHCP服务器,ovs交换机s1、s2、s3各连着一台等待分配ip地址的主机。
3、h DHCP服务器通过一对暴露于root namespace 的veth pair相连,具体 *** 作如下
31、生成交换机s1、s2、s3
sudo ovs-vsctl add-br s1sudo ovs-vsctl add-br s2sudo ovs-vsctl add-br s3
32、创建veth pair 即 v1-v2
sudo ip link add v1 type veth peer name v2
33、up
sudo ip link set dev v1 upsudo ip link set dev v2 up
34、给v1配置ip及子网掩码
sudo ifconfig v1 1921681254 netmask 2552552550
35、生成DHCP服务器,监听v1 ,挂载本地data文件夹,data里面中只有dhcpdconf文件
sudo docker run -it \--rm --net host \--init \--name=dhcpServer1 \-v ~/emxbook/docker-dhcpd/data:/data \networkboot/dhcpd v1
dhcpdconf
subnet 19216810 netmask 2552552550 {option routers 19216811;option subnet-mask 2552552550;option domain-name "emxlocal";option domain-name-servers 8888;range 19216812 1921681100;}
35、将v2连接到交换机上
sudo ovs-vsctl add-port s1 v2
36、交换机s1、s2、s3彼此相连
sudo ovs-vsctl add-port s1 s1p1sudo ovs-vsctl set Interface s1p1 type=patchsudo ovs-vsctl set Interface s1p1 options:peer=s2p1sudo ovs-vsctl add-port s2 s2p1sudo ovs-vsctl set Interface s2p1 type=patchsudo ovs-vsctl set Interface s2p1 options:peer=s1p1sudo ovs-vsctl add-port s1 s1p2sudo ovs-vsctl set Interface s1p2 type=patchsudo ovs-vsctl set Interface s1p2 options:peer=s3p1sudo ovs-vsctl add-port s3 s3p1sudo ovs-vsctl set Interface s3p1 type=patchsudo ovs-vsctl set Interface s3p1 options:peer=s1p2
37、创建主机h1、h2、h3,并将其连接到交换机上,其中ubunut:5是添加了基本net-tools、isc-dhcp-client,创建的时候记得使用 --cap-add=NET_ADMIN
sudo docker run -itd --network=none --name=h1 --cap-add=NET_ADMIN ubuntu:5sudo docker run -itd --network=none --name=h2 --cap-add=NET_ADMIN ubuntu:5sudo docker run -itd --network=none --name=h3 --cap-add=NET_ADMIN ubuntu:5sudo ovs-docker add-port s1 eth1 h1sudo ovs-docker add-port s2 eth1 h2sudo ovs-docker add-port s3 eth1 h3
38、可以使用floot-light控制交换机s1、s2、s3交换机(选择)
sudo ovs-vsctl set-controller s1 tcp:127001:6653sudo ovs-vsctl set-controller s2 tcp:127001:6653sudo ovs-vsctl set-controller s3 tcp:127001:6653
4、使用dhclient eht1 向DHCP服务器申请
41、申请ip之前
42、申请ip(服务器端界面)
43申请ip之后,h1(192168138):

同理,h2(192168139):

h3(192168140):

5、测试
51、h1 ping h2(192168139):

52、h2 ping h3(192168140):

6、最后拓扑结构图,ip分配之后的拓扑结构:DHCP服务器(19216816)、h1(192168138)、h2(192168139)、h3(192168140)

7、代码汇总参考
sudo ovs-vsctl add-br s1sudo ovs-vsctl add-br s2sudo ovs-vsctl add-br s3sudo ip link add v1 type veth peer name v2sudo ip link set dev v1 upsudo ip link set dev v2 upsudo ifconfig v1 19216816 netmask 2552552550sudo docker run -it \--rm --net host \--init \--name=dhcpServer \-v ~/emxbook/docker-dhcpd/data:/data \networkboot/dhcpd v1sudo ovs-vsctl add-port s1 v2sudo ovs-vsctl add-port s1 s1p1sudo ovs-vsctl set Interface s1p1 type=patchsudo ovs-vsctl set Interface s1p1 options:peer=s2p1sudo ovs-vsctl add-port s2 s2p1sudo ovs-vsctl set Interface s2p1 type=patchsudo ovs-vsctl set Interface s2p1 options:peer=s1p1sudo ovs-vsctl add-port s1 s1p2sudo ovs-vsctl set Interface s1p2 type=patchsudo ovs-vsctl set Interface s1p2 options:peer=s3p1sudo ovs-vsctl add-port s3 s3p1sudo ovs-vsctl set Interface s3p1 type=patchsudo ovs-vsctl set Interface s3p1 options:peer=s1p2sudo docker run -itd --network=none --name=h1 --cap-add=NET_ADMIN ubuntu:5sudo docker run -itd --network=none --name=h2 --cap-add=NET_ADMIN ubuntu:5sudo docker run -itd --network=none --name=h3 --cap-add=NET_ADMIN ubuntu:5sudo ovs-docker add-port s1 eth1 h1sudo ovs-docker add-port s2 eth1 h2sudo ovs-docker add-port s3 eth1 h3sudo ovs-vsctl set-controller s1 tcp:127001:6653sudo ovs-vsctl set-controller s2 tcp:127001:6653sudo ovs-vsctl set-controller s3 tcp:127001:6653

就是在Docker容器中再次运行一个Docker服务

在一个容器中 *** 作Docker在CI工具中是很常见的, 如构建一个Docker镜像

但由于在容器中运行一个Docker服务会有各种问题, 如镜像文件存储, 嵌套的容器也并不容易维护, 后来便衍生出了另一种更实用的方案: 挂载主机上Docker服务的sock

这样将不会遇到嵌套副作用,并且将在多个调用之间共享构建缓存。

ps: 更多知识请阅读 docker 官方提及的这篇文章: do-not-use-docker-in-docker-for-ci

我接下来要写的也是如何使用它, 并记录我的使用场景

我有一个需求是这样的:

当某个镜像更新之后, 通知docker重新pull并部署 简单的来说就是当容器更新, 就自动运行

以实现更新部署

由于自己编写的程序也运行在Docker中, 而不是宿主机, 所有没办法直接执行以上命令, 这就需要Docker In Docker了

简单来说 你只需要这样:

然后 docker ps 就能看到 宿主机上 的所有容器

如我的就是

当然 这里的stackyaml文件需要在构建这个容器时添加进来 或者 挂载进来, 这肯定难不倒你

如果你要将这段CMD在你的程序中运行也十分简单:

写好程序之后你可以使用这个Dockfile构建你的镜像

而运行这个镜像的stackyaml文件需要配置挂载

你会看到我又挂载了docker文件夹, 这个无关紧要, 在后面的疑难杂症会说到这个问题

此参数是179版本之后新加的, 用于解决deploy不pull最新的镜像的问题 详情看这个ISSUE:
force docker deploy to pull new images

私有仓库必须登录才有访问权限, 所以需要在宿主机上先login, 登录成功后会发现在 ~/docker有新生成的 配置文件
, 其中存储了认证所需要的信息 但在Docker容器中拿不到这个信息所以就会报错

解决办法是将配置文件挂载进容器

问题描述:

网络结构如下:

客户端 -> 服务器上的Nginx容器 (反代)-> 应用程序

在Nginx中配置了

在应用程序中得到">

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10636618.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存