我也要破解版的猫咪大战争破解版,可不可以也发给我呀!谢谢哦10791 38776我Q Q

中国领先的IT技术网站
51CTO旗下网站
如何运行多进程Docker容器?
通常,Docker容器适合运行单个进程,但是很多时候我们需要在Docker容器中运行多个进程。这时有两种不同方法来运行多进程容器:使用shell脚本或者supervisor,两种方法都很简单,各有优劣,只是有一些值得注意的细节。
作者:刘凯来源:| 10:29
一般来说,Docker容器比较适合运行单个进程。例如,项目&使用多个Docker容器运行Kubernetes&,Kubernetes的各个组件分别运行在各个容器之中,每个容器只运行单个进程。
然而,很多时候我们需要在Docker容器中运行多个进程。例如,项目&使用单个Docker容器运行Kubernetes&,kubernetes的各个组件均运行在同一个容器中,该容器中运行了多个进程。那么,如何运行多进程Docker容器?
一种方法是使用Shell脚本,另一种方法是使用进程管理工具Supervisor。kiwenlau/kubernetes-shell和kiwenlau/kubernetes-supervisor分别采用了这两种方法,用于启动多个进程来运行Kubernetes的各个组件,从而实现&使用单个Docker容器运行Kubernetes&。下面我将分别介绍两种不同方法。
使用Shell脚本运行多进程Docker容器
这个方法大家应该会比较熟悉,使用Shell脚本依次启动Kubernetes的各个组件即可。以下为start-kubernetes.sh
!/bin/bashstart&docker&daemondocker&daemon&&&/var/log/docker.log&2&&1&&&start&etcdetcd&--data-dir=/var/etcd/data&&&/var/log/etcd.log&2&&1&&&wait&for&ectd&to&setupsleep&5&&start&apiserverkube-apiserver&--service-cluster-ip-range=10.0.0.1/24&--insecure-bind-address=0.0.0.0&--etcd_servers=http:&wait&for&apiserver&to&setupsleep&5&start&controller&manager,&sheduler,&kubelet&and&proxykube-controller-manager&--master=http:&kube-scheduler&--master=http:&kubelet&--api_servers=http:&kube-proxy&--master=http:&just&keep&this&script&runningwhile&[[&true&]];&do&sleep&1&done&
然后在Dockerfile中,将start-kubernetes.sh指定为Docker容器默认执行的命令即可:
CMD&[&start-kubernetes.sh&]&
需要注意的一点在于,start-kubernetes.sh脚本将作为Docker容器的1号进程运行,必须始终保持运行。因为Docker容器仅在1号进程运行时保持运行,换言之,Docker容器将在1号进程退出后Exited。由于Kubernetes的各个组件都以后台进程方式执行,我在脚本末尾添加了死循环,以保持start-kubernetes.sh脚本始终处于运行状态。
just&keep&this&script&runningwhile&[[&true&]];&do&&sleep&1&&done&
使用supervisor运行多进程Docker容器
Supervisor是进程管理工具。这时,需要编写supervisor的配置文件kubernetes.conf:
[supervisord]&&nodaemon=true&&[program:etcd]&command=etcd&--data-dir=/var/etcd/data&autorestart=true&&stdout_logfile=/var/log/etcd.stdout.log&stderr_logfile=/var/log/etcd.stderr.log&[program:kube-apiserver]&command=kube-apiserver&--service-cluster-ip-range=10.0.0.1/24&--insecure-bind-address=0.0.0.0&--etcd_servers=http:&autorestart=true&stdout_logfile=/var/log/kube-apiserver.stdout.log&stderr_logfile=/var/log/kube-apiserver.stderr.log&[program:kube-controller-manager]&command=kube-controller-manager&--master=http:&autorestart=true&stdout_logfile=/var/log/controller-manager.stdout.log&stderr_logfile=/var/log/controller-manager.stderr.log&[program:kube-scheduler]&command=kube-scheduler&--master=http:&autorestart=true&stdout_logfile=/var/log/kube-scheduler.stdout.log&stderr_logfile=/var/log/kube-scheduler.stderr.log&[program:kubelet]&command=kubelet&--api_servers=http:&autorestart=true&stdout_logfile=/var/log/kubelet.stdout.log&stderr_logfile=/var/log/kubelet.stderr.log&[program:kube-proxy]&command=kube-proxy&--master=http:&autorestart=true&stdout_logfile=/var/log/kube-proxy.stdout.log&stderr_logfile=/var/log/kube-proxy.stderr.log&[program:docker]&command=docker&daemon&autorestart=true&stdout_logfile=/var/log/docker.stdout.log&stderr_logfile=/var/log/docker.stderr.log&
可知,将Kubernetes的各个组件的启动命令设为command即可。autorestart参数设为true,意味着supervisor将负责重启意外退出的组件。stdout_logfile和stderr_logfile参数则可以用于设置命令的标准输出文件和标准错误输出文件。
然后在Dockerfile中,将supervisord指定为Docker容器默认执行的命令即可:
CMD&[&supervisord&,&&-c&,&&/etc/supervisor/conf.d/kubernetes.conf&]&
supervisord是Docker容器中的1号进程,也需要始终保持运行状态。nodaemon设为true时,表示supervisor保持前台运行而非在后台运行。若supervisor在后台运行,则Docker容器也会在执行supervisord命令后立即Exited.
[supervisord]&nodaemon=true&
使用Shell脚本运行多进程Docker容器,优势是大家比较熟悉。由于需要保持Docker容器的1号进程始终运行,这一点比较容易出错。若要实现进程意外退出后自动重启的话,使用shell脚本比较麻烦。
使用supervisor运行多进程Docker容器,非常方便。另外,保持1号进程保持运行,以及进程意外退出后自动重启,实现起来都很简单。
使用多个Docker容器运行Kubernetes
GitHub地址
kiwenlau/single-kubernetes-docker&
下图显示了我在Ubuntu主机上运行单机版Kubernetes的架构。可知,我一共运行了7个容器,分别运行Kubernetes的各个组件。
使用单个Docker容器运行Kubernetes
GitHub地址:
kiwenlau/kubernetes-shell&kiwenlau/kubernetes-supervisor&
该项目中,我将kubernetes的所有组件:etcd, controller manager, apiserver, scheduler,
kubelet, proxy以及docker daemon均运行在同一个Docker容器之中。
容器启动时,各个组件由shell脚本或者supervisor启动。
1. Using Supervisor with Docker
2. How To Install and Manage Supervisor on Ubuntu and Debian VPS
3. 基于Docker搭建单机版Kuberntes
4. kiwenlau/single-kubernetes-docker
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
聚焦热点访谈原创原创
24H热文一周话题本月最赞
讲师:155人学习过
讲师:879人学习过
讲师:1211人学习过
精选博文论坛热帖下载排行
本书结合JSP和Servlet的最新规范,从基本的语法和规范入手,以经验为后盾,以实用为目标,以实例为导向,以实践为指导,深入浅出地讲解了JS...
订阅51CTO邮刊用户名:peitianwang
文章数:11
访问量:473
注册日期:
阅读量:1297
阅读量:3317
阅读量:438322
阅读量:1125206
51CTO推荐博文
起因:因为更改ldap域名,老的ldap服务器还是不断有请求发过来,经过排查发现是虚拟机的nslcd发过来的请求,但是nslcd服务配置中配置的是域名而不是ldap的ip地址,试了一下,重启服务才能去连接新的ldap服务,但是由于虚拟机众多,一个一个执行时灰常傻X的,所以打算用docker exec来循环执行,但是执行遇到了问题,如下[root@VM-1-10-11 ~]# for i in tianpei.wang_172.16.162.105; do docker exec -i $i /etc/init.d/ doneStopping nslcd: [FAILED]Starting nslcd: nslcd: daemon may already be active, cannot acquire lock (/var/run/nslcd/nslcd.pid): Permission denied[FAILED]权限不够解决方法:用bash来执行标准输入,问题解决[root@VM-1-10-11 ~]# for i in tianpei.wang_172.16.162.105; do echo '/etc/init.d/nslcd restart'|docker exec -i $ doneStopping nslcd: [ &OK &]Starting nslcd: [ &OK &]
了这篇文章
类别:未分类┆阅读(0)┆评论(0)Docker Daemon连接方式详解 - 简书
Docker Daemon连接方式详解
在一文中粗粗提了一下, docker是分为客户端和服务端两部分的, 本文将介绍客户端是如何连接服务端的。
默认就是这种方式, 会生成一个 /var/run/docker.sock 文件, UNIX域套接字用于本地进程之间的通讯, 这种方式相比于网络套接字效率更高, 但局限性就是只能被本地的客户端访问。
2. tcp端口监听
服务端开启端口监听 dockerd -H IP:PORT , 客户端通过指定IP和端口访问服务端 docker -H IP:PORT
通过这种方式, 任何人只要知道了你暴露的ip和端口就能随意访问你的docker服务了, 这是一件很危险的事, 因为docker的权限很高, 不法分子可以从这突破取得服务端宿主机的最高权限。
3. 可以同时监听多个socket
ubuntu@VM-84-201-ubuntu:/usr/anyesu/docker$ sudo dockerd -H unix:///var/run/docker.sock -H tcp://127.0.0.1:2376 -H tcp://127.0.0.1:2377
INFO[0004] API listen on 127.0.0.1:2377
INFO[0004] API listen on /var/run/docker.sock
INFO[0004] API listen on 127.0.0.1:2376
启用TLS安全连接
上面介绍了普通的http方式远程连接很不安全, 解决的办法很简单, 启用TLS证书实现客户端和服务端的双向认证, 以此来保证安全性。
创建TLS证书(根证书、服务端证书、客户端证书)
cd /usr/anyesu/docker
# 内容比较多, 就写成一个shell脚本, 将需要绑定的服务端ip或域名做参数传入即可
vi tlscert.sh
脚本内容如下:
#/bin/bash
# @author: anyesu
if [ $# != 1 ] ; then
echo "USAGE: $0 [HOST_IP]"
#============================================#
下面为证书密钥及相关信息配置,注意修改
#============================================#
PASSWORD="8#QBD2$!EmED&QxK"
COUNTRY=CN
PROVINCE=yourprovince
CITY=yourcity
ORGANIZATION=yourorganization
GROUP=yourgroup
NAME=yourname
SUBJ="/C=$COUNTRY/ST=$PROVINCE/L=$CITY/O=$ORGANIZATION/OU=$GROUP/CN=$HOST"
echo "your host is: $1"
# 1.生成根证书RSA私钥,PASSWORD作为私钥文件的密码
openssl genrsa -passout pass:$PASSWORD -aes256 -out ca-key.pem 4096
# 2.用根证书RSA私钥生成自签名的根证书
openssl req -passin pass:$PASSWORD -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem -subj $SUBJ
#============================================#
用根证书签发server端证书
#============================================#
# 3.生成服务端私钥
openssl genrsa -out server-key.pem 4096
# 4.生成服务端证书请求文件
openssl req -new -sha256 -key server-key.pem -out server.csr -subj "/CN=$HOST"
# 5.使tls连接能通过ip地址方式,绑定IP
echo subjectAltName = IP:127.0.0.1,IP:$HOST & f
# 6.使用根证书签发服务端证书
openssl x509 -passin pass:$PASSWORD -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -f
#============================================#
用根证书签发client端证书
#============================================#
# 7.生成客户端私钥
openssl genrsa -out key.pem 4096
# 8.生成客户端证书请求文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
# 9.客户端证书配置文件
echo extendedKeyUsage = clientAuth & f
# 10.使用根证书签发客户端证书
openssl x509 -passin pass:$PASSWORD -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -f
#============================================#
#============================================#
# 删除中间文件
rm -f client.csr server.csr ca.f
# 转移目录
mkdir client server
cp {ca,cert,key}.pem client
cp {ca,server-cert,server-key}.pem server
rm {cert,key,server-cert,server-key}.pem
# 设置私钥权限为只读
chmod -f 0400 ca-key.pem server/server-key.pem client/key.pem
执行服务端配置
# 给脚本添加运行权限
chmod +x tlscert.sh
HOST_IP=127.0.0.1
./tlscert.sh $HOST_IP
# 客户端需要的证书保存在client目录下, 服务端需要的证书保存在server目录下
sudo cp server/* /etc/docker
# 修改配置
sudo vi /etc/default/docker
# 改为 DOCKER_OPTS="--selinux-enabled --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H=unix:///var/run/docker.sock -H=0.0.0.0:2375"
# 重启docker
sudo service docker restart
接着按之前的方式连接服务端就出错了
ubuntu@VM-84-201-ubuntu:/usr/anyesu/docker$ docker -H tcp://127.0.0.1:2375 version
Get http://127.0.0.1:/version: malformed HTTP response "\x15\x03\x01\x00\x02\x02".
* Are you trying to connect to a TLS-enabled daemon without TLS?
正确的访问方式:
# 客户端加tls参数访问
docker --tlsverify --tlscacert=client/ca.pem --tlscert=client/cert.pem --tlskey=client/key.pem -H tcp://127.0.0.1:2375 version
# Docker API方式访问
curl https://127.0.0.1:2375/images/json --cert client/cert.pem --key client/key.pem --cacert client/ca.pem
# 简化客户端调用参数配置
sudo cp client/* ~/.docker
# 追加环境变量
echo -e "export DOCKER_HOST=tcp://$HOST_IP:2375 DOCKER_TLS_VERIFY=1" && ~/.bashrc
sudo docker version
切记, 要保护好客户端证书, 这是连接服务端的凭证。另外根证书私钥也要保存好, 泄漏之后就能签发客户端证书了。
1. 服务端认证模式
tlsverify, tlscacert, tlscert, tlskey
向客户端发送服务端证书, 校验客户端证书是否由指定的CA(自签名根证书)签发
tls, tlscert, tlskey
向客户端发送服务端证书, 不校验客户端证书是否由指定的CA(自签名根证书)签发
2. 客户端认证模式
校验服务端证书是否由 公共的CA机构签发
tlsverify, tlscacert
校验服务端证书是否由指定的CA(自签名根证书)签发
tls, tlscert, tlskey
使用客户端证书进行身份验证,
但不校验服务端证书是否由指定的CA(自签名根证书)签发
tlsverify, tlscacert, tlscert, tlskey
使用客户端证书进行身份验证且校验服务端证书是否由指定的CA(自签名根证书)签发
关于远程构建命令
在之前的中介绍了使用docker-compose构建容器, 学了今天的内容之后可以连接远程Docker Daemon进行构建, 不过需要注意的一点是, 构建需要的配置文件、依赖文件等都需要在客户端准备好, 然后会把这些内容传输到服务端执行构建或运行容器。
另外, win10下的也可以安装docker(不过可能是因为早期版本子系统的缘故, docker服务端跑不起来, 只能运行docker客户端, 前段时间的中可能有所改进, 不过还未尝试), 通过docker客户端连接远程docker服务"假装"体验下docker也是不错的。
转载请注明出处:用户名:aaron428
文章数:108
访问量:74122
注册日期:
阅读量:1297
阅读量:3317
阅读量:438322
阅读量:1125206
51CTO推荐博文
1、Error response from daemon: Cannot start container 7cb4a74f9ef7bcc6fa659e3473aac10bd430c18aac43b4fe159284: iptables failed: iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT --to-destination 192.168.42.8:5000 ! -i docker0: iptables: No chain/target/match by that name.解决方案:重启docker2、Docker无法启动 Could not find a free IP address range for interface 'docker0' 最方便的解决办法 15:44 1294人阅读 评论(0) 收藏 举报转载自:/infodetail-969451.html阿里云的CentOS 6.6上安装Docker会无法启动,如果直接运行docker -d会看到错误提示:WARN[0000] You are running linux kernel version 2.6.32-573.3.1.el6.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.10.0.&INFO[0000] [graphdriver] using prior storage driver "devicemapper"&INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)&WARN[0000] Running modprobe bridge nf_nat failed with message: , error: exit status 1&FATA[0000] Error starting daemon: Error initializing network controller: Error creating default "bridge" network: can't find an address range for interface "docker0"&关于docker进程没起来的原因可能会有很多,比如模块没加载,系统内核版本过低,硬盘空间不足等等一开始我以为是系统内核版本过低导致,百度又google了半天,还安装了3.10的内核库,都没用最后看到有人说,虽然报警建议升级内核到3.10,但意义就是docker宣称在3.10下是stable,低于3.10不是就不能运行了,只是unstable而已,docker的依赖内核需要高于2.6.32就可以其实本处的重要信息是报错最后一句,原因就是docker自动尝试的建立bridge的ip段正好被阿里云的路由表完全占据了详细原因可以参见这个帖子://docker-on-aliyun/网上有好多类似的解决方法,不过好麻烦,这里主要说下最方便的解决方法先su到root找一下docker的配置文件: find / -name "docker"一般会在 /etc/sysconfig/docker编辑这个文件 vi /etc/sysconfig/docker修改other_args=这一行为:other_args=-bip=192.168.100.1/24保存退出可以重启docker了service docker restart3、docker不能启动容器,报一下错误Error running DeviceCreate (createSnapDevice) dm_task_run failed1) service docker stop2) thin_check /home/docker/devicemapper/devicemapper/metadata3) thin_check --clear-needs-check-flag /home/docker/devicemapper/devicemapper/metadata4) service docker startEdit: Cclear-needs-check-flag should be --clear-needs-check-flag . Minor but important.4、重启docker服务器后 遇到 'device or resource busy'错误如果有container在运行的时候重启 docker 服务, 可能会导致 container无法启动, 错误信息类似于[plain] view plain copy print?在CODE上查看代码片派生到我的代码片Error response from daemon: Cannot start container zookeeper: Error getting container ddf1dd91bbf46dcf7c6fffaf2f19cda5cf1d97fdc2c from driver devicemapper: Error mounting '/dev/mapper/docker-8:1-525372-ddf1dd91bbf46dcf7c6fffaf2f19cda5cf1d97fdc2c' on '/var/lib/docker/devicemapper/mnt/ddf1dd91bbf46dcf7c6fffaf2f19cda5cf1d97fdc2c': device or resource busy & 04:42:07 Error: failed to start one or more containers &或者[plain] view plain copy print?在CODE上查看代码片派生到我的代码片db: Error pulling image (latest) from xxxxxx, Driver devicemapper failed to create image rootfs edb4db65ad2dea633dfe3cd: device edb4db65ad2dea633dfe3cd already exists 43fe342dea633dfe3cd already exists c049b2b: Download complete &edb: Error downloading dependent layers &这是一个Docker的 bug&解决方式是先找出没有umount的路径cat /proc/mounts | grep "mapper/docker" | awk '{print $2}'然后依次unmount5、挂载宿主机目录后,在容器内对其进行操作,报“Permission denied”。可通过两种方式解决:1& 关闭selinux。临时关闭:# setenforce 0永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。2& 以特权方式启动容器指定--privileged参数如:# docker run -it --privileged -v /test:/soft centos /bin/bash本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 猫咪大战争破解版 的文章

 

随机推荐