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
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 rundocker 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 psdocker ps -a
停止的容器也会列出
docker ps -q
只列出容器的iddocker inspect
列出容器的所有信息
docker logs
获取容器的输出信息
进入容器
docker attachdocker run -d -it ubuntu:14.04
docker attach +容器namensenter 命令
$ 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 exportdocker 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 stopdocker stop +容器ID
删除容器
docker rmdocker 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 容器上