Docker

12-19 898 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 savedocker 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 指定跟踪一个目标网站(目前支持 GithubBitBucket )上的项目,一旦项目发现新的提交,则自动执行创建。

要配置自动创建,步骤如下:

  • 创建并登录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 创建容器

基本结构

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

欢迎留言