设为首页 收藏本站
查看: 1232|回复: 0

[经验分享] docker operation method note

[复制链接]

尚未签到

发表于 2015-4-17 10:48:13 | 显示全部楼层 |阅读模式
  docker stop script
  #!/bin/bash
  CID_LIST=$(docker ps -q | xargs)
if [ "$CID_LIST" = "" ]; then
        echo "no containers running."
else
        docker stop $CID_LIST
fi
echo "all containers closed."
  --------------------------------------------------------------------------------
  #!/bin/bash
PWD_DIR=$(cd "$(dirname "$0")"; pwd)
echo "current dir path:"$PWD_DIR
export ROOT=$PWD_DIR
cd $ROOT
  ---------------------------------------------------------------------------------
  

运行交互性的shell(就像运行一个单独的linux)

# 使用ubuntu运行一个交互性的shell,
# 分配一个伪终端,附带stdin和stdout(输入/输出流)
# 如果你想退出分离出来的伪终端,
# 可以使用CTRL -p+CTRL -q --就像先按CTRL -p 然后CTRL -q
sudo docker run -i -t ubuntu /bin/bash

管理员命令和docker组
  docker进程经常使用root用户运行,从docker的0.5.2版本开始,docker的进程绑定Unix Socket来代替一个TCP端口,在默认情况下Unix Socket属于root用户,所以在默认情况下,你需要赋予权限sudo
  从0.5.3版本开始,如果你(或者你安装的docker)创建的时候用的docker或者添加用户的unix群组,当docker进程启动的时候,这个docker进程会把Unix socket的读写(read/writable)的所有权交给docker群组.docker进程一般必须root用户运行,但是你运行docker客户端的用户是docker组的,这个时候你就不需要加sudo就可以运行全部的客户端命令

  警告:docker群组必须是和root等价的


Example:

# 如果不存在docker群组,添加一个用户群组
sudo groupadd docker
# Add the connected user "${USER}" to the docker group.
# Change the user name to match your preferred user.
# You may have to logout and log back in again for
# this to take effect.
sudo gpasswd -a ${USER} docker
# Restart the docker daemon.
sudo service docker restart

让Docker使用其它的host/port或者Unix socket

  警告
  改变默认的docker进程绑定的TCP端口或者Unix docker的用户组,将会 通过允许非root用户获得root权限来修改主机,会增加你的安全风险!

  使用 -H 他可以运行你改变docker进程监听指定的IP和端口。默认情况下,他会监听 unix:///var/run/docker.sock只允许本地的root用户连接,你可以设置他 0.0.0.0:4243 或者指定主机IP给任何用户,但是这不是我们所推荐的,因为那么低权限将会获得root正在运行的主机进程的访问权限!
  同样,docker客户端可以使用-H 来指定连接的端口
  -H 授权主机和端口的格式是这样的:tcp://[host][:port] or unix://path
  举个例子


  • tcp://host:4243 -> 使用tcp连接 host:4243
  • unix://path/to/socket -> 使用socket位于 path/to/socket
  -H 当空的时候 将会使用默认值就像没有 -H一样
  -H 也可以用简短的方式授权TCP绑定: host[:port] or :port

# Run docker in daemon mode
sudo /docker -H 0.0.0.0:5555 -d &
# Download an ubuntu image
sudo docker -H :5555 pull ubuntu

  你可以是用多个 -H 例如你想监听你所有的TCP和Unix socket

# Run docker in daemon mode
sudo /docker -H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock -d &
# Download an ubuntu image, use default Unix socket
sudo docker pull ubuntu
# OR use the TCP port
sudo docker -H tcp://127.0.0.1:4243 pull ubuntu

开启一个长时间运行的工作进程

