docker 命令

docker run

 

# run用于指定镜像创建容器
$ docker run [选项] <镜像名称, id> [命令] [参数]

# 选项
-d, --detach=false 指定容器运行于前台还是后台,默认为false。
-i, --interactive=false 打开标准输入用于控制台交互
-t, --tty=false 分配tty设备用来支持终端登录,默认为false。
-u, --user="" 指定容器的用户
-a, --attach=[] 登录容器,必须是以docker run -d启动的容器。
-w, --workdir="" 设置容器的工作目录
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景下使用。
-e, --env=[] 设置环境变量,容器中可使用该环境变量。
-m, --memory="" 设置容器的内存上限
-p, --public=[] 设置容器暴露的端口
-h, --hostname="" 设置容器的主机名
-v, --volume=[] 设置容器挂载的存储卷,也就是挂载到容器的某个目录。
--volumn-from=[] 给容器挂载其他容器上的卷,也就是挂载到容器的某个目录。
--cap-add=[] 添加权限
--cap-drop=[] 删除权限
--cidfile="" 运行容器后在指定文件中写入容器PID值,这是典型的监控系统的用法。
--cpuset="" 设置容器可以使用那些CPU,此参数用来设置容器独占CPU。
--device=[] 添加主机设备给容器,相当于设备直通。
--dns=[] 设置容器的DNS服务器
--dns-search=[] 设置容器的DNS搜索域名,写入到容器的/etc/resolv.conf文件。
--env-file=[] 设置环境变量文件,文件格式为每行一个环境变量。
--expose=[] 设置容器暴露的端口,即修改镜像的暴露端口。
--link=[] 设置容器之间的关联关系,使用其他容器的IP、env等信息。
--lxc-conf=[] 设置容器的配置文件,只有在指定--exe-driver=lxc时使用。
--name="" 设置容器的名称,可通过名字进行容器管理,links特性需要使用名字。
--net="bridge" 容器网络设置
--privileged=false 设置容器是否为特权容器,特权容器拥有所有的capabilities。
--restart="no" 设置让其停止后的重启策略
--rm=false 设置容器停止后自动删除容器,不支持以docker run -d启动的容器。
--sig-proxy=true 设置由代理接收并处理信号,但SIGCHLD、SIGSTOP、SIGKILL不能被代理。

# 命令
-d, --detach Detach模式,默认为守护进程模式,即容器以后台方式运行。
--rm=false 若容器内的进程终止则自动删除容器,禁止和-d选项一起使用。
--sig-proxy=true 将所有信号传递给进程,非TTY模式也一样,但不能传递SIGCHLD、SIGKILL、SIGSTOP信号。

# 运行一个在后台执行的容器,同时使用控制台管理。
$ docker run -i -t -d ubuntu:latest

# 运行一个带命令且在后台不断执行的容器,不直接展示容器内部信息。
$ docker run -d ubuntu:latest ping www.docker.com

# 运行一个在后台不断执行的容器,同时带有命令,程序被终止后还能重启继续跑,可用控制台管理。
$ docker run -d --restart=always ubuntu:latest ping www.docker.com

# 为容器指定一个名字
$ docker run -d --name=ubuntu_server ubuntu:latest

# 容器暴露80端口并指定宿主机81端口与其通信(宿主机端口:容器端口)
$ docker run -d --name=ubuntu -p 81:80 ubuntu:latest

# 指定容器内目录与宿主机目录共享(宿主机目录:容器目录)
$ docker run -d --name=ubuntu_server -v /home/www:/var/www ubuntu:latest

# 设置宿主机与docker的共享目录
$  docker run -d -i -t  -p 80:80 -v /share/swoft:/var/www/swoft --name swoft swoft/swoft /bin/bash

使用docker run启动容器,docker在后台的标准操作流程:

  1. 检查本地是否存在指定的镜像,若不存在则从公有仓库下载。
  2. 使用镜像创建并启动容器
  3. 分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层。
  4. 从宿主机配置的网桥接口中桥接一个虚拟机接口到容器中去
  5. 从地址池分配一个IP地址给容器
  6. 执行用户指定的应用程序
  7. 执行完毕后容器被终止

 

docker create

 

# create 使用指定的镜像创建容器,与run命令不同的是,使用create命令只能创建容器而并不启动。
$ docker create [选项] <镜像名称,id> <命令> [参数]

