核心概念与安装配置

核心概念与安装配置

核心概念与安装配置

核心概念

docker镜像

docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模版。

例如,一个镜像可以包含一个基本的操作系统环境,里面仅安装了了apache应用程序(或用户小的其他软件)。可以把它称为一个apach镜像。

镜像是docker容器的基础。

docker容器

docker容器类似于一个轻量级的沙箱,docker利用容器来运行和隔离应用。

容器是从镜像创建的应用运行实例。它可以启动、开始、停止、删除,而这些容器都是批次相互隔离、互不可见的。

可以把容器看作一个简易版的linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。

注意:

镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。

docker仓库

docker仓库类似于代码仓库,是docker集中存放镜像文件的场所。

安装docker引擎

CentOS 7 (使用yum进行安装)

1
2
3
4
5
6
7
8
9
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

安装校验

1
docker version
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Client:
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:48:22 2018
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:19:08 2018
OS/Arch: linux/amd64
Experimental: false

使用Docker镜像

获取镜像

centos7将docker的仓库改为aliyun的镜像仓库

1
vi /etc/docker/daemon.json

可以访问阿里云https://cr.console.aliyun.com/cn-hangzhou/mirrors
登录后获取自己专有的镜像地址

1
2
3
4
5
{
"registry-mirrors": [
"https://xxxxx.mirror.aliyuncs.com"
]
}

例如,获取最新的ubuntu

1
docker pull ubuntu
1
2
3
4
5
6
7
8
Using default tag: latest
latest: Pulling from library/ubuntu
84ed7d2f608f: Pull complete
be2bf1c4a48d: Pull complete
a5bdc6303093: Pull complete
e9055237d68d: Pull complete
Digest: sha256:e332017e64d6fef478aac815f9487b27345c2a96972bde690b7645b5d9545a76
Status: Downloaded newer image for ubuntu:latest

也可以指定标签:

1
docker[image]pull NAME[: TAG]
1
docker pull ubuntu:18.04

使用该镜像:例如利用该镜像创建一个容器,在其中运行bash应用,执行打印”Hello World”命令:

1
docker run -it ubuntu bash
1
2
3
4
root@e01bd591cf54:/# echo "Hello World"
Hello World
root@e01bd591cf54:/# exit
exit

查看镜像信息

使用images命令列出镜像

1
docker images
1
docker image ls
1
2
3
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 1d9c17228a9e 9 hours ago 86.7MB
centos latest 1e1148e4cc2c 3 weeks ago 202MB

在列出信息中,可以看到几个字段信息:

  • 来自于哪个仓库,比如ubuntu表示ubuntu系列的基础镜像
  • 镜像的标签信息,比如latest表示不同的版本信息。标签只是标记,并不能表示镜像内容;
  • 镜像的ID(唯一表示镜像),如果两个镜像的ID相同,说明它们实际上指向了同一个镜像,只是具有不同标签名称而已;
  • 创建时间,说明镜像最后的更新时间;
  • 镜像大小,优秀的镜像往往体积都较小。
    其中镜像的ID信息十分重要,它唯一标识了镜像。在使用镜像ID的时候,一般可以使用该ID的前若干个字符组成的可区分串来替代完成的ID.

使用tag命令添加镜像标签

1
docker tag ubuntu:latest myubuntu:latest

再次使用docker images列出本地主机上镜像信息,可以看到多了一个myubuntu:latest标签的镜像

1
docker images
1
2
3
4
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu latest 1d9c17228a9e 4 days ago 86.7MB
ubuntu latest 1d9c17228a9e 4 days ago 86.7MB
centos latest 1e1148e4cc2c 3 weeks ago 202MB

myubuntu:latest镜像的ID跟ubuntu:latest是完全一致的,它们实际上指向了同一个镜像文件,只是别名不同而已。docker tag命令添加的标签实际上起到了类似链接作用。

使用inspect命令查看详细信息

