12-19 899 views
Docker
安装 Docker
简单的说,docker 就是 virtualbox + git + github
Ubuntu
Linux 系统对 Docker 的支持最好,在软件源中已经自带了,可以直接安装:
sudo apt-get update
sudo apt-get install -y docker.io
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
也可以通过官方源安装最新版本
sudu apt-get install apt-transport-https
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7
CentOS
对于CentOS 6系统,可以使用EPEL库安装Docker,命令如下:
sudo yum install -y http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
sudo yum install -y docker-io
对于CentOS 7系统,CentOS-Extras源中已经内置Docker,读者可以直接使用yum命令进行安装:
sudo yum install -y docker
Windows
直接在官网下载Docker for Windows Installer.exe 进行安装。
注意:这将和Windows上的虚拟机产生冲突,导致虚拟机无法使用。
MacOS
直接在官网下载安装包进行安装
镜像
获取镜像
sudo docker pull ubuntu
默认获取的是ubuntu:latest版本,如需指定版本,例如14.04:
sudo docker pull ubuntu:14.04
以上获取的是官方镜像,如果要获取其他服务器的镜像,如DockerPool社区:
sudo docker pull dl.dockerpool.com:5000/ubuntu
sudo docker pull dl.dockerpoll.com:5000/ubuntu:14.04
运行镜像
-d 表示后台运行
-t 让 Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-i 让容器的标准输入保持打开
sudo docker run -t -i ubuntu:14.04
查看镜像列表
sudo docker images
查看镜像详细信息
sudo docker inspect 5506de2b565896
sudo docker
搜寻镜像
使用 docker search 命令可以搜索远端仓库中共享的镜像。
--automated=false 仅显示自动创建的镜像
--no-trunc=false输出信息不截断显示
-s, --starts=0 指定仅显示评价为指定星级以上的镜像
例如,搜索带 mysql 关键字的镜像如下所示:
sudo docker search mysql
删除镜像
使用 docker rmi 命令可以删除镜像,可以指定标签删除,也可以指定 ID 删除
sudo docker rmi dl.dockerpool.com:5000/ubuntu
假设本地存在一个标签为mysql:latest 的镜像, 且没有额外的标签指向它, 执行docker rmi 命令, 可以看出它会删除这个镜像文件的所有AUFS层:
sudo docker rmi mysql:latest
如果镜像正在运行,那么无法删除该镜像,使用-f 强制删除
sudo docker rmi -f ubuntu
这样会产生一个标签为<none> 的临时镜像,原来强制删除的镜像换了新的ID继续存在系统中。
创建镜像
- 基于已有镜像的容器创建
该方法主要使用 docker commit 命令,其命令格式为 docker commit [OPTIONS] CONTAINER [PEPOSITORY[:TAG]] ,主要选项包括:
-a, --author="" 作者信息
-m, --message="" 提交消息
-p, --pause=true 提交时暂停容器运行。
下面演示如何创建一个新镜像。首先,启动一个镜像,并在其中进行修改操作,例如创建一个test文件,之后退出:
sudo docker run -ti ubuntu:14.04 /bin/bash
root@c4b786b4edfa:~# touch test
root@c4b786b4edfa:~# exit
记住容器的ID为 c4b786b4edfa 。
docker commit -m "Add a new file" -a "Docker Newbee" 00fd29ccc6f1 test
sha256:603130dc6a9fdd73b9f5bd9f1b6a7c06d1d588ff0b32bd82b0f516fd520be5fe
此时查看本地镜像列表,即可看到新创建的镜像 test
- 基于本地模板导入
也可以直接从一个操作系统模板文件导入一个镜像。推荐使用 OpenVZ 提供的模板来创建。OpenVZ模板下载地址
比如下载一个 Ubuntu-14.04 的模板压缩包后, 可以使用以下命令导入:
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
-
基于Dockerfile创建
...
存出和载入镜像
可以使用 docker save 和 docker load 命令来存出和载入镜像文件
- 存储镜像
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
上传镜像
sudo docker tag test:latest user/test:latest
sudo docker push user/test:latest
容器
创建容器
使用 docker create 命令新建一个容器,例如:
sudo docker create -it ubuntu:latest
sudo docker ps -a
使用 docker create 命令新建的容器处于停滞状态,可以使用 docker start 命令来启动它
新建并启动容器
sudo docker run ubuntu /bin/echo 'Hello World'
Hello World
-d 表示后台运行
-t 让 Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-i 让容器的标准输入保持打开
sudo docker run -t -i ubuntu:14.04 /bin/bash
通过按 Ctrl+d 或输入 exit 命令来退出容器:
守护态运行
通过添加 -d 参数来实现后台运行容器:
sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
7b71993c34a1c4cf9e7eef93806694bb196918e239b0aff397a52c71ef8ccde3
查看容器输出信息:
sudo docker logs 7b7
hello world
hello world
hello world
...
终止容器
使用 docker stop 命令来终止一个容器,它会首先向容器发送SIGTERM信号,等待一段时间后(默认为10秒),再发送SIGKILL信号终止容器
-t, --time=10
sudo docker stop 7b7
注意: docker kill 命令直接发送 SIGKILL 信号来强行终止容器
重启容器
sudo docker restart 7b7
进入容器
sudo docker attach 7b7
exec 命令
Docker 自1.3版本起,提供了一个更加方便的工具exec,可以直接在容器内运行命令。例如进入到刚创建的容器中,并启动一个bash:
sudo docker exec -ti 243c32535da7 /bin/bash
root@243c32535da7:/#
nsenter 工具
nsenter工具在util-linux包 2.23 版本后包含。如果系统中util-linux包没有该命令,可以按照下面的方法从源码安装:
$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure --without-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin
为了使用 nsenter 连接到容器,还需要找到容器的进程的PID ,可以通过下面的命令获取:
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
通过这个PID,就可以连接到这个容器:
nsenter --target $PID --mount --uts --ipc --net --pid
删除容器
使用 docker rm 命令删除处于终止状态的容器,命令格式为 docker rm [OPTIONS] CONTAINER [CONTAINER...] 支持的选项包括:
-f, --force=false 强制终止并删除一个运行中的容器
-l, --link=false 删除容器的连接,但保留容器
-v, --volumes=false 删除容器挂载的数据卷
例如,查看处于终止状态的容器并删除如下所示:
sudo docker ps -a
7b71993c34a1 ubuntu "/bin/sh -c 'while..." 13 hours ago Exited (137) 13 hours ago youthful_swanson
sudo docker rm 7b71993c34a1
导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用 docker export 命令,命令格式为 docker export CONTAINER
sudo docker ps -a
sudo docker export ce5 > test_for_run.tar
导入镜像
cat test_for_run.tar | sudo docker import - test/ubuntu:v1.0
sudo docker images
仓库
Docker Hub
目前 Docker 官方维护了一个公共仓库 https://hub.docker.com
基本操作
docker login 用于输入用户名、密码和邮箱来完成注册和登录。注册成功后,本地用户目录的 .dockercfg 中将保存用户的认证信息。
docker search 查找官方仓库中的镜像
docker pull 将镜像下载到本地
自动创建
有时候,用户创建了镜像,安装了某个软件,如果软件发布新版本则需要手动更新镜像。自动创建功能使得用户通过Docker Hub 指定跟踪一个目标网站(目前支持 Github 或 BitBucket )上的项目,一旦项目发现新的提交,则自动执行创建。
要配置自动创建,步骤如下:
- 创建并登录Docker Hub,以及目标网站;* 在目标网站中链接帐户到Docker Hub。
- 在Docker Hub中配置一个自动创建
- 选取一个目标网站中的项目(需要含Dockerfile)和分支。
- 指定Dockerfile的位置,并提交创建。
之后可以在Docker Hub的自动创建页面中跟踪每次创建的状态。
Docker Pool
数据管理
在使用 Docker 过程中,产生的数据,或者需要多个 Docker 容器之间共享数据,就需要数据管理。
容器中管理数据主要有两种方式:
- 数据卷(Data Volumes)
- 数据卷容器(Data Volume Dontainers)
数据卷
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 卷会一直存在,直到没有容器使用
数据卷的使用,类似于Linux下对目录或文件进行mount操作。
在用 docker run 命令的时候,使用 -v 标记可以在容器内创建一个数据卷。多次使用 -v 标记可以创建多个数据卷。
sudo docker run -d -P --name web -v /webapp training/webapp python app.py
将主机的 /src/webapp 目录挂载到容器的 /opt/webapp 目录:
sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
-v 标记也可以从主机挂载单个文件到容器作为数据卷:
sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
这样就可以记录在容器输入过的命令历史了。
如果直接挂载一个文件到容器,使用文件编辑工具,包括
vi或者sed --in-place的时候,可能会造成文件inode的改变,从 Docker 1.1.0 起,这会导致报错误信息。所以推荐的方式是只鹅接挂载文件所在的目录。
数据卷容器
用于在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
TODO
网络基本配置
使用 Dockerfile 创建容器
基本结构
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令