Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 –百度百科
Docker 结构如下
其核心就是利用LXC来实现类似虚拟机的功能从而更高效利用硬件资源。
docker ispect docker_container_id
安装
- 安装Docker
本文主要针对Mac安装,Windows和Linux类似。
- 检查系统版本
要安装Docker Toolbox需要OSX版本>=10.8 “Mountain Lion”, 查看方法是
点击左上角苹果图标->About this Mac
如果系统不符合要求请先更新系统。
- 获取安装文件
- 双击打开安装镜像,安装向导会显示将要安装的程序列表
按下’Continue‘之后将会提供自定义安装选项,你可以选择安装哪些程序:
建议全部安装。
点击
Install
并输入密码将会开始安装。 - 安装完成
其中,Docker Quickstart Terminal相当于通过终端进入docker的快捷方式,省去了登录等操作,Kitematic是Docker的图形化界面,可以可视化地从Docker Hub下载镜像并直接使用。下面都以命令行为界面
- 检查系统版本
基本操作
- 安装image
sudo docker pull ubuntu:12.04
等价于
sudo docker pull registery.hub.docker.com/ubuntu:12.04
即从默认仓库下载;但是,有时官方仓库下载较慢,可以使用下面的命令指定仓库:
sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04
- docker run常用参数
- ‘-i’:Keep STDIN open even if not attached
- ‘-t’:Allocate a pseudo-tty分配一个控制台同容器交互
对于执行容器内的交互式操作,例如shell脚本。我们必须使用 -i -t来申请一个控制台同容器进行数据交互。但是当通过管道同容器进行交互时,就不能使用-t. 例如下面的命令
echo test | docker run -i busybox cat
- ‘-d’ 使容器在后台模式(detached mode)运行,当前终端窗口不再被容器监听,可以使用docker attach来重新挂载
--rm
:容器终止后会立即删除- ‘-a=[]’指定容器挂载哪些流(‘STDIN’,’STDOUT’,’STDERR’)不带这个参数时全部挂载
- ‘–name’:给容器命名
docker run –name wei -itd busybox
- ’-a’ 列出所有容器
- ‘-q’列出所有进程的CONTAINER ID,
- 作用:比如杀死所有进程
docker kill $(docker ps -q)
- 修改已有镜像
- 先使用下载的镜像启动容器
sudo docker run -it training/sinatra /bin/bash
记住容易id,在容器中添加json和gem两个应用
[email protected]:/#: gem install json
使用exit退出后提交更新后的副本
sudo docker commit -m “Add json gem” -a “Docker Newbee” 0b2616b0e5a8 ouruser/sinatra:test
‘-m’参数说明信息,’-a’指定更新的用户信息,之后是用来创建镜像的容器id,最后指定目标镜像仓库名和tag信息,创建后回返回这个镜像的id
- 使用Dockerfile创建镜像
- 新建目录和Dockerfile
mkdirsinatra cd sinatra
$ touch Dockerfile
- Dockerfile中每条指定都创建镜像的一层,最多127层
# This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee [email protected]# 作者
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem intall sinatra
# put my local web site in myApp folder to /var/www
ADD myApp /var/WWW
# expose httpd port
EXPOSE 80
# the command to run
CMD [“/usr/sbin/appachectl”, “-D”, “FOREGROUND”]
- build 生成镜像
sudo docker build -t=”ouruser/sinatra:v2”
‘-t’标记添加tag,指定新的镜像的用户信息
- 用新的镜像启动容器
sudo docker run -it ouruser/sinatra:v2 /bin/bash
docker tag 5db5f8471261 ouruser/sinatra:devel
更改镜像标签
- 上传镜像
sudo docker push ouruser/sinatra
- 存出和载入
- 存出
sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
- 载入
sudo docker load –input ubuntu_14.04.tar
或
sudo docker load < ubuntu_14.04.tar
- 移除
docker rmi training/sinatra
注意:在删除镜像之前应该先
docker rm
掉依赖于该镜像的所有容器
- 新建并启动:docker run
sudo docker run -it ubuntu:14.04 /bin/bash
启动一个bash终端,允许用户进行交互
- 启动已终止程序:docker start
- 守护态运行:’-d’
获取容器的输出信息:
sudo docker logs insane_babbage
进入守护态容器:
docker attach container_name
- 终止容器:
docker stop container_name
重新启动容器:
docker start container_name
重启容器:
docker restart container_name
会将运行态的容器终止再重新启动
- 导出和导入容器
- 导出容器快照到本地:
docker export container_id > container_name.tar
- 从本地快照导入容器:
docker import container_path example/imagerepo
- 导出容器快照到本地:
- 删除容器
docker rm container_id
删除前容器需停止
- 登录:
docker login
输入用户名和密码后,认证信息保存在本地用户目录的
.dockercfg
文件中 - 基本操作
- 搜索镜像:
docker search centos
- 下载镜像
docker pull centos
- 上传镜像
docker push image_name
- 自动创建 略
- 搜索镜像:
- 私有仓库
略
- 两种方式:
- 数据卷 (Data Volumes)
- 数据卷容器(Data volumes container)
- 数据卷可以在容器间共享
- 对数据卷的修改会立刻生效
- 对数据卷的更新不会影响镜像
- 卷会一直存在,直到没有容器使用它
在使用docker run
命令的时使用 -v
参数创建并挂载数据卷到容器里。在一次run中可以多次使用以挂载多个数据卷
docker run -d -P –name web -v /webapp training/webapp python app.py
注意:可以在Dockerfile中使用VOLUME
来添加一个或多个新的卷到该镜像创建的容器中。
docker run -d -P –name web -v /src/webapp:/opt/webapp python app.py
将主机的/src/webapp
目录挂载到容器中得/opt/wepapp
最后加上:ro
挂载为只读
Dockerfile不支持这个用法
略
如果有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器,数据卷容器是用来专门提供数据卷供其他容器使用的容器。
docker run -d -v /dbdata –name dbdata training/postgres echo Data-only Container
#挂载
docker run -d –volumes-from dbdata –name db1 training/postgres
如果删除了挂载的容器(dbdata, db1)数据卷不会被自动删除,需要在删除最后一个还挂在着它的容器使用docker rm -v
docker run –volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar …
# 创建带有数据卷的容器dbdata2
docker run -v /dbdata –name dbdata2 ubuntu /bin/bash
# 创建另一个容器,挂载dbdata2容器,并使用untar解压备份文件到挂载的容器卷中
docker run –volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
- 外部访问容器
通过-P或-p参数来指定端口映射
-P
:随机映射一个49000-49900的端口到内部容器开放的网络端口-p
:指定端口,支持格式有ip:hostPort:containerPort|ip::containerPort|hostPort:containerPort
还可使用udp标记来指定udp端口-p 127.0.0.1:5000:5000/udp
- 使用
docker port
来查看当前映射的端口配置docker port nostalgic_morse 5000
127.0.0.1:49155
- 容器互联
#创建数据库容器
docker run -d –name db training /postgres
# 互联
docker run -d -P –name web –link db:db training/webapp python app.py
这样容器db和web容器建立互联关系,
--link
格式:--link name:alias
,name
是要链接的容器的名称,alias是这个链接的别名,连接的容器可以在docker ps
中查看到- 查看连接信息
- 环境变量
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
…
前缀采用大写的连接别名
- 父容器web2的
/etc/hoists
文件docker run -it –rm –link db:db training/webapp /bin/bash
# cat /etc/hosts
172.17.0.7 aed84ee21bde
…
172.17.0.5 db
这里有两个hosts,第一个是web容器,web容器用id作为它的主机名,第二个为db容器的ip和主机名, 可以使用
ping db
来测试web2和db容器的连接状况
- 网络结构
- 配置DNS
Docker通过向新建容器挂载3个相关配置文件使宿主主机DNS更新后所有容器dns通过
/etc/resolv.conf
文件立刻得到更新-h HOSTNAME | --hostname=HOSTNAME
指定容器的主机名,会被写到容器的/etc/hosts
和/etc/hostname
中--link=CONTAINER_NAME:ALIAS
:添加一个其他容器的主机名到/etc/hosts
中,让新容器的进程可以使用主机名ALIAS连接它dns=IP_ADDRESS
:让容器解析不在/etc/hosts
中的主机名dns-search=DOMAIN
:设定容器的搜索域
- 容器访问外部网络
容器访问外部网络需要本地转发支持,通过
sysctl net.ipv4.ip_forward(Mac: sysctl net.inet.ip.forwarding)
查看有没有开启转发,1为开启0为关闭,通过下述命令打开
sysctl -w net.ipv4.ip_forward=1(Mac:sysctl net.inet.ip.forwarding=1)