docker命令

docker安装(mac)

docker查询命令

docker info
查看docker信息
docker ps -a
查看所有的容器,包括运行的和退出的
docker ps
查看所有的运行的容器
docker inspect container_id/names
查看容器的详细信息
docker search tutorial
搜索nginx镜像
docker pull egamas/docker-tutorial
拉取egamas/docker-tutorial镜像
docker images
查看所有的镜像
docker image - since=mongo:3.2
docker images -before=mongo:3.2
docker attach container_id/names
登录web容器
docker exec -it container_names /bin/bash
登录容器中(容器已经启动的)
docker rm container_id/names
删除停止状态的容器
docker rm -f container_id/names
删除开启状态的容器
docker push source
docker port id
docker top id
docker rmi image_id
删除镜像
docker image rm id
docker diff image_name
查看容器的具体变更内容(和基础的镜像相比,所作的变更,比如说在容器中安装了vim,这个时候就会显示出具体安装vim新增的文件)
docker commit container_id image_id
将修改的容器内容提交到镜像中,形成新的基础镜像(一般来说不这么干,都用Dockerfile)
docker build -t image_name PATH
在PATH目录下,按照Dockerfile建立一个新的image_name镜像
path指的是上下文环境,当构建的时候,用户会指定构建镜像上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎,这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件
docker import SOURCE_PATH TARGET_PATH
   docker import \
       http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz \
       web1/ubuntu:14.04

http://www.kancloud.cn/lyric/docker-intro/79899
docker save
保存镜像为归档文件
docker save web | gzip > web.tar.gz
dcoker load
将归档文件复制到另一个机器上
docker load -i web.tar.gz
docker run [option] image_name [command]
启动容器
在终端输出:hello world(注意nginx是镜像名称,在运行之后会创建一个容器,可执行docker ps -a查看,然后使用docker rm 进行删除)
    sudo docker run nginx /bin/echo 'Hello world'

 创建一个基于image_name的镜像(以nginx为镜像构建一个容器,命名为web)  
       docker run -t -i --name web nginx /bin/bash 

 运行bash终端,允许用户进行交互(-t分配给docker一个伪终端,-i让容器的标准输入保持打开)
    sudo docker run -it nginx /bin/bash

 docker run创建容器时,Docker会在后台运行包含以下:
    检查本地是否存在指定的镜像,不存在就从公有仓库下载
    利用镜像创建并启动一个容器
    分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
    从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
    从地址池配置一个 ip 地址给容器
    执行用户指定的应用程序
    执行完毕后容器被终止
docker start container_id/names
运行容器
docker stop container_id/names
停止运行容器    
docker 后台运行
-d 让Dockre在后台运行而不是直接把执行命令的结果输出在当前宿主机下
sudo docker run nginx /bin/sh -c "while true; do echo hello world; sleep 1; done"
sudo docker run -d nginx /bin/sh -c "while true; do echo hello world; sleep 1; done"
docker logs [container_id]
获取容器的输出信息
进入Docker容器
attach
    sudo docker run -idt nginx
    sudo docker ps
    sudo docker attach quizzical_kilby
    多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了

nsenter
    这个太复杂了,反正我也不会用
docker export
导出容器快照到本地文件
docker export web > web.tar
docker import
导入本地容器快照为镜像
docker import web.tar test
数据卷
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性
数据卷可以在容器之间共享和重用
对数据卷的修改会立马生效
对数据卷的更新,不会影响镜像
数据卷默认会一直存在,即使容器被删除
注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。
创建数据卷
docker run -d -P --name web -v /webapp nginx
可以使用:docker exec -it web /bin/bash登录容器进行查看
删除数据卷
docker rm -fv web
-v移除数据卷
挂载一个主机目录作为数据卷(也可以挂载文件)
第一反应的作用是,本地可以写代码不用上传了,实时的在docker中运行
docker run -d -P --name web -v /src/webapp:/opt/webapp nginx
主机目录:/src/webapp 容器目录:/opt/webapp
查看数据卷的信息
docker inspect web
可以看到volumes字样
数据卷容器
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的
创建一个容器(作为数据卷):
    docker run -d -v /dbdata --name dbdata nginx
把dbdata容器指定为数据卷容器:
    docker run -d --volumes-from dbdata --name db1 nginx
备份
sudo docker run --volumes-from dbdata -v $(pwd):/backup nginx tar cvf /backup/backup.tar /dbdata
首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目录,容器启动后,使用了 tar 命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 backup.tar 的文件
恢复
如果要恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2
docker run -v /dbdata --name dbdata2 nginx /bin/bash

然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 untar 解压备份文件到挂载的容器卷中
sudo docker run --volumes-from dbdata2 -v $(pwd):/backup nginx tar xvf /backup/backup.tar

为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看
sudo docker run --volumes-from dbdata2 nginx /bin/ls /dbdata

网络

映射到指定端口
docker run -d -p 5000:5000 --name web2 nginx
docker run -d -p 5000:5000 -p 80:80 --name=web2 nginx
查看映射端口配置
docker port web2 5000
容器互联
docker run -d -P --name web2 --link web1:web1 nginx