# 选项
-a, --attach=[] 将标准输入、标准输出、标准错误链接到容器
-C, --cpu-shares=0 设置CPU资源分配,默认为1024。
-e, --env=[] 向容器设备环境变量,用于传递设置或密码。
-h, --hostname="" 设置容器主机名
-i, --interactive=false 激活标准输入,即使未与容器连接,也维持标准输入。
-m, --memory="" 设置内存限制,格式<数字><单位>,单位可用b、k、m、g。
-P, --publish-all=false 将连接到主机的容器的所有端口暴露在外
-p, --publish=[] 将连接到主机的容器的特定端口暴露在外,主要用于暴露web服务器的端口。
-t, --tty=false 使用TTY模式,若要使用Bash则必须设置该选项。
-u, --user="" 设置容器运行时要使用的Linux用户账户和UID
-v, --volume=[] 设置数据卷,设置要与主机共享的目录,不将文件保存到容器而是直接保存到主机,在主机目录后添加:ro与:rw进行读写设置,默认未:rw。
-w, --workdir="" 设置容器内部要运行进程的目录
-add-host=[] 向容器的/etc/hosts添加主机名与IP地址
--cap-add=[] 设置容器中使用的cgroups的特定capablity,若设置为all则使用所有的capablity。
--cap-drop=[] 从容器中删除cgroup的特定capablity。
--cidfile="" 设置cid文件路径,cid中存储着所创建容器的id。
--cpuset="" 在多核CPU中设置要运行容器的核心数
--device=[] 添加主机设备到容器,格式为<主机设备>:<容器设备>
--dns=[] 设置容器中使用的DNS服务器
--dns-search=[] 设置docker中要使用的DNS搜索域
--entrypoint="" 忽略Dockerfile的ENTRYPOINT设置,强制设置为其他值。
--env-file=[] 向容器应用设置环境变量文件
--expose=[] 仅连接容器的端口和主机,并不暴露在外。
--link=[] 进行容器连接,格式 <容器名称>:<别名>
--lxc-conf=[] 若使用LXC驱动则可设置LXC选项
--name 设置容器名称
--net="bridge" 设置容器的网络模式
--privileged=false 在容器内部使用主机的所有linux内核功能
--restart="" 设置容器内部进程终止时重启策略
--security-opt=[] 设置SELinux、AppArmor选项
--volumn-from=[] 连接数据卷容器,设置格式未<容器名称,id>:<:ro, :rw>,默认读写设置遵从-v选项的设置。

# 使用docker镜像nginx:latest创建一个容器名为ubuntu_serve
$ docker create --name ubuntu_serve ubuntu:latest
$ docker create -it --name ubuntu_server ubutnu:latest /bin/bash

docker start

 

# start用于启动容器
$ docker start <选项><容器名称, id>

# 选项
-a, --attach=false 将标准输入、标准输出、标准错误连接到容器,传递所有信号。
-i, --interactive=false 激活标准输入

docker stop

 

# stop用于终止容器
$ docker stop <选项><容器名称, id>

# 选项
-t, --timeout=10 设置终止容器前的等待时间,单位为秒。

docker restart

 

# restart 用于重启容器
$ docker restart [选项] <容器名称, id>

docker pause

 

# pause 用于暂停容器中所有的进程
$ docker pause [选项] <容器名称, id>

docker unpause

 

# unpause用于重启使用pause命令暂停的容器
$ docker unpause <容器名称, id>

docker kill

 

# kill用于杀掉一个运行中的容器,发送SIGKILL信号来停止的主进程。
$ docker kill [选项] <容器名称, id>

# 选项
-s 向容器发送一个信号

# 杀死运行中的容器nginx
$ docker kill -s KILL nginx

docker rm

 

# rm用于删除一个或多个容器
$ docker rm [选项] <容器名称,id>

# 选项
-f 通过SIGKILL信号强制删除一个运行中的容器
-l 移除容器间的网路连接而非容器本身
-v 删除与容器关联的卷

# 强制删除容器test
$ docker rm -f test

# 删除容器test并删除挂载的数据卷
$ docke rm -v test 

docker exec

 

# exec 用于在运行中的容器中执行命令
$ docker exec [选项] <容器名称, id> <命令> [参数]

# 选项
-d 分离模式即在后台运行
-i 即使没有附加也保持STDIN标准输入打开
-t 分配一个伪终端

# 在容器test中以交互模式执行容器内/root/test.sh脚本
$ docker exec -it test /bin/sh /root/test.sh

容器操作

docker ps

 

# ps用于输出容器列表
$ docker ps <选项>

# 选项
-a, --all=false 列出所有容器,不带-a则输出当前正在运行的容器。
--before="" 列出特定容器创建前的容器,包含停止的容器。
-f, --filter=[] 设置输出过滤
-l, --latest=false 列出最后创建的容器包含停止的容器
-q, --quiet=false 只输出容器的ID

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

docker top

 

# top用户显示容器中正在 运行的进程信息
$ docker top <容器名称, id><ps选项>

$ docker top

docker attach

 

# attach 用于将标准输入与标准输出连接到正在运行的容器
$ docker attach <选项><容器名称, id>

docker logs

 

# logs用于获取容器的日志
$ docker logs [选项] <容器名称,id>

# 选项
-f 跟踪日志输出
--since 显示某个开始时间的所有日志
-t 显示时间戳
--tail 仅仅列出最新n条容器日志

# 跟踪查看test容器的日志
$ docker logs -f test

# 查看test容器从2019年4月1日以后的最新10条日志
$ docker logs --since="2019-04-01" --tail=10 test

如何动态跟踪并查看myswoft容器的日志详情呢?

 

docker@ ~$: docker logs -tf --details myswoft

