docker中怎样设置开机启动--随容器的启动而启动服务?

原文: docker中怎样设置开机启动--随容器的启动而启动服务?

  docker能够说给咱们的部署带来极大的方便和可逢凶化吉性!(懂的同窗天然懂)html

  在初步了解以后,咱们就能简单使用docker了。java

  刚开始玩docker时,能够基于系统级别的镜像作定制,好比基于  centos 镜像使用docker;nginx

docker pull centos:7 # 把镜像拉下来 docker run -it centos:7        # 建立一个容器便可运行

  你能够在拉下来的容器里安装任何须要的应用(必要的);而后,一切都看起来很美好!web

  可是,这时,咱们最担忧一个问题,那就是docker挂了怎么办?机器重启后怎么办?docker

  是的,这个担忧是有道理的,若是你没有去查细细看过官方文档,那么多半你是吃过这亏,才会清楚其中的坑!apache

因此,咱们来提几个问题? 简单而不简约!vim

1. 如何备份当前容器的修改?备份是可靠性的一个保证!

  1. 使用commit 命令保存到本地centos

docker commit -m "msg" abcommitid myimage:1.0

  其好处是操做方便,本机永久保存,方便下次快速操做。坏处,也不算,就是你若是想放到远程,你必须注册一个docker hub 帐号,而后保存过去。并且这样的镜像,通常只适合本身使用,不适合团队传播!(不过也不是绝对的)api

  2. 使用docker save 保存压缩包到本地bash

docker save -o myimage_save.tar abcontainerid

  这样备份好以后,就能够将改该容器处处分发到其余机器或者作备份了。这样作都好处是,传播方便,不会致使隐私泄露。坏处是都是本地包,没有存储在云端,必须处处携带该包。

  导入时使用 docker load 便可!

docker load -i myimage_save.tar

  而后就能够看到镜像了,使用docker run 运行。操做步骤稍微繁琐了点。注意: 只有 docker run 才能自定义各类参数哦。(docker run 聚合了 create 和 start 的功能)

  在部署应用时可能存在须要将新应用部署好后,再删除原容器的操做,因此容器重命名就颇有必要的, 使用 docker rename

docker rename 原容器名  新容器名

  3. 使用 docker export 保存到本地, 操做如同 docker save, 可是功能受限,我的不是很喜欢使用

docker export -o mycontainer_save.tar tmp_container

2. 如何设置应用开机启动?只要启动容器就够了!

  应用场景能够说是刚需: 我把第一个镜像安装好后,但愿下次建立容器以后就能自动运行,而不是还要操做N多繁杂步骤,从而下降移植性带来的方便性!

  1. 能想得最简单的是,使用系统的开机启动功能

    好比在 /etc/rc.d/rc.local 中添加相应的启动,可是这里有个前提,那就是你必须先把容器启起来; (启不启得来另说)

  2. 使用docker的开机自动运行功能,使用简单;

    这里说的简单是指使用,而在操做的时候则看我的了。在docker建立时,使用启动脚本,自动运行。主要的命令有: CMD, RUN, ADD . 建立一个start.sh,能够定复杂的启动逻辑;可是这在后期中,就很难更改其逻辑了哦!

CMD ["sh", "-c", "service httpd start;bash"]        # 开机启动 apache 服务

3. 如何自定义端口映射?容器须要与外部通讯!

  Docker 自带了端口映射功能,使用docker run -p 进行操做!

docker run -d -p 81:80 --name container_name myimage:1.0

  多个端口映射使用多个-p便可;

4. 如何自定义hostname?订制你的机器名而不是随机数!

  自定义host也颇有用,好比我想看我当前气息环境,hostname就颇有用,还有hostname的固定能够不致让本身迷失; 只须要使用-h参数就能够了。

docker run -d -h myapi1 myimage:1.0

5. 如何插入host的解析?容器内订制本身的 hosts !

  这种应用场景是,好比你其余应用的服务,为了防止ip常常变动致使的麻烦性,这种服务通常是之内网域名形式出现,因此须要加入域名解析。

  方法一是,你给每一个容器定义一个通用的域名解析器dns; 

  方法二是,为各自的hosts里加入解析。而这在docker中,则操做是不会被保存的,每一个新容器总是新 hosts. 能够经过 --add-host 添加自定义hosts解析:

docker run --add-host a.com:1.2.3.4 myimage:1.0

  这种方式仅用于学习,其中更有用的是加入一个dns; 其操做步骤就是安装个bind 软件,而后配制 named.conf 便可。使用时,vim /etc/resolv.conf

