摘要:目前只能重新启动一个容器停止上面的容器可以比较一下与中命令的变化但此时服务是停止的,并没有在后台运行,访问无效。
只看标题还不是很明显,本文实现docker的这样一种比较常用的功能:通过docker run启动一个容器后,容器中已经运行了一个后台进程(这里以监听80端口的nginx为例),同时进入一个shell终端可供操作,而不受限于只能在前台运行nginx与运行shell终端之间的一种。这个例子实现了,那么其他类似的运行多任务docker就可以以此类推。另外本文还提供了一种在docker容器内部安装软件(vim)的方法,对于定制自己需要的镜像大有帮助。
你可能需要先阅读docker专题(2):docker常用管理命令(上)、docker专题(2):docker常用管理命令(下)来理解更多。
# docker images|grep nginx nginx 1.7.6 561ed4952ef0 10 days ago 100 MB2. 根据官方指示启动这个容器
先做好自己要显示的页面 # echo "This is nginx official container running
static files:/tmp/doccker/index.html" > /tmp/docker/index.html
使用官方image启动一个容器,名字nginx_dist,把host的目录(包含刚才的html)映射到容器中nginx server的root,绑定80端口:
# docker run --name nginx_dist -v /tmp/docker:/usr/share/nginx/html:ro > -p 80:80 -d nginx:1.7.6 1b10b08d7905517a26c72ce8b17b719aaea5e5eac0889263db8b017427e3c8f7 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1b10b08d7905 nginx:1 nginx -g "daemon off 51 seconds ago Up 48 seconds 443/tcp, 0.0.0.0:80->80/tcp nginx_dist
此时通过浏览器访问主机http://host_ip:port/就可以看到结果了:
熟悉一下docker的命令。
查看容器中运行着哪些进程 # docker top nginx_dist UID PID PPID C STIME TTY TIME CMD root 24378 18471 0 15:25 ? 00:00:00 nginx: master process nginx -g daemon off; 101 24433 24378 0 15:25 ? 00:00:00 nginx: worker process 查看容器IP和主机等信息 # docker inspect nginx_dist |grep 172.17 "Gateway": "172.17.42.1", "IPAddress": "172.17.42.6", 连接到容器上,--sig-proxy可以保证 Ctrl+D、Ctrl+C 不会退出 # docker attach --sig-proxy=false nginx_dist xxx.xx.xx.xx - - [03/Nov/2014:07:39:52 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36" "-" Ctrl+C4. 容器改造—在容器内部安装vim
这里有个未解决的问题,能否有办法在上面已经启动的container的基础上执行命令?官方没有这样的支持。
目前只能重新启动一个容器(停止上面的nginx_dist容器)
可以比较一下与2中命令的变化 # docker run --name nginx_bash_vim -v /tmp/docker:/usr/share/nginx/html:ro > -p 80:80 -i -t nginx:1.7.6 > /bin/bash root@3911d1104c3f:/#
但此时nginx服务是停止的,并没有在后台运行,访问http://host_ip:port/无效。为了后面编辑配置文件方便,我们先把vim安装好。
容器内部的网络与容器外部是相同的,并与host具有相同的DNS,所以可以使用公网软件(cat /etc/apt/sources.list)镜像源来安装。
如果需要代理:export http_proxy=http://proxy_server:port # apt-get clean # apt-get update # apt-get install vim Reading package lists... Done ... After this operation, 25.2 MB of additional disk space will be used. Do you want to continue [Y/n]? y ... Setting up vim (2:7.3.547-7) ... ...5. 让nginx在后台运行,前台提供shell终端
实现这一步的方法有许多种,比如
5.1 手动运行/usr/sbin/nginx -c /etc/nginx/nginx.conf也就是用第4步的方法先启动到/bin/bash,再手动运行/usr/sbin/nginx -c /etc/nginx/nginx.conf或service nginx start,很容易想到,但太麻烦。
5.2 通过Dockerfile来build将装好vim的容器提交成新的image,然后通过Dockerfile来自定义要启动哪些服务。关于Dockerfile后面我也会写文章来多带带介绍其语法。
在主机下运行 # docker commit -m "nginx 14.10 with bash,vim" nginx_bash_vim seanlook/nginx:bash_vim a06ab41a6565f0dbd5d35d44cb441d1a166beaae3bc49bffcb09d334a1e77a5c 使用Dockerfile来建立一个新的镜像,加入启动到容器是运行的命令 # vi Dockerfile FROM seanlook/nginx:bash_vim ENTRYPOINT /usr/sbin/nginx -c /etc/nginx/nginx.conf && /bin/bash build新image,tag为bash_vim_Df # docker build -t seanlook/nginx:bash_vim_Df . Sending build context to Docker daemon 73.45 MB Sending build context to Docker daemon Step 0 : FROM seanlook/nginx:bash_vim ---> aa8516fa0bb7 Step 1 : EXPOSE 80 ---> Using cache ---> fece07e2b515 Step 2 : ENTRYPOINT /usr/sbin/nginx -c /etc/nginx/nginx.conf && /bin/bash ---> Running in e08963fd5afb ---> d9bbd13f5066 Removing intermediate container e08963fd5afb Successfully built d9bbd13f5066 --> 新image id # docker images |grep "bash_vim" seanlook/nginx bash_vim_Df d9bbd13f5066 About an hour ago 125.9 MB seanlook/nginx bash_vim aa8516fa0bb7 About an hour ago 125.9 MB 运行由Dockerfile创建的image # docker run --name nginx_bash_vim_Df -v /tmp/docker:/usr/share/nginx/html:ro > -i -t -p 8080:80 > d9bbd13f5066 --> 或seanlook/nginx:bash_vim_Df
最后一条docker run之后就会自动进入bash终端,同时发现nginx服务也启动了,可以通过vim来编辑配置文件。
5.3 修改容器的/etc/bash.bashrc这是投机取巧但不失为最简单的一种办法,见Run a service automatically in a docker container。
启动刚安装完vim的那个容器(不必用run) # docker start nginx_bash_vim 连接到终端上 # docker attach nginx_bash_vim root@3911d1104c3f:/# vi /etc/bash.bashrc # added by mis_zx for auto-service nginx --> 在最后加入 /usr/sbin/nginx -c /etc/nginx/nginx.conf
保存后直接Ctrl+D退出,在start就可以访问了,如果要进入终端就attach,如果需要可以commit成一个镜像。
5.4 听说有一种通过supervisor来管理docker容器的多个任务,有时间会研究一下在Docker里使用(支持镜像继承的)supervisor管理进程
从上面的操作中可以看出,start是可以保留run启动时的参数如-v、-p,而commit之后如果没在Dockerfile中指定,下次启动依然需要带上目录、端口的映射参数。
另外提一点, docker run -i -t seanlook/nginx:bash_vim启动便会同时进入一个shell界面(但没有启动nginx),因为它的“前身”容器是在shell交互界面下run来的,但也没有保留-v、-p指定的映射关系。
原文链接地址:http://seanlook.com/2014/11/03/docker-run-container-with-shell-daemon_process/
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/26349.html
摘要:本文承接专题常用管理命令上。按照指示的顺序进行即可。将同一的所有,合并为一个新的新建一个,保留旧的那条记录查看容器的信息命令可以查看容器的端口开启及绑定容器启动后执行的。其他命令还有一些如等不是很常用的命令,比较简单,请参考官网。 本文承接docker专题(2):docker常用管理命令(上)。 1. 开启/停止/重启container(start/stop/restart) 容器...
摘要:每次在命令行中输入一串命令,敲入回车,终端进程都会一个子进程,用来执行输入的命令,终端进程通过系统调用监听子进程退出,同时通过暴露的输出子进程执行信息。父进程通过创建该的实现向子进程从设备的输入输出。 背景 terminal(命令行)作为本地IDE普遍拥有的功能,对项目的git操作以及文件操作有着非常强大的支持。对于WebIDE,在没有web伪终端的情况下,仅仅提供封装的命令行接口是完...
摘要:尝试目标下一步是连接前端和序列化服务,实现在前端图表中读取传感器发送的数据。序列化服务对应的更新后前端程序位于面临的挑战是启动数据库前端程序序列化服务。系统启动费后,可以使用脚本下用检查运行状态。 整体架构 showImg(https://segmentfault.com/img/remote/1460000016938721?w=389&h=426); 这章节我们将为系统建立一个简单...
摘要:此命令下载测试镜像并在容器中运行它。国内很多云服务商都提供了加速器服务,例如阿里云加速器注册用户并且申请加速器,会获得如这样的地址。获取镜像阿里云镜像库上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜像并运行。 showImg(https://segmentfault.com/img/remote/1460000012924583); 这篇文章是我学习 Docker 的记录...
摘要:与命令不同,使用命令只能创建容器而并不启动选项镜像名称命令参数将标准输入标准输出标准错误链接到容器向容器的添加主机名与地址设置资源分配。输入命令退出后,容器不会停止,而会继续运行。命令命令用于以格式显示容器与镜像的详细 docker命令详解 前言 从技术老大那里听说了docker,闲下来之后就简单了解了一下,发现真的是一个好用的不得了的工具。遂周末去图书馆找了下相关资料,学习下姿势。说...
阅读 2640·2021-11-23 09:51
阅读 1628·2021-11-22 13:54
阅读 2762·2021-11-18 10:02
阅读 920·2021-08-16 10:57
阅读 3527·2021-08-03 14:03
阅读 1859·2019-08-30 15:54
阅读 3511·2019-08-23 14:39
阅读 571·2019-08-23 14:26