前言
在使用docker命令时,由于参数顺序被坑了一把,故这篇笔记主要记录一下深入学习docker run 命令
有问题的命令
- 目的:启动指镜像映射到宿主机8999端口,并添加主机名到hosts中。
docker run --name web-tomcat --add-host=test:192.168.1.123 -itd web-tomcat:6 -p8999:8999 /bin/bash
疑问&解答
- 各个参数的含义?
- docker run 会基于指定的镜像,新建出一个容器启动
- add-host指定添加到容器/etc/hosts文件中的内容。
- p作为端口映射,映射容器和宿主机端口。
- name指定容器的名称
- 为什么命令是有问题的?
- 宿主机上使用lsof -i:8999,发现并没有进程在监听端口。
- 使用如下命令进入容器内部,查看运行情况。
docker exec -it web-tomcat
ps -ef|grep tomcat
- 可以看到 -p8999:8999被当成了tomcat的启动参数了,发现问题后,当然最简单的解决办法就是更换参数的先后顺序,解决问题就算了吗?本着折腾的精神,当然要研究一番了。
理解
- 首先想到的就是官方手册啦,毕竟是一手资料。
docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-
可以看到在IMAGE后指定的参数会被当成命令在容器中运行,所以-p应该是属于OPTIONS放在IMAGE前面才对。那除了上面说的,还有那些参数是比较常用的呢?
-
link参数用于容器互联,如将kafka连接到zk容器,启动zookeeper时使用-h参数指定容器主机名为zookeeper,或者使用docker rename对已有容器进行重命名,进入容器内部发现docker会在hosts文件内生成对应内容。
docker run -itd --name kafka -h kafka -p9092:9092 --link zookeeper hyq/kafka:0.8.2.2 /bin/bash
- e参数设置环境变量
docker run --name mysql -e MYSQL_USER_NAME=hyq -d mysql
#如果是一个单一的值,则会在当前宿主机中取值然后传播到docker容器中
export test=123
docker run --name mysql -e test -d mysql
- m参数限制容器内存。
docker run -it -m 500M ubuntu:14 /bin/bash
其他
- 参数p和P,小p和大P的区别?
- 小p指定一个或一组容器端口映射到宿主机上,-p宿主机端口:容器端口。大P是将DockerFile中EXPOSE指定的端口随机的映射给宿主机。
- 可以使用docker port [容器] 查看端口映射情况