docker 随笔

docker 学习笔记

docker镜像

  • 获取

    docker pull

    docker pull +(仓库:标签)
    docker pull registry.hub.docker.com/ubuntu:12.04
    docker pull dl.dockerpool.com:5000/ubuntu:12.04

  • 查看

    docker images


    REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
    仓库 标记 镜像ID号 创建时间 镜像大小

  • 创建1

    docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2

    -m 来指定提交的说明信息,跟我们使用的版本控制工具一样;
    -a 可以指定更新的用户信息;
    0b2616b0e5a8 是用来创建镜像的容器的 ID;
    ouruser/sinatra:v2 指定目标镜像的仓库名和 tag 信息。
    创建成功后会返回这个镜像的 ID 信息。

  • 创建2

    使用Dockerfile

    docker build -t="ouruser/sinatra:v2" .
    -t 标记来添加 tag,指定新的镜像的用户信息。
    “.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。

  • 创建3

    docker import

    cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04

  • 标签

    docker tag

    docker tag 5db5f8471261 ouruser/sinatra:devel

  • 载入与存出

    docker save

    docker save -o ubuntu_14.04.tar ubuntu:14.04

    docker load

    docker load --input ubuntu_14.04.tar
    docker load < ubuntu_14.04.tar

  • 上传

    docker push

    docker push ouruser/sinatra

  • 运行

    docker run

    docker run -t -i ubuntu:12.04 /bin/bash

  • 移除

    docker rmi

    docker rmi training/sinatra
    在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器

docker容器

  • 启动
    docker run

    docker run ubuntu:14.04 /bin/echo 'Hello world'
    docker run -t -i ubuntu:14.04 /bin/bash
    -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
    -i 则让容器的标准输入保持打开

    docker start

    docker start +容器的id或name
    启动一个停止状态的容器

    docker restart

    docker restart + 容器ID
    重启一个运行状态的容器

  • 后台运行(守护态运行)
    docker run -d +.....

    docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

  • 查看容器
    docker ps

    docker ps -a
    停止的容器也会列出
    docker ps -q
    只列出容器的id

    docker inspect

    列出容器的所有信息

    docker logs

    获取容器的输出信息

  • 进入容器
    docker attach

    docker run -d -it ubuntu:14.04
    docker attach +容器name

    nsenter 命令


    $ sudo docker run -idt ubuntu
    243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
    $ sudo docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
    $ PID=$(docker-pid 243c32535da7)
    10981
    $ sudo nsenter --target 10981 --mount --uts --ipc --net --pid
    root@243c32535da7:/#

.bashrc_docker
使用方法http://dockerpool.com/static/books/docker_practice/container/enter.html

  • 导入导出容器
    docker export

    docker export 7691a814370e > ubuntu.tar
    导出容器快照到本地文件

    docker import

    cat ubuntu.tar | sudo docker import - test/buntu:v1.0
    docker import http://example.com/exampleimage.tgz example/imagerepo

  • 停止容器
    docker stop

    docker stop +容器ID

  • 删除容器
    docker rm

    docker rm trusting_newton
    docker rm -f +容器name
    强制删除运行中的容器

docker仓库

  • 私有仓库
  • 公有仓库

docker数据卷

  • 创建
    使用 -v 标记来创建一个数据卷并挂载到容器里

    docker run -d -P --name web -v /webapp training/webapp python app.py
    一次 run 中多次使用可以挂载多个数据卷
    创建一个 web 容器,并加载一个数据卷到容器的 /webapp 目录
    *Dockerfile 中使用 VOLUME 来添加一个或者多个新的卷到由该镜像创建的任意容器

  • 挂载
    使用 -v 标记指定挂载一个本地主机的目录到容器中去

    docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
    上面的命令加载主机的 /src/webapp 目录到容器的 /opt/webapp 目录

    .

    docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

    -P是指随机映射一个 49000~49900 的端口到内部容器开放的网络端口
    Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读

    -v 标记也可以从主机挂载单个文件到容器中

    docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
    这样就可以记录在容器输入过的命令了
    *注意:如果直接挂载一个文件,会导致报错误信息。最简单的办法就直接挂载文件的父目录

  • 数据卷容器
    一些持续更新的数据需要在容器之间共享,最好创建数据卷容器
    数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的

    docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

    -d:后台运行
    --name:容器命名
    -v:挂载目录作为数据卷"/dbdata"

    在其他容器中使用 --volumes-from 来挂载 dbdata 容器中的数据卷

    docker run -d --volumes-from dbdata --name db1 training/postgres
    docker run -d --volumes-from dbdata --name db2 training/postgres
    docker run -d --volumes-from db1 --name db3 training/postgres

  • 备份迁移恢复
    备份

    docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

    --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从本地主机挂载当前到容器的 /backup 目录
    容器启动后,使用了 tar 命令来将 dbdata 卷备份为本地的 /backup/backup.tar

    恢复

    docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
    docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

docker网络

  • 外部访问
    外部访问容器中运行的网络应用,可以通过 -P 或 -p 参数来指定端口映射。
    当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。

    docker run -d -P training/webapp python app.py

    使用-p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。

    docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
    docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
    docker run -d -p 127.0.0.1::5000 training/webapp python app.py
    docker run -d -p 5000:5000 training/webapp python app.py

    三种-p格式:
    ip:hostPort:containerPort //指定映射使用一个特定地址//映射到指定地址的指定端口
    ip::containerPort //绑定 localhost 的任意端口到容器的 5000 端口//映射到指定地址的任意端口
    hostPort:containerPort //本地的 5000 端口映射到容器的 5000 端口//映射所有接口地址

    查看端口配置

    docker port nostalgic_morse 5000

    容器有自己的内部网络和 ip 地址

    docker inspect 可以获取所有的变量

    -p 标记可以多次使用来绑定多个端口

    docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py

  • 容器互访问

    使用 --link 参数可以让容器之间安全的进行交互

    --link 参数的格式为 --link name:alias,其中 name 是要链接的容器的名称,alias 是这个连接的别名

    举例

    docker run -d --name db training/postgres
    在启动 db 容器的时候并没有使用 -p 和 -P 标记,从而避免了暴露数据库端口到外部网络上
    docker run -d -P --name web --link db:db training/webapp python app.py
    此时,db 容器和 web 容器建立互联关系

    使用 env 命令来查看 web 容器的环境变量

    docker run --rm --name web2 --link db:db training/webapp env
    . . .
    DB_NAME=/web2/db
    DB_PORT=tcp://172.17.0.5:5432
    DB_PORT_5000_TCP=tcp://172.17.0.5:5432
    DB_PORT_5000_TCP_PROTO=tcp
    DB_PORT_5000_TCP_PORT=5432
    DB_PORT_5000_TCP_ADDR=172.17.0.5
    . . .

    除了环境变量,Docker 还添加 host 信息到父容器的 /etc/hosts 的文件

    docker run -t -i --rm --link db:db training/webapp /bin/bash

    root@aed84ee21bde:/opt/webapp# cat /etc/hosts
    172.17.0.7 aed84ee21bde //web 容器的 ip 和主机名
    . . .
    172.17.0.5 db //db 容器的 ip 和主机名

    .

    用户可以链接多个子容器到父容器,比如可以链接多个 web 到 db 容器上

你可能感兴趣的:(docker 随笔)