Docker部署的几个tips

公司的电商平台使用的是阿里云VPC网络,整个交换机和云服务器都是部署在D区。今天在部署测试环境的时候,发现无法购买服务器,在钉钉上与阿里云售后交涉后,接到噩耗—D区已经不再出售服务器了,如图:
akb48

没办法,只能把现有的服务器调高配置,在里面安装docker,尽可能的让各进程的环境彼此之间不受干扰。由于事发仓促,整个架构都要重新调整,镜像就先选用centos:latest,生成容器后在里面装环境以及git pull代码,把容器当做虚拟机来用了。

几个小提示

  1. 如果要pecl install swoole的话,要先yum install -y glibc-headers gcc-c++ kernel-headers gcc openssl pcre-develyum install -y openssl-devel

  2. centos:latest镜像目前是7.5版本,如果要查看的话需要先安装lsb命令:yum install redhat-lsb -y

  3. 如果容器里使用yum下载爆’Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds’,用yum -y install wget解决;

  4. 容器需要php7.2的环境的话,就要用最新的源:

    1
    2
    yum install epel-release -y
    rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
  5. 别忘了开机自启动docker进程:systemctl enable docker

  6. yum install node npm之前要

    1
    2
    3
    yum install -y epel-release
    curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -
    yum install -y nodejs #这样版本是8.12,npm的版本是6.4.1
  7. 在容器里查看端口情况就要安装netstat命令:yum install -y net-tools

  8. 将一个运行中的容器做成镜像的命令:docker commit 容器ID号 镜像名称

  9. 进入容器最好不要用docker attach 容器ID的方式,而是用docker exec -it 容器ID /bin/bash,离开容器的时候也不要用exit或者ctrl + D,这样会将容器停止,而是用ctrl + Pctrl + Q 或者ctrl + Q + P组合键退出,这样就不会终止容器运行;

  10. 容器默认的时间与宿主机的时间相差8个小时,可以在docker run的时候使用-v挂载的方法挂载宿主机的时间文件,比如:docker run --name 容器名 -v /etc/localtime:/etc/localtime:ro ...,或者在dockerfile里添加“设定时区”的语句:

    1
    2
    3
    #设置时区
    RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' >/etc/timezone \
  11. 容器映射默认情况下是tcp6的,这是正常的现象,如果telnet不通,请先去检查容器内的服务是否正常,比如在容器里curl 127.0.0.1 端口号

  12. 使用docker top 容器id命令能获取的PID是容器内进程在宿主机上的pid,ppid是容器内进程在宿主机上的父进程pid;

  13. 如果多个容器要挂载一样的数据就是用-volumes-from,比如docker run --volume-from 容器ID号

  14. 在容器外启动容器内部进程的方法是:docker exec 容器ID /bin/bash -c "对应的命令",在zabbix监控docker发现进程死了后,就可以用这个方法拉起来;
    akb48

  15. 接上一条的说,docker跟虚拟机不同,它启动的时候是不会运行/etc/rc.d/rc.local的,如果想要Docker在启动后就自动运行/etc/rc.d/rc.local,请看https://github.com/johnnian/Blog/issues/13 里面说的方法;

  16. 容器内的进程是会映射到宿主机上的,举个例子,比如容器里运行了swoole,如图:
    akb48

在宿主机上看也是能看到这个进程的:
akb48

参考资料

http://blog.sina.com.cn/s/blog_5ff8e0a00102wmti.html
https://outmanzzq.github.io/2018/01/11/docker-exit-without-stop/
http://dockone.io/article/128
https://blog.csdn.net/halcyonbaby/article/details/46884605
https://stackoverflow.com/questions/30960686/difference-between-docker-attach-and-docker-exec
https://www.binss.me/blog/learn-docker-with-me-about-volume/

-------------This article is over!Thanks for reading!-------------
感谢您请我喝咖啡!(o´ω`o)
0%