如何清理日志文件呢?

Docker日志默认存储位于:/var/lib/docker/containers/<container_id>/*.log

 

# 在docker中切换为root用户
docker@default: ~$ su -i

# 查看docker容器的id
root@default: ~$ docker ps -a | grep myswoft
d26ff0ff1bc0        swoft/swoft         "php /var/www/swoft/…"   2 weeks ago         Up 22 minutes       0.0.0.0:80->80/tcp                  myswoft

# 查看容器日志文件大小
root@default: ~$ ls -lh  $(find /var/lib/docker/containers/ -name *-json.log)
-rw-r-----    1 root     root           0 May 14 13:32 /var/lib/docker/containers/d26ff0ff1bc0dc0221ce5be7f78da96123a0ddbb379ab8befd2d1403f44e820b/d26ff0ff1bc0dc0221ce5be7f78da96123a0ddbb379ab8befd2d1403f44e820b-json.log

# 进入日志目录
root@default: ~$ cd /var/lib/docker/containers/d26ff0ff1bc0dc0221ce5be7f78da96123a0ddbb379ab8befd2d1403f44e820b

# 临时清理日志文件
root@default: /var.../$ truncate -s 0 /var/lib/docker/containers/<container_id>/*-json.log

# 临时清理日志文件
root@default: /var../$ cat /dev/null > *-json.log

# 使用rm删除日志文件后是需要重启容器的,如果容器运行状态下Linux进程会引用着不会释放磁盘空间。
root@default /var/.../$ rm -rf *-json.log

docker port

 

# port用于列出指定容器的端口映射,或者用于查找将PRIVATE_PORT NAT到面向公众的端口。
$ docker port [选项] <容器名称,id> [PRIVATE_PORT[/PROTO]]

# 查看test容器的端口映射情况
$ docker port test

镜像仓库

docker search

 

# search用于在docker hub中搜索镜像
$ docker search <选项><搜索关键词>

# 选项
--automated=false 只显示由docker hub的automated build创建的镜像
--no-trunc=false 显示所有因内容过长而省略的部分
-s, --stars=0 显示有特定星级以上的镜像

本地镜像

docker images

 

# images用于输出镜像列表
$ docker images <选项><镜像名称, id>

# 选项
-a, --all=false 列出所有镜像包含父镜像。
-f, --filter=[] 设置输出结果过滤,若设置为dangling=true则仅输出无名镜像。
--no-trunc=false 显示所有因内容过长而省略的部分

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker rmi

 

# rmi 用于删除镜像,若没有指定标签则会删除latest标签。
$ docker rmi <注册名称>/<镜像名称, id>:<标签>

# 选项
-f, --force=false 强制删除镜像
--no-prune=false 不删除不带标签的父级镜像

# 删除所有镜像
$ docker rmi `docker images -aq`

docker tag

 

# tag用于设置镜像标签
$ docker tag <选项><镜像名称>:<标签><注册地址, 用户名>/<镜像名称>:<标签>

# 选项
- f, --force=false 强制设置,即使已拥有标签,如远程仓库设置标签。

docker save

 

# save用于将镜像保存为tag包文件
$ docker save <选项><镜像名称>:<标签>

# 选项
-o, --output="" 设置保存时的文件名称

若不设置-o选项,tar包文件会输出到标准输出,所以必须设置重定向。如果仅指定镜像名称但没有指指定标签,则会将所有标签都保存到一个tar包文件中。

docker load

docker load < alpine.tar.gz

从文件或者标准输入 载入 镜像 

docker import

# 从文件 URL 中导入
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] 
cat exampleimage.tgz | docker import  -  exampleimagelocal:new

将export导出tar包导入

docker export

docker export <container id/name>  > latest.tar
docker export --output=" latest.tar"  <container id/name>

将容器导出为tar文件.

docker commit

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit  alpine apline:v1

commit 提交容器为黑箱操作。建议使用Dockerfile,操作步骤明确可查。 


docker save load export import的区别

export命令用于持久化容器(不是镜像)。所以,我们就需要通过以下方法得到容器ID: 
sudo docker ps -a 
接着执行导出: 
sudo docker export <CONTAINER ID> > /home/export.tar

Save命令用于持久化镜像(不是容器)。所以,我们就需要通过以下方法得到镜像名称: 
sudo docker images 
接着执行保存: 
sudo docker save busybox-1 > /home/save.tar

使用export比使用save保存的文件要小一些

那,它们之间到底存在什么不同呢?

  1. 首先,docker import可以重新指定镜像的名字,docker load不可以
  2. 其次,我们发现导出后的版本会比原来的版本稍微小一些。那是因为导出后,会丢失历史和元数据。执行下面的命令就知道了: 
    显示镜像的所有层(layer) 
    sudo docker images --tree 
    执行命令,显示下面的内容。正你看到的,导出后再导入(exported-imported)的镜像会丢失所有的历史,而保存后再加载(saveed-loaded)的镜像没有丢失历史和层(layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer),同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚(可以执行docker tag 来回滚之前的层)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值