# 开启一个非常有用的长时间工作进程
JOB=$(sudo docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done")
# 到目前为止的收集的输出
sudo docker logs $JOB
# 杀死这个进程
sudo docker kill $JOB

DSC0000.png

监听所有运行着的容器

sudo docker ps

DSC0001.png

为服务绑定一个TCP端口

# 为容器绑定4444端口,并告诉网络监听4444
JOB=$(sudo docker run -d -p 4444 ubuntu:12.10 /bin/nc -l 4444)
# 查看我的容器用的公共端口
PORT=$(sudo docker port $JOB 4444 | awk -F: '{ print $2 }')
# 连接公共端口
echo hello world | nc 127.0.0.1 $PORT
# 确认网络连接是否工作
echo "Daemon received: $(sudo docker logs $JOB)"
------------------------------------------------------------------------------------------------------------------------------------------------------------------


功能划分



命令



环境信息相关



  • info
  • version

系统运维相关



  • attach
  • build
  • commit
  • cp
  • diff
  • export
  • images
  • import / save / load
  • inspect
  • kill
  • port
  • pause / unpause
  • ps
  • rm
  • rmi
  • run
  • start / stop / restart
  • tag
  • top
  • wait

日志信息相关



  • events
  • history
  • logs

Docker Hub服务相关



  • login
  • pull / push
  • search

1.1 参数约定
  单个字符的参数可以放在一起组合配置,例如

docker run -t -i --name test busybox sh
  可以用这样的方式等同:

docker run -ti --name test busybox sh
1.2 Boolean
  Boolean参数形式如: -d=false。注意,当你声明这个Boolean参数时,比如 docker run -d=true,它将直接把启动的Container挂起放在后台运行。

1.3 字符串和数字
  参数如 --name=“” 定义一个字符串,它仅能被定义一次。同类型的如-c=0 定义一个数字,它也只能被定义一次。

1.4 后台进程
  Docker后台进程是一个常驻后台的系统进程,值得注意的是Docker使用同一个文件来支持客户端和后台进程,其中角色切换通过-d来实现。这个后台进程是用来管理容器的,使用Docker --help可以得到更详细的功能参数配置, 如下图:
DSC0002.png
  Docker后台进程参数清单如下表:


参数



解释


  --api-enable-cors=false

  开放远程API调用的 CORS 头信息。这个接口开关对想进行二次开发的上层应用提供了支持。

  -b, --bridge=""

  挂载已经存在的网桥设备到 Docker 容器里。注意,使用 none 可以停用容器里的网络。

  --bip=""

  使用 CIDR 地址来设定网络桥的 IP。注意,此参数和 -b 不能一起使用。

  -D, --debug=false

  开启Debug模式。例如:docker -d -D

  -d, --daemon=false

  开启Daemon模式。

  --dns=[]

  强制容器使用DNS服务器。例如: docker -d --dns 8.8.8.8

  --dns-search=[]

  强制容器使用指定的DNS搜索域名。例如: docker -d --dns-search example.com

  -e, --exec-driver="native"

  强制容器使用指定的运行时驱动。例如:docker -d -e lxc

  -G, --group="docker"

  在后台运行模式下,赋予指定的Group到相应的unix socket上。注意,当此参数 --group 赋予空字符串时,将去除组信息。

  -g, --graph="/var/lib/docker"

  配置Docker运行时根目录

  -H, --host=[]

  在后台模式下指定socket绑定,可以绑定一个或多个 tcp://host:port, unix:///path/to/socket, fd://* 或 fd://socketfd。例如:
  $ docker -H tcp://0.0.0.0:2375 ps 或者
  $ export DOCKER_HOST="tcp://0.0.0.0:2375"
$ docker ps

  --icc=true

  启用内联容器的通信。

  --ip="0.0.0.0"

  容器绑定IP时使用的默认IP地址

  --ip-forward=true

  启动容器的 net.ipv4.ip_forward

  --iptables=true

  启动Docker容器自定义的iptable规则

  --mtu=0

  设置容器网络的MTU值,如果没有这个参数,选用默认 route MTU,如果没有默认route,就设置成常量值 1500。

  -p, --pidfile="/var/run/docker.pid"

  后台进程PID文件路径。

  -r, --restart=true

  重启之前运行中的容器

  -s, --storage-driver=""

  强制容器运行时使用指定的存储驱动,例如,指定使用devicemapper, 可以这样:
  docker -d -s devicemapper

  --selinux-enabled=false

  启用selinux支持

  --storage-opt=[]

  配置存储驱动的参数

  --tls=false

  启动TLS认证开关

  --tlscacert="/Users/dxiao/.docker/ca.pem"

  通过CA认证过的的certificate文件路径

  --tlscert="/Users/dxiao/.docker/cert.pem"

  TLS的certificate文件路径

  --tlskey="/Users/dxiao/.docker/key.pem"

  TLS的key文件路径

  --tlsverify=false

  使用TLS并做后台进程与客户端通讯的验证

  -v, --version=false

  显示版本信息

  注意,其中带有[] 的启动参数可以指定多次,例如

$ docker run -a stdin -a stdout -a stderr -i -t ubuntu /bin/bash
2. Docker命令行探秘

2.1 环境信息相关
  info
  使用方法: docker info
  例子:

[fedora@docker-devel-cli docker]$ sudo docker -D info
Containers: 0
Images: 32
Storage Driver: devicemapper
Pool Name: docker-252:1-130159-pool
Data file: /var/lib/docker/devicemapper/devicemapper/data
Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
Data Space Used: 1616.9 Mb
Data Space Total: 102400.0 Mb
Metadata Space Used: 2.4 Mb
Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.11.10-301.fc20.x86_64
Debug mode (server): false
Debug mode (client): true
Fds: 11
Goroutines: 14
EventsListeners: 0
Init SHA1: 2c5adb59737b8a01fa3fb968519a43fe140bc9c9
Init Path: /usr/libexec/docker/dockerinit
Sockets: [fd://]
  使用说明:
  这个命令在开发者报告Bug时会非常有用,结合docker vesion一起,可以随时使用这个命令把本地的配置信息提供出来,方便Docker的开发者快速定位问题。
  version
  使用方法: docker version
  使用说明:
  显示Docker的版本号,API版本号,Git commit, Docker客户端和后台进程的Go版本号。

2.2 系统运维相关
  attach
  使用方法: docker attach [OPTIONS] CONTAINER
  例子:

$ ID=$(sudo docker run -d ubuntu /usr/bin/top -b)
$ sudo docker attach $ID
top - 17:21:49 up  5:53,  0 users,  load average: 0.63, 1.15, 0.78
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  0.7 sy,  0.0 ni, 97.7 id,  0.7 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   2051644 total,   723700 used,  1327944 free,    33032 buffers
KiB Swap:   0 total,   0 used,  0 free.   565836 cached Mem
PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
1 root      20   0   19748   1280   1008 R  0.0  0.1   0:00.04 top
$ sudo docker stop $ID
  使用说明:
  使用这个命令可以挂载正在后台运行的容器,在开发应用的过程中运用这个命令可以随时观察容器內进程的运行状况。开发者在开发应用的场景中,这个命令是一个非常有用的命令。
  build
  使用方法:docker build [OPTIONS] PATH | URL | -
  例子:

$ docker build .
Uploading context 18.829 MB
Uploading context
Step 0 : FROM busybox
---> 769b9341d937
Step 1 : CMD echo Hello world
---> Using cache
---> 99cc1ad10469
Successfully built 99cc1ad10469
  使用说明:
  这个命令是从源码构建新Image的命令。因为Image是分层的,最关键的Base Image是如何构建的是用户比较关心的,Docker官方文档给出了构建方法,请参考这里。
  commit
  使用方法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  例子:

$ sudo docker ps
ID                  IMAGE               COMMAND             CREATED             STATUS              PORTS
c3f279d17e0a        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours
197387f1b436        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours
$ docker commit c3f279d17e0a  SvenDowideit/testimage:version3
f5283438590d
$ docker images | head
REPOSITORY                        TAG                 ID                  CREATED             VIRTUAL SIZE
SvenDowideit/testimage            version3            f5283438590d        16 seconds ago      335.7 MB
  使用说明:
  这个命令的用处在于把有修改的container提交成新的Image,然后导出此Imange分发给其他场景中调试使用。Docker官方的建议是,当你在调试完Image的问题后,应该写一个新的Dockerfile文件来维护此Image。commit命令仅是一个临时创建Imange的辅助命令。
  cp
  使用方法: cp CONTAINER:PATH HOSTPATH
  使用说明:
  使用cp可以把容器內的文件复制到Host主机上。这个命令在开发者开发应用的场景下,会需要把运行程序产生的结果复制出来的需求,在这个情况下就可以使用这个cp命令。
  diff
  使用方法:docker diff CONTAINER
  例子:

$ sudo docker diff 7bb0e258aefe
C /dev
A /dev/kmsg
C /etc
A /etc/mtab
A /go
A /go/src
A /go/src/github.com
A /go/src/github.com/dotcloud
....
  使用说明:
  diff会列出3种容器内文件状态变化(A - Add, D - Delete, C - Change )的列表清单。构建Image的过程中需要的调试指令。
  export
  使用方法:docker export CONTAINER
  例子:

$ sudo docker export red_panda > latest.tar
  使用说明:
  把容器系统文件打包并导出来,方便分发给其他场景使用。
  images
  使用方法:docker images [OPTIONS] [NAME]
  例子:

$ sudo docker images | head
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
  77af4d6b9913 19 hours ago 1.089 GB
committest latest b6fa739cedf5 19 hours ago 1.089 GB
  78a85c484f71 19 hours ago 1.089 GB
$ docker latest 30557a29d5ab 20 hours ago 1.089 GB
  0124422dd9f9 20 hours ago 1.089 GB
  18ad6fad3402 22 hours ago 1.082 GB
  f9f1e26352f0 23 hours ago 1.089 GB
tryout latest 2629d1fa0b81 23 hours ago 131.5 MB
  5ed6274db6ce 24 hours ago 1.089 GB
  使用说明:
  Docker Image是多层结构的,默认只显示最顶层的Image。不显示的中间层默认是为了增加可复用性、减少磁盘使用空间,加快build构建的速度的功能,一般用户不需要关心这个细节。
  import / save / load
  使用方法:

docker import URL|- [REPOSITORY[:TAG]]
docker save IMAGE
docker load
  使用说明:
  这一组命令是系统运维里非常关键的命令。加载(两种方法: import, load),导出(一种方法: save)容器系统文件。
  inspect
  使用方法:

docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]
  例子:

$ sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' $INSTANCE_ID
  使用说明:
  查看容器运行时详细信息的命令。了解一个Image或者Container的完整构建信息就可以通过这个命令实现。
  kill
  使用方法:

docker kill [OPTIONS] CONTAINER [CONTAINER...]
  使用说明:
  杀掉容器的进程。
  port
  使用方法:

docker port CONTAINER PRIVATE_PORT
  使用说明:
  打印出Host主机端口与容器暴露出的端口的NAT映射关系
  pause / unpause
  使用方法:

docker pause CONTAINER
  使用说明:
  使用cgroup的freezer顺序暂停、恢复容器里的所有进程。详细freezer的特性,请参考官方文档。
  ps
  使用方法:

docker ps [OPTIONS]
  例子:

$ docker ps
CONTAINER ID        IMAGE                        COMMAND                CREATED              STATUS              PORTS               NAMES
4c01db0b339c        ubuntu:12.04                 bash                   17 seconds ago       Up 16 seconds                           webapp
d7886598dbe2        crosbymichael/redis:latest   /redis-server --dir    33 minutes ago       Up 33 minutes       6379/tcp            redis,webapp/db
  使用说明:
  docker ps打印出正在运行的容器,docker ps -a打印出所有运行过的容器。
  rm
  使用方法:

docker rm [OPTIONS] CONTAINER [CONTAINER...]
  例子:

$ sudo docker rm /redis
/redis
  使用说明:
  删除指定的容器。
  rmi
  使用方法:

docker rmi IMAGE [IMAGE...]
  例子:

$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
$ sudo docker rmi fd484f19954f
Error: Conflict, cannot delete image fd484f19954f because it is tagged in multiple repositories
2013/12/11 05:47:16 Error: failed to remove one or more images
$ sudo docker rmi test1
Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
$ sudo docker rmi test2
Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
$ sudo docker rmi test
Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
  使用说明:
  指定删除Image文件。
  run
  使用方法:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  例子:

$ sudo docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"
  使用说明:
  这个命令是核心命令,可以配置的参数多达28个参数。详细的解释可以通过docker run --help列出。官方文档中提到的 Issue 2702:"lxc-start: Permission denied - failed to mount" could indicate a permissions problem with AppArmor. 在最新版本的Dcoker中已经解决。
  start / stop / restart
  使用方法:

docker start CONTAINER [CONTAINER...]
  使用说明:
  这组命令可以开启(两个:start, restart),停止(一个:stop)一个容器。
  tag
  使用方法:

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
  使用说明:
  组合使用用户名,Image名字,标签名来组织管理Image。
  top
  使用方法:

docker top CONTAINER [ps OPTIONS]
  使用说明:
  显示容器內运行的进程。
  wait
  使用方法:

docker wait CONTAINER [CONTAINER...]
  使用说明:
  阻塞对指定容器的其他调用方法,直到容器停止后退出阻塞。

2.3 日志信息相关
  events
  使用方法:

docker events [OPTIONS]
  使用说明:
  打印容器实时的系统事件。
  history
  使用方法:

docker history [OPTIONS] IMAGE
  例子:

$ docker history docker
IMAGE CREATED CREATED BY SIZE
3e23a5875458790b7a806f95f7ec0d0b2a5c1659bfc899c89f939f6d5b8f7094 8 days ago
/bin/sh -c #(nop) ENV LC_ALL=C.UTF-8 0 B
8578938dd17054dce7993d21de79e96a037400e8d28e15e7290fea4f65128a36 8 days ago
/bin/sh -c dpkg-reconfigure locales && locale-gen C.UTF-8 &&
/usr/sbin/update-locale LANG=C.UTF-8 1.245 MB
be51b77efb42f67a5e96437b3e102f81e0a1399038f77bf28cea0ed23a65cf60 8 days ago /bin/sh
-c apt-get update && apt-get install -y git libxml2-dev python build-essential
make gcc python-dev locales python-pip 338.3 MB
4b137612be55ca69776c7f30c2d2dd0aa2e7d72059820abf3e25b629f887a084 6 weeks ago
/bin/sh -c #(nop) ADD jessie.tar.xz in / 121 MB
750d58736b4b6cc0f9a9abe8f258cef269e3e9dceced1146503522be9f985ada 6 weeks ago
/bin/sh -c #(nop) MAINTAINER Tianon Gravi
- mkimage-debootstrap.sh -t jessie.tar.xz jessie http://http.debian.net/debian 0 B
511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158 9 months ago 0 B
  
  使用说明:
  打印指定Image中每一层Image命令行的历史记录。
  logs
  使用方法:

docker logs CONTAINER
  使用说明:
  批量打印出容器中进程的运行日志。

2.4 Dcoker Hub服务相关
  login
  使用方法:

docker login [OPTIONS] [SERVER]
  使用说明:
  登录Hub服务。
  pull / push
  使用方法:

docker push NAME[:TAG]
  使用说明:
  通过此命令分享Image到Hub服务或者自服务的Registry服务。
  search
  使用方法:

docker search TERM
  使用说明:
  通过关键字搜索分享的Image。

3. 总结
  通过以上Docker命令行的详细解释,可以强化对Docker命令的全面理解。考虑到Docker命令行的发展变化非常快,读者可以参考官方的命令行解释文档更新相应的命令行解释。另外,通过以上Docker命令行的分析,可以知道Docker命令行架构设计的特点在于客户端和服务端的运行文件是同一个文件,内部实现代码应该是重用的设计。笔者希望开发者在开发类似的命令行应用时参考这样的设计,减少前后台容错的复杂度。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58095-1-1.html 上篇帖子: 快速理解Docker 下篇帖子: Docker 初级实践
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表