docker 常用命令笔记 · w3c-前端社区
一 : 容器的使用
- docker 服务开启
sudo service docker start
- 容器内运行一个应用程序
docker run ubuntu /bin/echo “hello world” 在 ubuntu镜像中输出helloworld (如果本地有对应地镜像,则会用本地镜像,如果没有,将会从仓库自动下载对应镜像执行指令)
- 运行容器交互
docker run -i -t ubuntu /bin/bash 与ubuntu镜像交互 -t在新容器制定一个终端 -i 允许你对容器内的标准输入进行交互
- 容器启动
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done",docker 后台启动(-d)一个ubuntu的容器,容器不断输出helloworld 返回一长传字符串 为容器地id 过后可以通过 docker ps 查看运行中的容器 找到容器的id和name 并通过docker logs id(or name)查看输出的hello
world
- 容器停止
docker stop id(or name)
- 运行一个web应用
docker run -d -P -p 5000:5000 training/webapp python app.py -d 让容器在后台运行 -P 将容器使用地网络端口映射到我们使用的主机上面
- 查看容器内部运行的进程 docker top id(or name)
-
docker inspect id (or name)查看一个容器的底层信息 返回容器地详细信息的一个json
-
docker stop id(or name)停止一个容器 docker rm id(or name)删除一个容器(必须处于停止状态)
- 进入容器交互
docker attach id
二:镜像的使用
- 查看docker镜像
docker images (本地镜像列表)
- 一个镜像可能会有多个标签 例如ubuntu 有14.04 15.04等多个tag 如果要使用指定的tag版本
docker run ubuntu:15.04 /bin/echo “hello world” 不指定地话会使用latest的版本
- 获取一个新的镜像 例如
docker pull ubuntu:13.10
- 搜索镜像 可以到docker hub 搜索 也可以使用docker search 命令 例如
docker search httpd
- 拖取镜像
docker pull httpd
- 创建一个新的镜像
- 从以及创建地容器中更新,并且提交这个改动后的镜像
- 使用Dockerfike指令来创建一个新的镜像
- 更新镜像
- 使用镜像创建一个容器
docker run -t -i ubuntu:15.10 /bin/bash
- 在容器的交互里使用
apt-get update 更新 之后输入exit退出容器
- 使用commit提交更新后的镜像
docker commit -m="has update" -a="root" name(or id) root/ubuntu:v2 -m 此次提交地描述信息 -a 指定镜像作者 id 容器id root/ubuntu:v2 指定要创建的目标镜像名 更新完后可以通过docker images来查看本地提交地新镜像 root/ubuntu:v2 并且可以用 docker run -t -i root/ubuntu:v2 /bin/bash来使用我们刚才更新地镜像创建一个容器
并且开启新容器地交互
- 构建镜像 命令为docker build
- 创建一个Dockerfile 写好创建规则
- 创建镜像
docker build -t root/ubuntu:0.0 .XXX -t 指定要创建地目标镜像名 .XXX Dockerfile 文件的所在目录 可以制定Dockerfile的绝对路径 创建成功后通过docker images 查看
- 设置镜像标签
docker tag id root/centos:dev 用户名称、镜像源名(repository name)和新的标签名(tag)
三: 容器的链接
- 网络端口映射 创建一个python应用的容器
docker run -d -P training/webapp python app.py
-p 5000:5000 -p是容器内部端口绑定到指定的主机端口。-P是容器内部端口随机映射到 主机的高端口。 另外,我们可以指定容器绑定的网络地址,比如绑定127.0.0.1。 例如 docker run -d -p 127.0.0.1:5001:5002 training/webapp python app.py 这样我们就可以通过访问本地地5001端口来访问容器地5002端口
- 我们可以通过--name来指定容器的名字
docker run -d -P --name lifei training/webapp python app.py 这样创建地容器名字就不是系统随机指定的了
Dockerfile 编写规范
- 虽然指令忽略大小写,但建议用大写 所有格式均为 指令+空格加参数
-
MAINTAINER 用来指定维护者的姓名和联系方式
-
FROM <image>/<image>:<tag> 设置基本的镜像,为后续的命令使用 应写在最顶部 例如 FROM ubuntu
-
RUN 这个会在上面from地镜像里执行命令,然后提交结果 提交后的镜像会在后面继续使用 RUN <command> (这个命令运行一个shell中 - '/bin/sh -c')或者RUN ["executable", "param1", "param2"] 这个RUN命令相当于在外面执行 docker run image_name command
-
CMD and ENTRYPOINT ,设置在容器启动时执行命令,ENTRYPOINT:表示镜像在初始化时需要执行的命令,不可被重写覆盖,CMD: 表示镜像运行默认参数 ENTRYPOINT/CMD都只能在文件中存在一次,并且最后一个生效 多个存在,只有最后一个生效,其它无效! 需要初始化运行多个命令,彼此之间可以使用 && 隔开,但最后一个须要为无限运行的命令,需切记!
-
USER 比如指定 memcached 的运行用户,可以使用上面的 ENTRYPOINT or CMD来实现: ENTRYPOINT ["memcached", "-u", "daemon"] 有更好的实现方式 ENTRYPOINT ["memcached"] USER daemon
-
EXPOSE 命令可以设置一个端口在运行的镜像中暴露在外,在docker使用--link来链接两容器时会用到相关端口
-
ENV 设置环境变更 使用此dockerfile生成的image新建container,可以通过 docker inspect CONTAINER ID
看到这个环境变量 也可以通过在docker run时设置或修改环境变量
-
ADD 从src复制文件到container的dest路径: ADD <src> <dest> <src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径, 也可以是一个远程的文件url <dest> 是container中的绝对路径
-
VOLUME 创建一个挂载点用于共享目录 如VOLUME ["/data"] docker run -it -v /home/lifei/PyProjects:/src/PyProjects -p 5000:5000 lifei/ubuntu:0.1 /bin/bash src为挂载点, 本地的PyProjects就挂载到docker 的PyProjects上 而共享目录
-
WORKDIR WORKDIR /path/to/workdir 配置RUN,CMD, ENTRYPOINT 命令设置当前工作路径 可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令 例如 WORKDIR /a WORKDIR b WORKDIR c RUN pwd 其实是在 /a/b/c 下执行 pwd