Docker容器命令经验谈

容器开机自启动方法一

  • 服务启动:
chkconfig docker on

检查: chkconfig docker 如果返回true,则显示添加服务到自启动成功

  • 容器启动脚本:
    在/etc/rc.local 里面添加:
docker start xxxx >/dev/null 2>&1 &

然后给/etc/rc.d/rc.local赋予可执行的权限

chmod 777 /etc/rc.d/rc.local

容器开机自启动方法二

  • 在创建容器时,添加–restart选项
docker run -d --restart=always ba-208
docker run -d --restart=on-failure:10 ba-208
  • Docker容器的重启策略如下:
参数名说明
no默认策略,在容器退出时不重启容器
on-failure在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3在容器非正常退出时重启容器,最多重启3次
always在容器退出时总是重启容器
unless-stopped在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
  • Docker容器的退出状态码
状态码说明
0正常退出
125Docker守护进程本身错误
126容器启动后,要执行的默认命令无法调用
127容器启动后,要执行的默认命令不存在
其他命令状态码容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码
  • 查看容器重启次数
docker inspect -f "{{ .RestartCount }}" ba-208
  • 查看容器最后一次的启动时间
docker inspect -f "{{ .State.StartedAt }}" ba-208

为Docker容器指定自定义网段的固定IP或静态IP地址

  • 第一步:创建自定义网络,并指定IP范围。
# test-network为自定义网桥的名字,可自己任意取名。
docker network create --subnet=172.172.0.0/16 test-network
# 也可以不指定IP范围,精简后:
docker network create test-network
  • 第二步:在你自定义的网段选取任意IP地址作为你要启动的container的静态IP地址
docker run -d --net test-network --ip 172.172.0.10 ubuntu:16.04

使用–link实现容器间通讯

  • 如果两个容器在启动时,都添加了–net test-network参数,则在容器内ping另一个的容器名称,是可以通的。即在同一个自定义网络中的容器,是可以相互通讯的。
  • 如果要让两个不在同一个自定义网络的容器相互通讯,可以在容器启动时添加–link选项
# 创建第一个容器
docker run -d --name test1 ubuntu:16.04
# 创建第二个容器,链接到test1。在容器内,使用test作为容器1(test1)的别名。
docker run -d --name test2 --link test1:test ubuntu:16.04

在–link标签下,接收容器就是通过设置环境变量和更新/etc/hosts文件来获取源容器的信息,并与之建立通信和传递数据的。

将容器内的文件拷贝到容器外/将容器外的文件拷贝到容器内

# 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
docker cp /www/runoob 96f7f14e99ab:/www/
# 将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。
docker cp  96f7f14e99ab:/www /tmp/

通过Iptables动态映射容器端口

原理:本机的容器相当于一台虚拟机,有自己的IP和端口。所以,在本机使用内部防火墙,将本机端口和容器端口重定向即可。

# 添加重定向规则命令:
iptables -t nat -A  DOCKER -p tcp --dport 1932 -j DNAT --to-destination 172.17.0.1:1932
service iptables save
service iptables restart
# 删除重定向规则命令:
iptables -t nat -nvL #查看重定向列表
iptables -nL --line-number #列表查看端口规则
iptables -D INPUT 2 #使用上面的规则和定位,删除
# 防火墙开放端口
iptables -I INPUT -p tcp --dport 1932 -j ACCEPT
service iptables save
service iptables restart

通过Firewalld动态映射容器端口

# 添加重定向规则命令:
firewall-cmd --zone=public --add-forward-port=port=1932:proto=tcp:toaddr=172.16.0.1:toport=1932
firewall-cmd --reload
# 删除重定向规则命令:
firewall-cmd --zone=public --list-ports # 查看public分类的所有打开的端口
firewall-cmd --list-all-zones # 查看所有打开的端口
firewall-cmd --permanent --zone=public --remove-forward-port=port=1932:proto=tcp:toaddr=172.16.0.1:toport=1932
firewall-cmd --reload
# 防火墙开放端口
firewall-cmd --zone=public --add-port=1932/tcp --permanent
firewall-cmd --reload

Dockerfile中CMD和ENTRYPOINT的用法

ENTRYPOINT 的两种格式:

  • ENTRYPOINT [“executable”, “param1”, “param2”] (exec格式,推荐使用此格式)
  • ENTRYPOINT command param1 param2 (shell 格式)

CMD指令有三种格式:

  • CMD [“executable”,“param1”,“param2”] (exec 格式,推荐用此格式)
  • CMD [“param1”,“param2”] (作为ENTRYPOINT 的默认参数)
  • CMD command param1 param2 (shell 格式)

ENTRYPOINT 的目的和 CMD 一样,都是指定容器的启动程序及参数。
当指定了 ENTRYPOINT (exec格式)后,CMD 的含义就发生了改变,不再是直接运行的命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为: “”
CMD作为 ENTRYPOINT 的参数时需要是exec格式,如果是shell格式将转化成/bin/sh -c 式的exec格式,作为参数传给 ENTRYPOINT 时可能会出错;

当指定了ENTRYPOINT 为shell格式, CMD将无效, 即dockerfile里的CMD和 启动容器时传的命令行参数都将无效,此时ENTRYPOINT 将以 /bin/sh –c 的形式启动,即作为sh的子命令来执行,这种形式下ENTRYPOINT的执行程序不能通过Unix 信号控制,因进程号不是容器的PID 1 (sh的进程PID为1),也就不能以docker stop 的形式来优雅地停止(接收SIGTERM信号)ENTRYPOINT的执行程序 ,因为这时docker stop 会在超时时间后通过发送SIGKILL信号给sh 强制停止容器,这会导致stop时间加长,为避免这种缺点,在shell命令前加exec,以这种方式运行即可, 如: ENTRYPOINT exec 。
和shell格式不同,当ENTRYPOINT是exec格式时不会调用shell,通常的shell变量将不会被解析执行,ENTRYPOINT [ “echo”, " H O M E " ] 中 的 HOME" ] 中的 HOME"]HOME不会被替换,如果需要变量替换,则可以用shell格式的ENTRYPOINT。
参考:https://blog.51cto.com/8869176/2082584?source=drt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值