docker容器使用快速了解普及

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

此内容基于《第一本docker书》总结,内容次序不是很规范,按照书籍内容介绍部分有添加:
docker子命令概览
子命令分类                             子命令
Docker环境信息              info、version
容器生命周期管理            create、exec、kill、pause、restart、rm、run、start、stop、unpause
镜像仓库命令                login、logout、pull、push、 search
镜像管理                    build、images、import、load、rmi、save、tag、commit
容器运维操作                attach、export、inspect、port、ps、rename、stats、top、wait、cp、diff、update
容器资源管理                volume、network
系统日志信息                events、history、logs
获取子命令详细信息
docker COMMAND_NAME –help


Docker容器操作
Docker守护进程绑定到多个地址
  -H tcp://IP:PORT –H unix:///home/docker/docker.sock
基于基础镜像运行容器:【base registry为Ubuntu】
docker run –i -t ubuntu /bin/bash
           -i 保证容器中的STDIN是开启的
           -t 为创建的容器分配一个伪tty终端
          --name CONTAINER_NAME 容器命名
          -d 创建守护式容器
带标签的Ubuntu镜像 ubuntu:12.04
容器启停
docker start|stop CONTAINER_NAME
docker ps 查看启动的容器
          -a 查看所有的容器
docker ps –n –x  会显示最后x个容器,不论容器正在运行还是已经停止
docker attach CONTAINER_NAME  附着到指定的容器上
docker logs COMTAINER_NAME 获取容器的日志
           -f 参数来监控docker的日志,与tail -f类似
           -t 每条日志加上时间戳
           --tail N 获取日志的最后N行内容
           --tail 0 –f  来跟踪某个容器的最新日志,不必读取整个日志
查看容器内的进程
docker top CONTAINER_NAME
在容器内部运行进程
docker exec –d CONTAINER_NAME COMMAND
            -d 需要运行一个后台进程
docker exec -i -t CONTAINER_NAME /bin/bash  为执行的进程创建TTY并捕获STDIN。exit后不会终止容器相当于创建一个新的bash回话。
docker run --restart=always ….
           --restart 会检查容器的退出代码,并据此来决定是否要重启容器,always无论容器的退出代码是什么,Docker都会自动重启该容器;on-failure还接受一个可选的重启次数参数   --restart=on-failure:5  最多重启5次
深入容器
docker inspect CONTAINER_NAME        会对容器进行详细的检查,然后返回其配置信息,包括名称命令、网络配置以及很多有用的数据         
                             -f|—format=’{{ .State.Runing }}’   查看日志内容,可以同时制定多个容器
删除容器
docker rm CONTAINER_NAME
docker rm ‘docker ps -a -q’删除所有
                       -q 只返回容器的ID
Docker安装之后,/var/lib/docker存放着docker镜像,容器以及容器的配置


Docker镜像操作
列出所有docker镜像
docker images
拉取镜像
docker pull registry_name|registry_name:xxx
查找镜像
docker search registry_name
Docker Hub有两种类型的仓库:
    用户仓库和顶层仓库
    用户仓库是docker用户创建的
    顶层仓库是由docker内部的人来管理的
    Jamturol/puppet
    Jamturol: 用户名
    puppet:仓库名

构建镜像
使用docker commit . 登录(Docker Hub)操作构建
使用docker build和Dockerfile文件
     docker commit CONTAINER_NAME|ID jamturol/apache2    提交的只是创建容器的镜像与容器的当前状态之间有差异的部分

Dockerfile文件
# version: 0.01   注释
FROM BASE_REGISTRY    # BASE_REGISTRY 作为新镜像的基础镜像
MAINTAINER xxx, “[email protected]” #镜像的作者及作者的邮件地址
RUN echo ‘xxx’> /path/to/file   #每条RUN指令都会创建一个新的镜像层
RUN 。。。   # RUN指令会在shell里使用命令包装器/bin/sh -c来执行,如果不支持shell或者不希望shell运行,可以使用exec格式的RUN指令。 RUN [ “apt-get”,”install”,”-y”,”nginx” ]
。。。
EXPOSE 80   # Docker该容器内的应用程序将会使用容器的指定端口。可以指定多个EXPOSE指令来向外部公开多个端口。
docker build -t=”jamturol/static_web” .   #运行Dockerfile
              -t 为新镜像设置了仓库和名称
              -t=”jamturol/static_web:v1” 为镜像设置一个标签,“镜像名:标签”,如果没有指定任何标签,Docker会将自动为镜像设置一个latest标签
              --no-cache 略过缓存功能,每个包使用最新版本