1
docker inspect ubuntu:latest
1
2
3
4
5
6
7
8
9
10
11
12
13
[
{
"Id": "sha256:1d9c17228a9e80a0a23927f24f3cf17d012cf0bb3eae5e3541a8c6987ab9bd5a",
"RepoTags": [
"myubuntu:latest",
"ubuntu:latest"
],
"RepoDigests": [
"ubuntu@sha256:e332017e64d6fef478aac815f9487b27345c2a96972bde690b7645b5d9545a76"
],
"Parent": "",
"Comment": "",
......

可以使用-f来指定其中一项内容

1
docker inspect -f {{".Architecture"}} ubuntu:latest
1
amd64

使用history命令查看镜像历史

1
docker history ubuntu:latest
1
2
3
4
5
6
IMAGE CREATED CREATED BY SIZE COMMENT
1d9c17228a9e 4 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 4 days ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 4 days ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B
<missing> 4 days ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B
<missing> 4 days ago /bin/sh -c #(nop) ADD file:c0f17c7189fc11b6a… 86.7MB

使用–no-trunc选项来输出完整命令

1
docker history --no-trunc ubuntu:latest

搜寻镜像

1
docker search --filter=is-official=true nginx
1
2
3
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 10654 [OK]
kong Open-source Microservice & API Management la… 272 [OK]

删除和清理镜像

使用标签删除镜像

1
2
docker rmi myubuntu:latest
Untagged: myubuntu:latest

使用镜像ID来删除镜像

1
2
docker run ubuntu:latest echo 'hello! I am here!'
docker ps -a
1
2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f87667367e0 ubuntu:latest "echo 'hello! I am h…" 12 seconds ago Exited (0) 11 seconds ago admiring_tesla
1
docker rmi ubuntu:latest
1
Error response from daemon: conflict: unable to remove repository reference "ubuntu:latest" (must force) - container 5f87667367e0 is using its referenced image 1d9c17228a9e

可以使用-f强制删除,但是不建议

1
docker rmi -f ubuntu:latest

正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。

首先删除容器5f87667367e0:

1
2
docker rm 5f87667367e0
5f87667367e0

然后使用ID来删除镜像

1
docker rmi 1d9c17228a9e
1
2
3
4
5
6
7
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:868fd30a0e47b8d8ac485df174795b5e2fe8a6c8f056cc707b232d65b8a1ab68
Deleted: sha256:1d9c17228a9e80a0a23927f24f3cf17d012cf0bb3eae5e3541a8c6987ab9bd5a
Deleted: sha256:3288cd6e6e7d42bcb4a74121b412c42a11f96da52685e42dbf9de6a747a55c6b
Deleted: sha256:b1636589630239bdb9153f95ac564bcd2afd9202aaf8511cbf5a9a37e03daf35
Deleted: sha256:043f492f40c539cfe7cee4cb8aae00ed1d5b19e864fbe6ea35ec92a2333bacc4
Deleted: sha256:2fb7bfc6145d0ad40334f1802707c2e2390bdcfc16ca636d9ed8a56c1101f5b9

清理镜像

1
2
docker image prune -f
Total reclaimed space: 0B

创建镜像

基于已有容器创建

1
2
docker commit -m "added a new file" -a "Docker Newbee" 8b6b42f7bc1b test:0.1
sha256:6715dd8c7c663f1f3550ac28387bd6eea05c88ba31bace4d517220a5f4edd456
1
2
3
4
5
6
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 6715dd8c7c66 10 seconds ago 86.7MB
ubuntu latest 1d9c17228a9e 5 days ago 86.7MB
centos latest 1e1148e4cc2c 4 weeks ago 202MB

基于本地模版导入

1
2
3
wget https://download.openvz.org/template/precreated/ubuntu-16.04-x86_64.tar.gz
cat ubuntu-16.04-x86_64.tar.gz | docker import - ubuntu:16.04
sha256:45dcf646f3e56e3c5f134d2d6c7b88c408663301fd23c6de12b684e1b9c1ca57
1
2
3
4
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 45dcf646f3e5 About a minute ago 505MB

基于Dockerfile创建