我的docker随笔2:docker在ubuntu上的安装

本文介绍Docker在linux系统的安装过程,由于笔者一直使用ubuntu系统,所以以此为使用平台,具体是ubuntu 16.04,64位系统。
docker这几年发展十分迅速,自去年(2017年)开始,docker基本上每个月都发行一个版本,之前的版本号是数字,现在已经改为年份+月份的形式,即YY.MM的形式。如笔者第一次安装docker的版本是17.09,即2017年9月份发布的版本。写这个文章时,已经到了18.04版本,——而18.05-dev也在开发中了。docker有2个版本:docker-ce(社区版,Docker Community Edition)、docker-ee(企业版,Docker Enterprise Edition),我们一般使用docker-ce即可满足大部分应用场合。

最简单方案方式

ubuntu仓库已经有了docker软件源,因此可以直接用apt-get命令安装。
1、更新源

1
sudo apt-get update

2、安装

1
sudo apt-get install docker.io

注意,这种方式安装的版本较低。笔者在安装这个命令安装时,版本号为1.13。

官方推荐安装方式

1、更新源

1
sudo apt-get update

2、设置apt可以通过https使用源

1
2
3
4
5
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
software-properties-common

3、添加docker官方的GPG key

1
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4、检查是添加的key是否正确。即检测是否有9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 指纹(fingerprint)

1
$ sudo apt-key fingerprint 0EBFCD88

本机输出:

1
2
3
4
pub   4096R/0EBFCD88 2017-02-22
Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) <docker@docker.com>
sub 4096R/F273FCD8 2017-02-22

5、添加stable仓库

1
2
3
4
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"

6、更新源

1
sudo apt-get update 

此时可查看有哪些版本可用:

1
2
3
4
5
6
7
8
9
10
11
12
sudu apt-cache madison docker-ce
docker-ce | 5:19.03.5~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 5:19.03.4~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 5:19.03.3~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 5:19.03.2~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 5:19.03.1~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 5:19.03.0~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 5:18.09.9~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 5:18.09.8~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 18.03.1~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 18.03.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages

7、安装docker:

1
sudo apt-get install docker-ce

可安装指定版本:

1
sudo apt-get install docker-ce=5:19.03.5~3-0~ubuntu-xenial

7、检测docker版本

1
2
# docker -v
Docker version 17.09.0-ce, build afdb6d4

看到版本号信息,说明已经成功安装了。

国内镜像安装

docker很多资源都在国外服务器,因此,访问时可能会比较慢(甚至无法访问),国内很多提供docker服务厂商拥有镜像资源,因此,如果无法按官方说明安装成功的话,那么可使用国内镜像安装,版本基本上都是最新的。
1、更新源

1
# apt-get update

安装curl:

1
# apt-get install curl -y

2、安装

1
# curl -sSL https://get.daocloud.io/docker | sh

输出信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Executing docker install script, commit: 490beaa
+ sh -c apt-get update -qq >/dev/null
+ sh -c apt-get install -y -qq apt-transport-https ca-certificates curl software-properties-common >/dev/null
+ sh -c curl -fsSL "https://download.docker.com/linux/ubuntu/gpg"; | apt-key add -qq - >/dev/null
+ sh -c echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial edge" > /etc/apt/sources.list.d/docker.list
+ [ ubuntu = debian ]
+ sh -c apt-get update -qq >/dev/null
+ sh -c apt-get install -y -qq docker-ce >/dev/null
+ sh -c docker version
Client:
Version: 17.10.0-ce
API version: 1.33
Go version: go1.8.3
Git commit: f4ffd25
Built: Tue Oct 17 19:04:16 2017
OS/Arch: linux/amd64
Server:
Version: 17.10.0-ce
API version: 1.33 (minimum version 1.12)
Go version: go1.8.3
Git commit: f4ffd25
Built: Tue Oct 17 19:02:56 2017
OS/Arch: linux/amd64
Experimental: false
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:
sudo usermod -aG docker your-user
Remember that you will have to log out and back in for this to take effect!
WARNING: Adding a user to the "docker" group will grant the ability to run
containers which can be used to obtain root privileges on the
docker host.
Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
for more information.

打印上述信息说明已经成功安装docker。

