命令 | 解释 |
---|---|
docker ps | 查看正在运行的容器 |
docker ps -a | 查看所有已经创建的容器 |
docker images | 列出镜像列表 |
docker container ls | 效果同ps命令(加-a效果同) |
-a :显示所有的容器,包括未运行的。-f :根据条件过滤显示的内容。--format :指定返回值的模板文件。-l :显示最近创建的容器。-n :列出最近创建的n个容器。--no-trunc :不截断输出。-q :静默模式,只显示容器编号。-s :显示总的文件大小。
-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);--digests :显示镜像的摘要信息;-f :显示满足条件的镜像;--format :指定返回值的模板文件;--no-trunc :显示完整的镜像信息;-q :只显示镜像ID。
命令 | 解释 |
---|---|
docker rm | 删除容器 |
docker rmi | 删除镜像 |
-f :强制删除一个运行中的容器-l :移除容器间的网络连接,而非容器本身-v :-v 删除与容器关联的卷
-f :强制删除;--no-prune :不移除该镜像的过程镜像,默认移除;
命令 | 解释 |
---|---|
docker cp | 容器与主机之间的数据拷贝 |
docker cp nginx:/www /tmp/ #将nginx容器的/www 拷贝到本地/tmp下
命令 | 解释 |
---|---|
docker start | 启动容器 |
docker stop | 停止容器 |
docker restart | 重启容器 |
docker exec | 在运行的容器中执行命令 |
docker run | 创建一个新的容器并运行一个命令 |
-d :分离模式: 在后台运行-i :即使没有附加也保持STDIN 打开-t :分配一个伪终端 #实例 docker exec -it nginx /bin/bash
-i, --interactive=false 打开STDIN,用于控制台交互-t, --tty=false 分配tty设备,该可以支持终端登录,默认为false-d, --detach=false 指定容器运行于前台还是后台,默认为false-u, --user="" 指定容器的用户-a, --attach=[] 登录容器(必须是以docker run -d启动的容器)-w, --workdir="" 指定容器的工作目录-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用-e, --env=[] 指定环境变量,容器中可以使用该环境变量-m, --memory="" 指定容器的内存上限-P, --publish-all=false 指定容器暴露的端口-p, --publish=[] 指定容器暴露的端口-h, --hostname="" 指定容器的主机名-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录 顺序:主机:容器--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法--cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU--device=[] 添加主机设备给容器,相当于设备直通--dns=[] 指定容器的dns服务器--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件--entrypoint="" 覆盖image的入口点--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口--link=[] 指定容器间的关联,使用其他容器的IP、env等信息--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字--net="bridge" 容器网络设置: bridge 使用docker daemon指定的网桥 host //容器使用主机的网络 container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源 none 容器使用自己的网络(类似--net=bridge),但是不进行配置--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities--restart="no" 指定容器停止后的重启策略: no:容器退出时不重启 on-failure:容器故障退出(返回值非零)时重启 always:容器退出时总是重启--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
命令 | 解释 |
---|---|
docker pull | 拉取镜像 |
docker search | 从Docker Hub查找镜像 |
命令 | 解释 |
---|---|
docker info | 查看docker系统信息 |
docker version | 显示 Docker 版本信息 |
# 查看docker版本 docker version # 显示docker系统的信息 docker info # 日志信息 docker logs # 故障检查 service docker status # 启动关闭docker sudo service docker start|stop
docker logs -f <容器名orID>
也称之为 引擎日志
根据系统不同各不相同
* CoreOS - journalctl -u docker.service * Ubuntu(16.04) - journalctl -u docker.service * Ubuntu(14.04) - /var/log/upstart/docker.log * Boot2Docker - /var/log/docker.log * Debian GNU/Linux 8 - journalctl -u docker.service * Debian GNU/Linux 7 - /var/log/daemon.log * CentOS 7/RHEL 7 - journalctl -u docker.service * CentOS - /var/log/daemon.log | grep docker * Fedora - journalctl -u docker.service * OpenSuSE - journalctl -u docker.service * Red Hat Enterprise Linux Server - /var/log/messages | grep docker * OSX - ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/log/docker.log
# 最后行数的日志 journalctl -n # 详细信息 journalctl -f # 本次启动后的所有日志 journalctl -b # 查看启动记录 journalctl --list-boots # 查看某次运行过程中的日志 sudo journalctl -b [启动顺序号,或者启动hash] # 查看记录中指定单元 docker.service 的日志 journalctl -u docker.service
显示可以匹配日志级别
journalctl -F PRIORITY
编码 | 优先级 | 严重性 |
---|---|---|
0 | emerg | 系统不可用 |
1 | alert | 必须立即采取措施 |
2 | crit | 严重状况 |
3 | err | 非严重错误状况 |
4 | warning | 警告状况 |
5 | notice | 正常但重要的事件 |
6 | info | 信息性事件 |
7 | debug | 调试级别消息 |
比如显示 docker 内核日志中 info 类的数据
# 只显示错误、冲突和重要告警信息 journalctl -u docker.service -p err..alert # -p 等效于 PRIORITY 也可以用数字来表示 journalctl -u docker.service PRIORITY=6 # 还可以加入 MESSAGE、MESSAGE_ID、_PID、_UID、_HOSTNAME、_SYSTEMD_UNIT 等条件 # 查询字段 `man 7 systemd.journal-fields` # 例如查询 info 信息,PID 为 2331 journalctl -u docker.service PRIORITY=6 _PID=2331
systemd-journald 服务收集到的日志默认保存在 /run/log 目录中,重启系统会丢掉以前的日志信息
保存日志到默认配置目录
创建目录 /var/log/journal
,当这个目录存在,则日志会持久化,记得创建后,重启 systemd-journald.service
服务
sudo mkdir /var/log/journal sudo chown root:systemd-journal /var/log/journal sudo chmod 2775 /var/log/journal sudo systemctl restart systemd-journald.service
或者修改配置
修改 /etc/systemd/journald.conf
,把取消注释 Storage=auto
, 并改为 Storage=persistent
重启 systemd-journald.service
服务
查看日志占用的磁盘空间
sudo journalctl --disk-usage
容量定义文件在 /etc/systemd/journald.conf
日志调整文件 /etc/logrotate.conf
日志系统同样会进行轮转,每月触发。默认情况下,日志大小不能超过所处文件系统的10%,也不可使所处文件系统空间低于15%
无论是否设置把日志存储到文件,都会得到 disk-usage 的占用空间!
清理日志数据
#使用 –vacuum-size 选项指定日志的总体体积 sudo journalctl --vacuum-size=1G 使用 –vacuum-time 选项指定日志的总时间占用 sudo journalctl --vacuum-time=1years
更多详细见 http://www.cnblogs.com/sparkdev/p/8795141.html
# grep 所有容器的config.json docker logs [conID] # 确认问题后 # 该config.json 中有该容器1号进程的pid kill -9 pid
docker容器可以理解为在沙盒中运行的进程
这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。
# 查看当前运行的容器 docker ps # 查看全部容器 docker ps -a # 查看全部容器的id和信息 docker ps -a -q # 查看全部容器占用的空间 docker ps -as # 查看一个正在运行容器进程,支持 ps 命令参数 docker top # 查看容器的示例id sudo docker inspect -f '{{.Id}}' [id] # 检查镜像或者容器的参数,默认返回 JSON 格式 docker inspect # 返回 ubuntu:14.04 镜像的 docker 版本 docker inspect --format '{{.DockerVersion}}' ubuntu:14.04 docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ubuntu:14.04
# 保存对容器的修改 docker commit # 保存某个容器成为一个镜像 docker commit -a "user" -m "commit info" [CONTAINER] [imageName]:[imageTag] # 推送一个容器到中心仓库 docker login --username=[userName] --password=[pwd] [registryURL] ## 建议登录后查看 docker info docker tag [imageID] [remoteURL]:[imageTag] docker push [remoteURL]:[imageTag] # 拉取提交的容器 docker pull [remoteURL]:[imageTag] # 对比容器的改动 docker diff # 附加到一个运行的容器上 docker attach
# 创建一个容器命名为 test 使用镜像daocloud.io/library/ubuntu docker create -it --name test daocloud.io/library/ubuntu # 创建并启动一个容器 名为 test 使用镜像daocloud.io/library/ubuntu docker run --name test daocloud.io/library/ubuntu # 删除一个容器 docker rm [容器id] # 删除所有容器 docker rm `docker ps -a -q` # 根据Dockerfile 构建 docker build -t [image_name] [Dockerfile_path]
docker run --restart=always
no
– 默认值,如果容器挂掉不自动重启
on-failure
– 当容器以非 0 码退出时重启容器,同时可接受一个可选的最大重启次数参数 (e.g. on-failure:10).
always
– 不管退出码是多少都要重启
no
– 默认值,如果容器挂掉不自动重启
on-failure
– 当容器以非 0 码退出时重启容器,同时可接受一个可选的最大重启次数参数 (e.g. on-failure:10).
always
– 不管退出码是多少都要重启
# 限制内存最大使用 -m 1024m --memory-swap=1024m # 限制容器使用CPU --cpuset-cpus="0,1"
docker commit <CONTAIN-ID> <IMAGE-NAME>
docker start|stop|restart [id] # 暂停|恢复 某一容器的所有进程 docker pause|unpause [id] # 杀死一个或多个指定容器进程 docker kill -s KILL [id] # 停止全部运行的容器 docker stop `docker ps -q` # 杀掉全部运行的容器 docker kill -s KILL `docker ps -q`
sudo docker exec -it {{containerName or containerID}} bash sudo docker exec -i {{containerName or containerID}} bash sudo docker exec -t {{containerName or containerID}} bash sudo docker exec -d {{containerName or containerID}} bash
只用 -i
参数,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令返回值都可以正确获取
只用 -t
参数,则可以看到一个 console 窗口,但是执行命令会发现由于没有获得stdin的输出,无法看到命令执行情况
使用 -it
时,则和我们平常操作 console 界面类似,而且也不会像attach方式因为退出,导致整个容器退出
使用 -d
参数,在后台执行一个进程。如果一个命令需要长时间进程,会很快返回
Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作
docker attach {{containerName or containerID}}
需要注意的是,如果从这个stdin中exit,会导致容器的停止
docker logs <容器名orID> 2>&1 | grep '^User: ' | tail -n1
因为Docker容器启动时的root用户的密码是随机分配的。所以,通过这种方式就可以得到容器的root用户的密码
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH # 本地文件上传到对应容器的目录 docker cp local.sh [CONTAINERid]:[TagPath]
此命令为高版本docker才有,当然1.11+肯定包含
以redmine
镜像为例
docker run --name redmine -p 9003:80 -p 9023:22 -d -v /var/redmine/files:/redmine/files -v /var/redmine/mysql:/var/lib/mysql sameersbn/redmine
docker run -i -t --name sonar -d -link mmysql:db tpires/sonar-server sonar
# 支持远程文件 .tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz docker import # 导出 docker export [id] >~/Downloads/ubuntu_nexus.tar
导出后导入(exported-imported))的容器会丢失所有的提交历史,无法回滚。
docker login docker search # 搜索处收藏数不小于 3 ,并且能够自动化构建的 django 镜像,并且完整显示镜像描述 docker search -s 3 --automated --no-trunc django docker pull # 拉取ubuntu最新的镜像 docker pull ubuntu:latest # 服务器拉取个人动态,可选择时间区间 docker events # 拉取个人从 2015/07/20 到 2015/08/08 的个人动态 docker events --since="20150720" --until="20150808"
# 标记本地镜像,将其归入某一仓库 docker tag # 将 ID 为 5db5f84x1261 的容器标记为 mine/lnmp:0.2 镜像 docker tag 5db5f84x1261 mine/lnmp:0.2 # 将镜像推送至远程仓库,默认为 Docker Hub docker push
# 列出本地所有镜像 docker images # 本地镜像名为 ubuntu 的所有镜像 docker images ubuntu # 查看指定镜像的创建历史 docker history [id] # 本地移除一个或多个指定的镜像 docker rmi # 移除本地全部镜像 docker rmi `docker images -a -q` # 指定镜像保存成 tar 归档文件, docker load 的逆操作 docker save # 将镜像 ubuntu:14.04 保存为 ubuntu14.04.tar 文件 docker save -o ubuntu14.04.tar ubuntu:14.04 # 从 tar 镜像归档中载入镜像, docker save 的逆操作 docker load # 上面命令的意思是将 ubuntu14.04.tar 文件载入镜像中 docker load -i ubuntu14.04.tar docker load < /home/save.tar # 构建自己的镜像 docker build -t <镜像名> <Dockerfile路径> docker build -t xx/gitlab .
保存后再加载(saved-loaded)的镜像不会丢失提交历史和层,可以回滚
# 启动top命令,后台运行 $ ID=$(sudo docker run -d ubuntu /usr/bin/top -b) # 获取正在running的container的输出 $ sudo docker attach $ID top - 02:05:52 up 3:05, 0 users, load average: 0.01, 0.02, 0.05 Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 373572k total, 355560k used, 18012k free, 27872k buffers Swap: 786428k total, 0k used, 786428k free, 221740k cached ^C$ $ sudo docker stop $ID
docker run -d -p 127.0.0.1:33301:22 centos6-ssh
-a, --attach=[] Attach to STDIN, STDOUT or STDERR 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项 --add-host=[] Add a custom host-to-IP mapping (host:ip) --blkio-weight=0 Block IO (relative weight), between 10 and 1000 -c, --cpu-shares=0 CPU shares (relative weight) --cap-add=[] Add Linux capabilities --cap-drop=[] Drop Linux capabilities --cgroup-parent= Optional parent cgroup for the container --cidfile= Write the container ID to the file --cpu-period=0 Limit CPU CFS (Completely Fair Scheduler) period --cpu-quota=0 Limit the CPU CFS quota --cpuset-cpus= CPUs in which to allow execution (0-3, 0,1) 绑定容器到指定CPU运行 --cpuset-mems= MEMs in which to allow execution (0-3, 0,1) 绑定容器到指定MEM运行 -d, --detach=false Run container in background and print container ID 后台运行容器,并返回容器ID --device=[] Add a host device to the container --dns=[] Set custom DNS servers 指定容器使用的DNS服务器,默认和宿主一致 --dns-search=[] Set custom DNS search domains 指定容器DNS搜索域名,默认和宿主一致 -e, --env=[] Set environment variables 设置环境变量 --entrypoint= Overwrite the default ENTRYPOINT of the image --env-file=[] Read in a file of environment variables 从指定文件读入环境变量 --expose=[] Expose a port or a range of ports -h, --hostname= Container host name 指定容器的hostname --help=false Print usage -i, --interactive=false Keep STDIN open even if not attached 以交互模式运行容器,通常与 -t 同时使用 --ipc= IPC namespace to use -l, --label=[] Set meta data on a container --label-file=[] Read in a line delimited file of labels --link=[] Add link to another container --log-driver= Logging driver for container --log-opt=[] Log driver options --lxc-conf=[] Add custom lxc options -m, --memory= Memory limit --mac-address= Container MAC address (e.g. 92:d0:c6:0a:29:33) --memory-swap= Total memory (memory + swap), '-1' to disable swap --name= Assign a name to the container 为容器指定一个名称 --net=bridge Set the Network mode for the container 指定容器的网络连接类型,支持 bridge/host/none/container:<name|id> 四种类型 --oom-kill-disable=false Disable OOM Killer -P, --publish-all=false Publish all exposed ports to random ports -p, --publish=[] Publish a container's port(s) to the host --pid= PID namespace to use --privileged=false Give extended privileges to this container --read-only=false Mount the container's root filesystem as read only --restart=no Restart policy to apply when a container exits --rm=false Automatically remove the container when it exits --security-opt=[] Security Options --sig-proxy=true Proxy received signals to the process -t, --tty=false Allocate a pseudo-TTY 为容器重新分配一个伪输入终端,通常与 -i 同时使用 -u, --user= Username or UID (format: <name|uid>[:<group|gid>]) --ulimit=[] Ulimit options --uts= UTS namespace to use -v, --volume=[] Bind mount a volume --volumes-from=[] Mount volumes from the specified container(s) -w, --workdir= Working directory inside the container
# Add the docker group if it doesn't already exist. $ sudo groupadd docker #改完后需要重新登陆用户 $ sudo gpasswd -a ${USER} docker
Dockerfile的EXPOSE相当于docker run --expose,提供container之间的端口访问
docker run -p允许container外部主机访问container的端口
ubuntu14 的 febootstrap没有 -i 命令
ubuntu14下的docker是没有service服务