--link参数的格式为 --link name:alias,其中name是要连接容器的名称,alias是这个连接的别名
Docker 在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上
在启动 db 容器的时候并没有使用 -p 和 -P 标记,从而避免了暴露数据库端口到外部网络上

Docker 通过两种方式为容器公开连接信息:
环境变量
    docker exec -it web2 /bin/bash  (登录docker容器)
    env (使用env查看web2容器环境变量)

    查询结果如下
    HOSTNAME=b64578555fd9
    WEB1_PORT_80_TCP=tcp://172.17.0.2:80
    NJS_VERSION=1.13.1.0.1.10-1~stretch
    NGINX_VERSION=1.13.1-1~stretch
    WEB1_PORT_80_TCP_PROTO=tcp
    WEB1_PORT_80_TCP_ADDR=172.17.0.2
    WEB1_PORT=tcp://172.17.0.2:80
    PWD=/
    HOME=/root
    WEB1_ENV_NGINX_VERSION=1.13.1-1~stretch
    WEB1_PORT_80_TCP_PORT=80
    TERM=xterm
    SHLVL=1
    WEB1_NAME=/web2/web1
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    WEB1_ENV_NJS_VERSION=1.13.1.0.1.10-1~stretch
    _=/usr/bin/env

    以WEB1_开头的环境变量是供web2容器连接web1容器使用


添加host信息到父容器的/etc/hosts的文件    
    docker exec -it web2 /bin/bash  (登录docker容器)
    cat /etc/hosts(查看hosts文件)

    127.0.0.1    localhost
    ::1    localhost ip6-localhost ip6-loopback
    fe00::0    ip6-localnet
    ff00::0    ip6-mcastprefix
    ff02::1    ip6-allnodes
    ff02::2    ip6-allrouters
    172.17.0.2    web1 979e62ebf622
    172.17.0.3    b64578555fd9

    docker exec -it web1 /bin/bash  (登录docker容器)
    cat /etc/hosts(查看hosts文件)
    127.0.0.1    localhost
    ::1    localhost ip6-localhost ip6-loopback
    fe00::0    ip6-localnet
    ff00::0    ip6-mcastprefix
    ff02::1    ip6-allnodes
    ff02::2    ip6-allrouters
    172.17.0.2    979e62ebf622

高级网络配置

下面是一个跟 Docker 网络相关的命令列表,其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。
      -b BRIDGE or --bridge=BRIDGE --指定容器挂载的网桥
      --bip=CIDR --定制 docker0 的掩码
      -H SOCKET... or --host=SOCKET... --Docker 服务端接收命令的通道
      --icc=true|false --是否支持容器之间进行通信
      --ip-forward=true|false --请看下文容器之间的通信
      --iptables=true|false --是否允许 Docker 添加 iptables 规则
      --mtu=BYTES --容器网络中的 MTU

下面2个命令选项既可以在启动服务时指定,也可以 Docker 容器启动(docker run)时候指定
    --dns=IP_ADDRESS... --使用指定的DNS服务器
    --dns-search=DOMAIN... --指定DNS搜索域

配置DNS

利用虚拟文件来挂载到来容器的 3 个相关配置文件

在容器中使用mount可以看到挂载信息
    /dev/vda1 on /etc/resolv.conf type ext4 (rw,relatime,data=ordered)
    /dev/vda1 on /etc/hostname type ext4 (rw,relatime,data=ordered)
    /dev/vda1 on /etc/hosts type ext4 (rw,relatime,data=ordered)

 这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 dns 配置通过 /etc/resolv.conf 文件立刻得到更新
配置hostname
-h HOSTNAME or --hostname=HOSTNAM
注意:HOSTNAME会被写到容器内的 /etc/hostname 和 /etc/hosts;但它在容器外部看不到,既不会在 docker ps 中显示,也不会在其他的容器的 /etc/hosts 看到
配置alias
--link=CONTAINER_NAME:ALIAS
在创建容器的时候,添加一个其他容器的主机名到 /etc/hosts 文件中,让新容器的进程可以使用主机名 ALIAS 就可以连接它
添加dns
--dns=IP_ADDRESS
添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名
设定搜索域
--dns-search=DOMAIN
设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索host,还会搜索 host.example.com

容器访问控制

主要是通过linux上的iptables防火墙进行管理和实现的
容器访问外部网络
sysctl net.ipv4.ip_forward  查看是否值为1,如果不是则:
sysctl -w net.ipv4.ip_forward=1
或者在启动的时候设定:--ip-forward=true
容器之间访问
容器的网络拓扑是否已经互联
本地系统的防火墙软件
访问所有端口
当启动 Docker 服务时候,默认会添加一条转发策略到 iptables 的 FORWARD 链上。策略为通过(ACCEPT)还是禁止(DROP)取决于配置--icc=true(缺省值)还是 --icc=false。当然,如果手动指定 --iptables=false 则不会添加 iptables 规则。
可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在 /etc/default/docker 文件中配置 DOCKER_OPTS=--icc=false 来禁止它
访问指定端口
在通过 -icc=false 关闭网络访问后,还可以通过 --link=CONTAINER_NAME:ALIAS 选项来访问容器的开放端口
坚持原创技术分享,您的支持将鼓励我继续创作!