添加用户到docker组

如果使用普通用户执行docker命令,会出现错误,如下:

1
2
$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.32/containers/json: dial unix /var/run/docker.sock: connect: permission denied

这是因为普通用户权限不够造成的。先看一下出错信息/var/run/docker.sock文件的权限。

1
2
$ ll /var/run/docker.sock
srw-rw---- 1 root docker 0 Dec 23 15:12 /var/run/docker.sock=

该文件权限为root,所属docker组。因此,解决方法是将普通用户添加到docker组,命令如下:

1
2
sudo gpasswd -a ${USER} docker
sudo newgrp - docker

这样,在后续使用docker时,就不需要频繁切换到root用户了。

更改镜像文件存储路径

停止 docker 服务:

1
# systemctl stop docker

修改 /lib/systemd/system/docker.service 文件,在 ExecStart 命令后追加 --graph <目录>(注:默认没有该选项),示例:

1
ExecStart=/usr/bin/dockerd -H fd:// --graph /mnt/docker

重新加载配置文件并启动 Docker 服务:

1
2
# systemctl daemon-reload  // 必须调用此命令
# systemctl start docker

注1:可用docker info命令查看是否修改成功。
注2:原有的镜像需要手动删除。

默认目录为/var/lib/docker,可做一连接文件,这样不需要修改配置文件。

1
2
3
systemctl stop docker
ln -s /home/latelee/workshop/docker/ /var/lib/docker
systemctl start docker

配置文件

Docker 配置文件为 /etc/docker/daemon.json 。默认不存在。

1
2
3
4
5
6
7
8
9
10
cat > /etc/docker/daemon.json <<-EOF
{
"registry-mirrors": [
"https://a8qh6yqv.mirror.aliyuncs.com",
"http://hub-mirror.c.163.com"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

释义:
registry-mirrors 指定docker镜像地址,可加速镜像下载。
exec-opts native.cgroupdriver=systemd:指定cgroup驱动为systemd

外:CentOS系统安装

如已有旧版本,删除之:

1
sudo yum remove docker  docker-common docker-selinux docker-engine

否则提示冲突,安装不上:

1
2
Error: docker-ce-cli conflicts with 2:docker-1.13.1-203.git0be3e21.el7.centos.x86_64
Error: docker-ce conflicts with 2:docker-1.13.1-203.git0be3e21.el7.centos.x86_64

安装系统工具:

1
2
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
注:yum-util 提供 yum-config-manager 功能,device-mapper-persistent-data和lvm2是devicemapper驱动依赖

添加国内源(阿里云):

1
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

生成缓存:

1
sudo yum makecache 

安装:

1
2
3
sudo yum install docker-ce

注:不能用 docker,会安装 1.13.1 版本。

查看版本:

1
2
# docker -v
Docker version 19.03.13, build 4484c46d9d

默认没有启动,提示:

1
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

手动启动docker服务:

1
# systemctl start docker

开机自启动:

1
# systemctl enable docker

其它配置,如加速器,改存储目录等,与前述无本质差别。

如果系统没有启动IP转发,则执行:

1
# echo "net.ipv4.ip_forward=1" >> /usr/lib/sysctl.d/00-system.conf

重启network服务

1
# systemctl restart network

查看是否修改成功

1
#  sysctl net.ipv4.ip_forward

也可以重启机器。

启动研究

docker 无法直接使用 dockerd 命令启动,必须使用 systemd,否则提示:

1
2
# /usr/bin/dockerd -H fd://
no sockets found via socket activation: make sure the service was started by systemd

基于此试验可知,在嵌入式 ARM 上运行 docker,需要使用 systemd,不能用默认的 init 程序。

实践记录

在容器中删除文件后再保存成镜像,并不会影响原始镜像。如原镜像大小为4GB,启动之,在容器中删除大量文件,保存成镜像,新镜像大小还是4GB。如原镜像为100MB,启动并在容器中安装大量软件,假设为1GB,此时保存,新镜像增加1GB。如果删除临时文件,此时假定为500MB,则新镜像增加500MB。
结论:在小镜像基础上新加文件,软件,删除缓存临时文件。

李迟 2018.4.9 记 2020 年 3 月、9 月、11 月补充