2019独角兽企业重金招聘Python工程师标准>>>
此内容基于《第一本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