nameserver 100.1.1.1

6. 如何自定义本身都的变量以知足容器内动态修改的需求?特殊场景定制化!

  其实如上的配置基本能知足大部分状况下的生产需求了。可是不免仍是个性的,好比我想定义nginx访问某个的另外端口,这时使用dns 就很差搞了。在不改变外部环境的状况下,咱们只能自定义修改了。最直接的方式是在 nginx 中直接改掉便可。可是这样作还有个,若是我想让同一个容器灵活地指向任意端口怎么办?那就只能自定义变量操做了,在建立容器的时候指定该端口便可。

  这样的自定义变量能够用于设置 nginx 的自定义端口, java 堆大小,日志目录设置等等.

  具体作法步骤以下:

# 1. docker run -it myimage:1.0, 修改 nginx 配置文件,使其能够方便被替换,以下 # vim /usr/local/nginx/conf/conf.d/www.conf server { listen 80; server_name localhost; access_log /var/log/nginx/host.access.log main; location / { root /www/webapp/html/app1; try_files $uri $uri/ /index.html; index index.html index.htm; } location /api { # 设置点位符使外部可替换 set $API_HOST 192.168.1.1; set $API_PORT 8083; proxy_pass http://$API_HOST:$API_PORT;
 index index.html index.htm; } } # 2. 本身尝试启动无误后,将新变动提交到原镜像, docker commit docker commit -m 'conf update' abcommitid myimage:1.0 # 3. vim Dockerfile, 设置启动脚本 FROM myimage:1.0 MAINTAINER xxx <abc@abc.com> ENV NGINX_CONFD_PATH /usr/local/nginx/conf/conf.d ENV PATH /usr/local/nginx/sbin:$PATH ADD ./start.sh /usr/local/bin/start.sh RUN chmod +x /usr/local/bin/start.sh EXPOSE 80 # 设置启动脚本,脚原本源本机,可随时修改 CMD [ "/usr/local/bin/start.sh" ] # 4. 缩写启动脚本,使在启动时执行动态配置变动 awk # vim start.sh #!/bin/bash # override port variable if set if [ ! -z "$API_PORT" ]; then
        echo "------- api port replacing to $API_PORT -----------"; awk -v PORT="set \$API_PORT $API_PORT;" '{ sub(/set.*\$API_PORT.*/, PORT); print; }' ${NGINX_CONFD_PATH}/default.conf \ > ${NGINX_CONFD_PATH}/default.conf.new && mv ${NGINX_CONFD_PATH}/default.conf.new ${NGINX_CONFD_PATH}/default.conf fi
    if [ ! -z "$API_HOST" ]; then
        echo "------- api host replacing to $API_HOST -----------"; awk -v HOST="set \$API_HOST $API_HOST;" '{ sub(/set.*\$API_HOST.*/, HOST); print; }' ${NGINX_CONFD_PATH}/default.conf \ > ${NGINX_CONFD_PATH}/default.conf.new && mv ${NGINX_CONFD_PATH}/default.conf.new ${NGINX_CONFD_PATH}/default.conf fi # start nginx /bin/sh -c 'nginx -g "daemon off;" ' # 5. 都操做好后,从新构建一个新的镜像,使用就能够了 docker build -t myimage:1.1 . # 6. 使用时,用 --env 来指定自定义变量 docker run --env API_HOST=192.168.1.112 --env API_PORT=8090 -it myimage:1.1 # 此时,进入查看时,nginx已经运行在不一样的api端口下了

  注意: 本处使用的是比较原始的 docker 版本,若是使用到 docker-compose 等高级工具,可能就不须要这么麻烦了!

7. 如何将宿主机目录与容器内目录进行交换?可视化你的容器内容!

  这样的场景是比较多的: 

    好比为了统一管理安装包,不让全部安装包散乱在各个容器的各个目录;
    好比为了让容器的数据存储使用一块新买的磁盘;
    好比我想复制同一份代码到新容器使用,从而方便后续独立修改;
    好比你没法进入你的容器,却想拿到其中的数据等等;

  因此,咱们须要使用到目录映射功能,这是 docker 自带的功能,方便实用: -v 参数设置便可:

docker run -d -v /opt/docker/webapps:/www/webapp myimage:1.0

  

  通过上面这些问答,相信你已经能简单应付经常使用运维场景了,尽情享受docker带来的可移植性方便以及其隔离性吧。

相关文章
相关标签/搜索