Docker 笔记
本文档中使用“/#”表示正处于容器的交互式命令行中“#”表示处于宿主机命令行中
#service docker start //启动docker服务
#service docker stop //停止docker服务
#service docker restart //重启docker
#Docker run --privileged –I –t Ubuntu /bin/bash //创建并启动容器,随机分配容器名称,如果本地没有ubuntu镜像会从仓库下载,--privileged 表示docker的特权模式, 允许以宿主机具有的几乎所有的能力来运行容器,可以 用它来在docker中运行docker
/# hostname
/#cat /etc/hosts
/#ps –aux //容器中查看进程
/#apt-get update
/#apt-get install vim // 容器中安装vim
# docker run --name ubuntu_container –i –t Ubuntu /bin/bash //为容器命名
#docker ps –a //列出所有的容器,包括正在运行和已经停止的去掉a参数则只列出所有正在运行的, 容器的命名必须是唯一的。
#docker ps –n 7 //显示最后7个容器,无论是停止还是正在运行
#docker start ubuntu_container //重新启动已经停止的容器可以用docker ps 查看正在运行的容器, 重启的时候会安装之前的参数重启
#docker start 5bc30c6010ed //通过id重启容器
#docker stop ubuntu_container //停止容器 向容器发送SIGTERM信号
#docker stop 5bc30c6010ed //停止容器也可以用容器id
#docker kill ubuntu_container //快速停止容器
#docker kill 5bc30c6010ed //快速停止容器 向容器发送SIGKILL信号
#docker create //创建一个容器但是并不运行
#docker attach ubuntu_container //重启之后,可以通过attach附着到容器中重新进入容器的bash交互式命令行,执行该命令之后可能需要回车键才可以回到bash
#docker attach 5bc30c6010ed // 后面除了接容器名称还可以接容器id
#docker run --name daemon_demo -d ubuntu /bin/sh -c "whle true; do echo hello world;sleep 1; done" //创建一个守护式容器,-d 表示后台运行, while循环打印hello world,执行该命令之后并没有进去交互式bash, 而是会返回一个容器id
#docker logs daemon_demo //获取守护式容器的日志会输出hello world
#docker logs -f daemon_demo //-f 操作类似tail –f , 按ctrl c 停止
#docker logs tail 10 daemon_demo //输出最后十行日志
#docker logs tail 0 -f daemon_demo //跟踪最新日志
#docker run –log-driver=“syslog” --name daemon_demo -d ubuntu /bin/sh -c "whle true; do echo hello world;sleep 1; done"//将所有日志重定向输出到syslog,docker log将失效
#docker top daemon_demo // 查看容器内部的进程
#docker stats [容器名称1 容器名称2 …]// 显示一个或者多个容器的统计信息,可以查看各个容器的cpu,内存, 网络IO等等;docker1.5中引入的指令
//容器中运行进程:1后台任务, 2交互式任务
#docker exec –d daemon_demo touch /etc/new_config_file //在容器中运行一个进程,touch命令创建一个新的空文件,-d表示后台运行
#docker exec –I –t daemon_demo /bin/bash //在容器内进行交互式命令
//容器自动重启: 由于某种错误导致容器停止通过--restart参数自动重启,--restart会检查容器退出代码,据此决定是否需要重启,默认不会重启
#docker run -–restart=always --name daemon_demo -d ubuntu /bin/sh -c "whle true; do echo hello world;sleep 1; done" //-–restart=always表示无论退出代码是什么都会重启,除了always之外还有“on-failure”值,on-failure只有在退出代码为0时才重启它还可以指定重启的次数:“-–restart=on-failure:5”表示当退出代码为0时重启,最多重启5次
#docker inspect daemon_demo //获取容器的详细配置信息,可以查看容器的名称、命令、网络配置、以及其他的很多有用数据
#docker inspect --format=‘{{ .State.running}}’ daemon_demo// 可以用-f或者—format查看选定的结果, 例如该命令返回容器的运行状态 –f或—format支持go语言模板
#docker inspect –format ‘{{ .NetworkSettins.IPAddress}}’ daemon_demo //返回容器的IP
#docker inspect –format ‘{{.Name}} {{ .NetworkSettins.IPAddress}}’ daemon_demo ubuntu_container //查看多个容器的多个选定的结果
#docker rm 5bc30c6010ed //删除容器
# docker rm ‘sudo docker ps –a -q’ //删除所有容器sudo docker ps –a –q的-a会列出所有的容器,-q会只返回容器id而不会返回其他信息,如此便获取了所有容器的id列表并传给docker rm 命令
#docker images //列出所有镜像
#docker pull ubuntu:12.04 //拉取tag为12.04的ubuntu镜像
#doker images ubuntu //查看所有unbuntu的镜像
#doker search tomcat //查找镜像
#doker login //登陆到docker hub
//以下4个步骤创建一个进行修改过的定制容器
#doker run -i - t ubuntu /bin/bash
/#doker apt-get -y update && apt-get install -y apache2 //在容器中安装apache2
/# exit
#docker commit 5bc30c6010ed addictions/apache2 //指定容器id,提交修改过的容器到addictions仓库镜像名为apache2
-----------------------
#docker ps -l -q //获取刚刚创建的容器id
#docker commit -m "这是提交信息" -a “这是作者信息” 5bc30c6010ed addictions/apache2:webserver //-m是提交信息,-a是作者信息, 还可以指定tag为webserver
#docker inspect addictions/apache2:webserver // 查看镜像详细信息
---------------
//Dockerfile:
#mkdir static_web
#cd static_web
#touch Dockfile
//以上三个步骤创建了一个Dockerfile,编写完Dockerfile命令之后可以使用“docker build.”来构建docker, build会一条条执行Dockerfile中的命令, 后面的点表示当前目录, 会从当前目录寻找Dockerfile文件
//static_web为上下文路径,build时会将上下文目录和目录中的文件上传到docker的守护进程以便在docker守护进程中直接访问上下文中的代码,文件或其他数据
#docker build -t="addictions/static_web:v1" . //-t参数为构建的镜像指定了仓库和镜像名以及镜像的tag
#docker build -f /opt/docker/Dockerfile . //指定本地Dockerfile的位置
#docker build -t="addictions/static_web:v1" git@github.com:addictions/docker-static_web // 也可以指定github仓库地址去找Dockerfile文件
#docker build --no-cache -t="addictions/static_web:v1" . //构建时忽略docker的构建缓存
#docker history 5bc30c6010ed //看出容器是怎么构建出来的,构建历史
------------
Dockerfile指令
Dockerfile 指令全部大写, 第一行必须是FROM
CMD:启动时要运行的命令, 它和RUN 不同的是, RUN是指定镜像被构建时要运行的命令, CMD是指定容器启动时要运行的命令
“docker run -i -t addictions/static_web /bin/tre” 和 “CMD [“/bin/true”]” 等效
CMD [“/bin/true” , “-l”] //将-l参数传给/bin/true
run 会覆盖掉 Dockerfile中CMD 的命令
ENTRYPOINT:类似CMD, 但不会被RUN 命令给覆盖掉
WORKDIR:从镜像创建一个新的目录时, 会在容器内部设置一个工作目录ENTRYPOINT和/或CMD指定的程序会在这个目录下执行
可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为 /a/b/c 。
#docker run -ti -w /var/log ubuntu pwd //-w 标识会覆盖掉Dockerfile中的WORKDIR
ENV:镜像构建过程中设置环境变量
ENV RVM_PATH /home/rvm
RUN gem install unicorn
//以上两条Dockfile命令等效于 ENV RVM_PATH=/home/rvm gem install unicorn
ENV RVM_PATH=/home/rvm RVM_ARCHFLAGS="-arch i386" //设置多个环境变量
以下2条命令演示如何使用环境变量
ENV TARGET_DIR /opt/app
WORKDIR $TARGET_DIR //工作目录的值会被设置成/opt/app
如果需要, 可以在环境变量前加反斜杠来转义
//以上设置环境变量会永久有效, 以下方式通过 -e 标志设置环境变量只在运行时有效
docker run -ti -e “WEB_PORT=8080” ubuntu env // ubuntu env 表示在ubuntu中执行env命令, env命令会输出ubuntu中所有的环境变量
USER:指定该镜像以什么样的用户去运行, 例如: users enginx,以engin的用户来运行, 还可以指定用户名和UID 以及组或GID,甚至两者的组合。如下:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
可以在docker run 命令中使用 -u 覆盖指定的值
VOLUME:用于基于镜像创建的的容器添加卷,一个卷可以存在于一个或多个容器内的特定目录,该目录可绕过联合文件系统并提供共享数据对数据进行持久化的功能, 卷功能是将数据添加到镜像中而不是提交到镜像中并允许我们在多个容器中共享这些内容
指令使用示例:
VOLUME ["/opt/project"] //该命令会基于此镜像创建的任何容器创建一个名为 /opt/project的宿主机挂载点
VOLUME ["/opt/project", "/data"] 挂在多个卷
ADD : 将上下文的文件和目录复制到镜像中, 例如: ADD software.lic /oopt/application/software.lic //该命令会将上下文的softeare.lic 复制到镜像/oopt/application/software.lic中, 路径不存在会被创建
ADD http://wordpress.org/latest.zip /oopt/application/software.lic //除了使用上下文目录中的文件和URL 之外, 其他位置下的文件无法复制。 目标位置(第二个参数)的末尾是/结尾, docker判断为目录, 以非/结尾, doker判断为文件
ADD latest.tar.gz /oopt/application/ //该指令会使用带-x参数的tar 命令将tar.gz 解压, 解压出来之后是压缩包中原有的内容, 若重名, 不会被覆盖。 由ADD 新复制到docker中的文件模式是0755, UID和GID 都是0
COPY: 类似ADD, 不同之处在于, COPY 不会解压压缩包, 例如: COPY confi.d/ /etc/apache2/ //该指令会将conf.d文件夹本身以及文件夹中的文件复制到/etc/apache2/中, 源文件夹必须在对应的上下文目录中, 不能复制该目录之外的文件, 目标位置必须是docker容器中的绝对路径UID和GID 都是0。
LABEL : 为Docker 镜像添加形式为键值对的元数据, 如下:
LABEL version="1.0" //添加单个元数据
LABEL location="NewYork" type="data center" role = "webserver" //添加多个元数据, 用空格分开
为镜像添加完元数据之后, 可以使用 docker inspect addictions/apache2 查看镜像中的标签(label)信息
SOPSIGNAL: 用来设置停止容器时发送什么系统调用信号给容器,这个信号必须是内核调用表中的合法参数, 比如 9, 或者SINGNAL 中的信号名称, 比如SIGKILL
ARG: 用来定义可以在docker buid 命令运行时传递给build的变量, 只要使用 --build-arg标志即可, 只能指定在Dockerfile中定义过的的参数如下例子:
ARG build
ARG webapp_user=user
#docker build --build-arg build=1234 -t addictions/webapp //构建addictions/webapp 镜像时,buld变量会被设置成1234, 而webapp_user变量将集成被设置成的默认值user
另外docker 预定义了一组ARG变量, 可以在构建时直接使用, 就可以不必在Dockerfile中再定义了 。以下是预定义的变量:
HTTP_PROXY
http_proxy
HTTPS_PROXY
https_proxy
FTP_PROXY
ftp_proxy
NO_PROXY
no_proxy
要想使用这些变量在build时候指定即可: docker build --build-arg <varible>=<value>
ONBUILD: 为镜像添加触发器, 他的执行顺序是紧跟在FROM之后的。
---------------
#docker run -d -p 80 --name static_web addictions/static_web nginx -g "daemon off" //-d 表示守护式进程, -p表示为该进程指定一个开放端口, 容器会随机取值32768~61000中较大的端口号来映射到80端口上, 也可以指定具体端口映射到80端口。nginx -g "daemon off"指定了在容器中要运行的命令
#docker ps -l //查看端口映射情况
#docker port 5bc30c6010ed 80 //也可以通过prot命令来查看端口映射情况, port后面接容器id 和容器名
#docker run -d -p 2020:80 --name static_web addictions/static_web nginx -g "daemon off" //-p 2020::80 将容器中进程的端口绑定(映射)到本地宿主机中的2020端口
#docker run -d -p 127.0.0.1:2020:80 --name static_web addictions/static_web nginx -g "daemon off" //-p 127.0.0.1:2020::80 将80端口绑定到宿主机中特定的网络接口(IP地址)上的2020端口上
#docker run -d -p 127.0.0.1::80 --name static_web addictions/static_web nginx -g "daemon off" //-p 127.0.0.1:::80 将80端口绑定到宿主机中特定的网络接口(IP地址)上的随机端口上
#docker run --name mytomcat -v $PWD/webapps:/usr/local/tomcat/webapps tomcat // -v命令表示将宿主机中的$PWD/webapps目录挂载(映射)到容器中的tomcat目录的webapps中, -v命令就是Dockerfile中的VOLUME命令
----------------------
#docker push static_web //将镜像推送到docker hub , 因为这是一个root仓库, 所以会被Dockehub拒绝此次推送, 只有docker公司的团队才可以管理root仓库
#docker push addictions/static_web //将镜像推送到docker hub中的用户仓库 ,addictions是用户ID
#docker rmiaddiction/static_web //删除镜像, 如果要删除镜像仓库, 需要登录dokerhub去delete, 删除多个镜像, 用空格隔开
//从容器中运行Registry, registry 用来存储仓库, 仓库用来存储镜像
#docker run -p 2500:2500 registry:2 //运行一个基于容器的registry
#docker tag 5bc30c6010ed <主机名>:5000/addictions/static_web //使用自己新Registry为镜像打标签, 打完标签就可以push到registry里去了
#docker push <主机名>:5000/addictions/static_web //使用自己新Registry为镜像打标签, 打完标签就可以push到registry里去了
#docker run -t -i <主机名>:5000/addictions/static_web /bin/bash //docker run命令构建新的容器
------------------------
//docker network 是docker 1.9之后推出的。
//在安装docker的时候回创建一个docker0的网络接口, 每个容器都会从这个网络接口上分配一个范围为172.16~172.30之间的IP地址, 而docker0本身的地址是172.17.42.1它是docker的网关地址也是所有容器的网关地址
//一个容器可以同时隶属于多个docker 网络
#docker network create app //创建一个名字为app的桥接网络
#docker network inspect app //查看app网络的详细信息
#docker network ls // 列出所有的network
#docker network rm <networkID> //rm也删除一个network
#docker run -d --net=app --name db addictions/redis // 基于addictions/redis 镜像创建了一个名为db 的新容器, --net=app 表示将容器加到app这个网络中, 该容器会在app这个网络中运行
#docker network connect app db2 //将已有的容器db2连接到app网络中, db2是容器名
#docker network disconnect app db2 //将容器db2从app网络中断开连接,
#docker network inspect app //可以看到该网络中有哪些容器
#docker run -p 44567 --name webapp --link redis:db -it addictions/webapp /bin/bash // --link表示从addictions/webapp这个容器中连接redis这个容器, 相互之间可以进行通信,redis容器可以不用指定开放端口。--link 接收两个参数第一个容器名, 第二个是容器的别名这里将redis的别名设置为db。
#docker run -p 44567 --name webapp --add-host=docker:10.0.0.1 addictions/webapp // --add-host 表示在容器/etc/hosts文件中添加一条名为docker , IP地址为10.0.0.1的宿主机记录。
#