参考书籍 Docker —— 从入门到实践
本文只记录重要步骤,更详细的内容请在原书中查看
安装
Ubuntu、Debian 系列安装 Docker
尽量使用最新的发行版,本文使用的版本为Ubuntu Xenial 16.04 (LTS)
使用脚本自动安装
Docker 官方为了简化安装流程,提供了一套安装脚本,Ubuntu 和 Debian 系统可以使用这套脚本安装:
curl -sSL https://get.docker.com/ | sh
执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 安装在系统中。
不过,由于伟大的墙的原因,在国内使用这个脚本可能会出现下载出错的情况。
本文使用的是 DaoCloud 提供的安装脚本
DaoCloud 提供的安装脚本 curl -sSL https://get.daocloud.io/docker | sh
启动 Docker 引擎
$ sudo systemctl enable docker
$ sudo systemctl start docker
建立 docker 用户组
默认情况下,docker命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
建立 docker
组:
$ sudo groupadd docker
将当前用户加入 docker
组:
$ sudo usermod -aG docker $USER
镜像加速器
国内访问 Docker Hub 有时会遇到困难,此时可以配置镜像加速器。
本文使用 DaoCloud 提供的加速器
输入如下命令:
$ sudo curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s 服务提供商分配给你的地址
例如: http://4e76bd89.m.daocloud.io
然后重启 docker
服务即可
$ sudo systemctl restart docker.service
镜像
获取镜像
获取镜像的命令是 docker pull
格式为:
$ sudo docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
- Docker Registry地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
- 仓库名:如之前所说,这里的仓库名是两段式名称,既 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
例如:
$ sudo docker pull ubuntu:14.04
上面的命令中没有给出 Docker Registry 地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:14.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 14.04 的镜像。
运行
有了镜像后,我们就可以以这个镜像为基础启动一个容器来运行。以上面的 ubuntu:14.04
为例,如果我们打算启动里面的 bash
并且进行交互式操作的话,可以执行下面的命令。
$ sudo docker run -it --rm ubuntu:14.04 bash
root@08ce449494db:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.5 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.5 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
root@08ce449494db:/# exit
exit
$
docker run
是运行容器的命令
-
-it
:这是两个参数,一个是-i
:交互式操作,一个是-t
终端。我们这里打算进入bash
执行一些命令并查看返回结果,因此我们需要交互式终端。 -
--rm
:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动docker rm
。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用--rm
可以避免浪费空间。 -
ubuntu:14.04
:这是指用ubuntu:14.04
镜像为基础来启动容器。 -
bash
:放在镜像名后的是命令,这里我们希望有个交互式Shell
,因此用的是bash
。
进入容器后,我们可以在 Shell
下操作,执行任何所需的命令。这里,我们执行了 cat /etc/os-release
,这是 Linux
常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 Ubuntu 14.04.5 LTS
系统。
最后我们通过 exit
退出了这个容器。
列出镜像
要想列出已经下载下来的镜像,可以使用 docker images
命令。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 f49eec89601e 12 days ago 129 MB
ubuntu latest f49eec89601e 12 days ago 129 MB
ubuntu 14.04 b969ab9f929b 12 days ago 188 MB
列表包含了仓库名、标签、镜像 ID、创建时间以及所占用的空间。
镜像 ID 是镜像的唯一标识,一个镜像可以对应多个标签。因此,在上面的例子中,我们可以看到 ubuntu:16.04
和 ubuntu:latest
拥有相同的 ID,因为它们对应的是同一个镜像。
列出部分镜像
不加任何参数的情况下,docker images
会列出所有顶级镜像,但是有时候我们只希望列出部分镜像。docker images
有好几个参数可以帮助做到这个事情。
根据仓库名列出镜像
$ sudo docker images ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 f49eec89601e 12 days ago 129 MB
ubuntu latest f49eec89601e 12 days ago 129 MB
ubuntu 14.04 b969ab9f929b 12 days ago 188 MB
列出特定的某个镜像,也就是说指定仓库名和标签
$ sudo docker images ubuntu:16.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 f49eec89601e 12 days ago 129 MB
除此以外,docker images
还支持强大的过滤器参数 --filter
,或者简写 -f
。比如,我们希望看到在 ubuntu:14.04
之后建立的镜像,可以用下面的命令:
$ sudo docker images -f since=ubuntu:14.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 f49eec89601e 12 days ago 129 MB
ubuntu latest f49eec89601e 12 days ago 129 MB
想查看某个位置之前的镜像也可以,只需要把 since
换成 before
即可。
以特定格式显示
默认情况下,docker images
会输出一个完整的表格,但是我们并非所有时候都会需要这些内容。比如,我们需要利用 docker images
把所有镜像的 ID 列出来,然后交给 docker rmi
命令作为参数来删除指定的这些镜像,这个时候就用到了 -q
参数。
$ sudo docker images -q
f49eec89601e
f49eec89601e
b969ab9f929b
利用 commit 理解镜像构成(预留)
此处先省略一万字_
............................................................
使用 Dockerfile 定制镜像
临时内容:
Dockerfile 中有 CMD 时,容器启动时则执行该 CMD,如果在启动时加入参数则会覆盖掉原来的 CMD,如果 Dockerfile 中有 ENTRYPOINT,则 CMD 作为参数传递给 ENTRYPOINT。
Dockerfile:
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
CMD [ "curl", "-s", "http://ip.cn" ]
$ docker run myip // 此时容器内执行的是命令 curl -s http://ip.cn
$ docker run myip echo "Hello" // 此时容器内执行的是命令 echo "Hello",CMD 被覆盖了