常用命令
容器生命周期管理
- run
- start/stop/restart
- kill 向容器发送信号
- rm 常见 combo 是:stop x;rm x ;build x;run x
- pause/unpause
- create
- exec 在运行的容器中执行命令
容器操作
- ps 显示容器
- inspect 获取容器/镜像的元数据。返回 json 格式的数据
- top 查看容器中的进程信息
- attach :连接到正在运行中的容器。
- events docker 相关的事件
- logs 应该是打印到 stdout 上的日志吧!!!
- wait
- export
- port 显示容器的端口映射
容器 rootfs 命令
- commit 类似 git commit 一样修改之后保存新版本 docker commit -m “commit test” uuu fuiboom/myubuntu:v1 给运行的容器创建一个新的保存镜像(一般常用 Dockerfile 和 build 来构建镜像)
- cp 容器与主机的数据拷贝
- diff 显示容器文件结构的改变(显示自己改了什么东西)
镜像仓库
本地镜像管理
docker tag mysql_client_test fuiboom/mysql_client_test 把官方的改造重新命名一下就可以 push
docker push fuiboom/mysql_client_test
info|version
docker run 详细
1 | docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
OPTIONS 说明:
- -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
- -d: 后台运行容器,并返回容器 ID;
- -i: 以交互模式运行容器,通常与 -t 同时使用;
- -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- –name=”nginx-lb”: 为容器指定一个名称;
- –dns 8.8.8.8: 指定容器使用的 DNS 服务器,默认和宿主一致;
- –dns-search example.com: 指定容器 DNS 搜索域名,默认和宿主一致;
- -h “mars”: 指定容器的 hostname;
- -e username=”ritchie”: 设置环境变量;
- –env-file=[]: 从指定文件读入环境变量;
- –cpuset=”0-2” or –cpuset=”0,1,2”: 绑定容器到指定 CPU 运行;
- -m :设置容器使用内存最大值;
- –net=”bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
- –link=[]: 添加链接到另一个容器;
- –expose=[]: 开放一个端口或一组端口;
- -P 大 P 使用 expose 的端口映射到主机的随机端口(感觉不好,还是自己指定比较好)
示例
使用 docker 镜像 nginx:latest 以后台模式启动一个容器,并将容器命名为 mynginx。
1 | docker run --name mynginx -d nginx:latest |
使用镜像 nginx:latest 以后台模式启动一个容器,并将容器的 80 端口映射到主机随机端口。
1 | docker run -P -d nginx:latest |
使用镜像 nginx:latest 以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录/data 映射到容器的/data。
1 | docker run -p 80:80 -v /data:/data -d nginx:latest |
使用镜像 nginx:latest 以交互模式启动一个容器,在容器内执行/bin/bash 命令。
1 | runoob@runoob:~$ docker run -it nginx:latest /bin/bash |
docker exec 语法
1 | docker exec [OPTIONS] CONTAINER COMMAND [ARG...] |
OPTIONS 说明:
- -d :分离模式: 在后台运行
- -i :即使没有附加也保持 STDIN 打开
- -t :分配一个伪终端
示例
在容器 mynginx 中以交互模式执行容器内/root/runoob.sh 脚本 (用容器中的程序执行某段脚本)
1 | runoob@runoob:~$ docker exec -it mynginx /bin/sh /root/runoob.sh |
在容器 mynginx 中开启一个交互模式的终端(启动容器的一个可交互 bash 窗口)
1 | runoob@runoob:~$ docker exec -i -t mynginx /bin/bash |
启动、停止所有容器
1 | docker start/stop $(docker ps -a -q) |
常见问题
如何设置容器的 cpu,内存,磁盘,网络大小限制
1 | --cpu 4 |
如何设置容器镜像
1 | curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://a2a3a2e1.m.daocloud.io |
1 | sudo cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service |
1 | sudo sed -i "s|ExecStart=/usr/bin/dockerd|ExecStart=/usr/bin/dockerd –registry-mirror=https://pee6w651.mirror.aliyuncs.com|g" /etc/systemd/system/docker.service |
常用镜像
redis
1 | //-d 后台运行 |
mysql
1 | //创建mysql容器 -e 设置环境变量 |
nginx
1 | //静态页面 |
kafka
1 | docker pull wurstmeister/zookeeper |
编写 dockerfile 文件
1 | #dockerfile文件 |
在 Dockerfile
文件所在目录执行:
1 | docker build -t nginx:v3 . |
1 | docker build [选项] <上下文路径/URL/-> |
如果在 Dockerfile
中这么写:
1 | COPY ./package.json /app/ |
这并不是要复制执行 docker build
命令所在的目录下的 package.json
,也不是复制 Dockerfile
所在目录下的 package.json
,而是复制 上下文(context) 目录下的 package.json
。
一般来说,应该会将 Dockerfile
置于一个空目录下,或者项目根目录下。
COPY 命令
源路径必须使用相对当前目录的路径
从上下文路径复制文件到 镜像中某个目录
COPY <源路径>... <目标路径>
<目标路径>
可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR
指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录。
CMD 命令
1 | CMD [ "sh", "-c", "echo $HOME" ] |
ENV 命名
1 | ENV NODE_VERSION 7.2.0 |
下列指令可以支持环境变量展开(可以用这个环境变量): ADD
、COPY
、ENV
、EXPOSE
、LABEL
、USER
、WORKDIR
、VOLUME
、STOPSIGNAL
、ONBUILD
。
EXPOSE
要将 EXPOSE
和在运行时使用 -p <宿主端口>:<容器端口>
区分开来。-p
,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE
仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
WORKDIR
下面 ENTRYPOINT 命令会在这个目录下面执行命令
1 | WORKDIR <工作目录路径> #以后可以在某层有一个 相对路径 |
ENTRYPOINT 入口
1 | ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off"] |
命令汇总
1 | docker ps -a //所有 |
1 | docker inspect xx |
1 | docker images |
1 | alias cp='cp -i' |