ENV REFRESHED_AT 2017-07-05   #设置一个名为REFRESHED_AT的环境变量
深入探求镜像是如何构建出来的
docker history REGISTRY_NAME|ID
从新镜像启动一个容器
docker run –d –p 80 --name static_web jamtuol/static_web nginx –g “deamon off;”
       以前台方式运行nginx,-p公开哪些网络端口给外部
docker ps –l     查看端口的映射情况
docker port ID 80  查看容器端口的映射情况
            -P  大写公开在Dockerfile中的EXPOSE设置的所有端口
            -p IP:PORT1:PORT2 将容器的port2端口绑定到宿主机的port1端口上
CMD 指定容器启动时要运行的命令,   CMD [“/bin/bash”,”-l”]
使用docker run命令可以覆盖CMD指令
ENTRYPOINT  docker run命令行中指定的任何参数都会被当作参数再次传递给ENTRYPOINT指令中指定的命令
ENTRYPOINT [“/usr/sbin/nginx”]
docker run 的--entrypoint标志覆盖ENTRYPOINT指令
WORKDIR  在容器内部设置一个工作目录,ENTRYPOINT和CMD指定的程序会在这个目录下执行,可设置多个
docker run –w /var/log …
                     -w 在运行时覆盖工作目录
ENV设置的环境变量,取值为$变量名,这些变量会被持久保存到从我们的镜像创建的任何容器中
USER  指定该镜像会以什么样的用户去运行
USER nginx  也可以是UID,指定user和group
USER UID
USER user:group
VOLUME [“/opt/project”]   基于此镜像创建的任何容器,创建一个名为/opt/project的挂载点,也可以指定多个卷 
VOLUME [“/opt/project”,”/data”]
ADD software.lic /opt/application/software.lic   将构建环境下的文件和目录复制到镜像中,在安装应用程序时,会使用Docker通过目的地址参数末尾的字符来判断文件源是目录还是文件
COPY conf.d /etc/apache2   把本地conf.d目录中的文件复制到/etc/apache2/目录中。copy只关心在构建上下文中复制本地文件,而不会去做文件提取和解压的工作,如果目的位置不存在,Docker会自动创建所需要的目录结构
ONBUILD  能为镜像添加触发器,当一个镜像被使用做其他镜像的基础镜像时,该镜像中的触发器将会执行,触发器会在构建过程中插入新指令,可以认为这些指令是紧跟在FROM之后指定的,触发器可以是任何构建指令
ONBUILD ADD . /opp/src
ONBUILD RUN cd /app/src && make


镜像打包及导入相关操作
打包一个镜像
docker save REPO_NAME:TAG > filename.tar
docker load < filename.tar  加载一个镜像
删除镜像
docker rmi jamtuol/static_web
docker run –v $PWD/website:/var/www/html/website:ro ….
           -v 指定了卷的源目录(本地宿主机的目录)和容器里的目的目录,两个目录通过:来分隔,目的目录不存在,会自动创建,ro或者rw来定读写状态
docker run --link redis:db ...
           --link 标志创建了两个容器间的父子连接,需要两个参数一个是要连接的容器名字,另一个是连接后容器的别名
docker run -p 4567 --name webapp --link redis:db -t -i -v $PWD/webapp:/opt/webapp jamturol/sintra /bin/bash
           可以强制docker只允许有连接的容器之间互相通信。需要在启动docker守护进程时加上--icc=false,关闭所有没有连接的容器间的通信。被连接的容器必须运行在同一个docker宿主机上
docker run 中加入--dns或者--dns-search为某个容器单独配置dns
RUN shell.sh   运行shell脚本
可以通过多个文件来执行构建
Dockerfile、shell.sh、var.txt等
docker run --privileged ...
           可以启动docker特权模式,允许以其宿主机具有的(几乎)所有能力来运行容器,包括一些内核特性和设备访问
docker wait CONTAINER_NAME 等待程序退出得到返回码
docker run --cidfile=/tmp/CONTAINERID.txt
           让docker截获容器id并将其存到--cidfile选项指定的文件
docker run --rm ...  会在容器进程运行完毕后,自动删除容器,对于只用一次的容器和用完即扔的容器很有用
在Dockerfile中指定了VOLUME时,在run对应的镜像启动容器,容器中就有对外的挂载点。可以通过inspect看到,如果没有指定,则没有对外的挂载点
Dockerfile使用for
RUN for var in v{v..8};do touch $DIRS/$var; done   # DIRS是ENV指定的环境变量
serf是一个去中心化的服务发现和编排的解决方案,特点是轻量级和高可用,同时具备容错的特性
docker run -p 53:53/udp ...  以udp的方式
docker run -h CONTAINER_host_name 。。。
docker各语言支持多种SDK

转载于:https://my.oschina.net/u/1762991/blog/1162817

你可能感兴趣的:(docker容器使用快速了解普及)