Docker在Ubuntu上的安装
配置Docker的apt源
1. 对系统源进行更新
sudo apt-get update
2. 安装包,允许apt命令HTTPS访问Docker源
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
3. 添加Docker官方的GPG
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4. 将Docker的源添加到 /etc/apt/sources.list
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
安装Docker
sudo apt-get update sudo apt-get install docker-ce
镜像下载加速
由于Docker Hub的服务器在国外,下载镜像会比较慢。DaoCloud为我们提供了免费的国内镜像服务
1. 在daocloud.io上注册一个账号,如果已经有账号的可以直接登录
2. 登录后点击右上角的加速器
3. 根据自己的系统复制加速器命令,并在主机中执行
4. 重启docker daemon
sudo systemctl restart docker.service
Docker采用的是C/S架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器
Docker客户端
最常见的客户端是docker命令,通过docker命令可以很方便的在主机上构建和运行容器,docker支持很多操作,常见的docker命令及其用途如下
除了docker命令行工具,用户也可以通过REST API与服务器通信
Docker服务器
Docker daemon是服务器组件,以Linux后台服务的方式运行
Docker daemon运行在Docker主机上,负责创建、运行、监控容器,构建、存储镜像。默认配置下,Docker daemon只能响应来自本地主机的客户端请求,如果要允许远程客户请求,需要在配置文件中打开TCP的监听,具体操作如下
1. 编辑配置文件/etc/systemd/system/multi-user-target.wants/docker.service,在环境变量ExecStart后面添加-H tcp://0.0.0.0,允许来自任意的客户端连接
2. 重启Docker daemon
sudo systemctl daemon-reload
sudo systemctl docker.service
3. 客户端在命令行里面加上-H参数,即可与远程服务端通信,其中info子命令用来查看Docker服务器的信息
docker run命令创建容器的过程:首先是客户端执行docker run命令,然后Docker daemon会在本地搜索需要创建的镜像,如果本地没有所需镜像,则Docker daemon会自动在Docker Hub上进行下载,并保存到本地,最后Docker daemon启动容器
只有容器层是可写的,容器层下面的所有镜像都是只读。在容器层,用户看到的是一个叠加之后的文件系统
1. 添加文件
在容器中创建文件时,新文件被添加到容器层中
2. 读取文件
在容器中读取某个文件时,Docker会从上往下依次在各镜像层中查找文件。一旦找到,立即将其复制到容器层,然后打开并读入内存
3. 修改文件
在容器中修改已存在的文件时,Docker会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改
4. 删除文件
在容器中删除文件时,Docker也是从上往下依次在镜像层中查找文件。找到后,会在容器层中记录下此删除操作
只有当需要修改时才复制一份数据,这种特性被称为Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。
docker commit创建新镜像的三个步骤:运行容器、修改容器、将容器保存为新的镜像
1. 运行容器:sudo docker run -it --name test
这是以交互式的方式运行一个容器,并将容器命名为test,用户可以根据自己的容器用途和类型自行起名,当然除了以-it参数启动交互型容器外,也可以使用-d参数启动守护型容器
2. 修改容器:进入容器后,先用apt-get update对容器源进行更新,然后再用apt-get install命令来按需对容器进行扩展
3. 将容器保存为新的镜像:sudo docker commit test test:v1
保存新镜像的格式:sudo docker commit <容器名称/容器ID> 新镜像名称。如果要对所创建的镜像进行持续性修改,可以像上面案例一样,用test:v1的方式来给镜像名称,它表示的是镜像test的版本为v1,这样在需要对容器进行持续性修改时很有帮助
即使docker commit命令创建镜像在某种意义上很方便,但Docker并不建议用户使用该命令进行镜像的创建,原因有两点:
(1)这是一种手工创建镜像的方式,很容易出错,效率低且可重复性弱
(2)使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患
虽然不建议采用docker commit的方式创建镜像,但还是要学习它,因为就算是Dockerfile的方式创建镜像,其底层也是docker commit一层一层构建新镜像的,学习docker commit能够帮助我们深入地理解构建过程和镜像的分层结构
用Dockerfile创建test/ubuntu,其内容如下
下面是Dockerfile的执行步骤和创建镜像过程
root@ubuntu:~# pwd ①
/root
root@ubuntu:~# ls ②
Dockerfile
root@ubuntu:~# docker build -t test/ubuntu . ③
Sending build context to Docker daemon 32.26 kB ④
Step 1 : FROM ubuntu ⑤
---> f753707788c5
Step 2 : RUN apt-get update && apt-get install -y vim ⑥
---> Running in 9f4d4166f7e3 ⑦
......
Setting up vim (2:7.4.1689-3ubuntu1.1) ...
---> 35ca89798937 ⑧
Removing intermediate container 9f4d4166f7e3 ⑨
Successfully built 35ca89798937 ⑩
root@ubuntu:~#
用docker build命令来构建镜像,-t参数将新镜像命名为test/ubuntu,命令末尾的 . 指明build context为当前目录。Docker会从build context中查找Dockerfile文件,也可以用-f参数指定Dockerfile的位置
首先Docker将build context中的所有文件发送给Docker daemon,build context为镜像提供所需的文件或目录
这个文件的执行过程:首先执行FROM,将ubuntu作为基础镜像,该步骤会给出基础镜像的ID。然后执行RUN,安装所需扩展的服务,在该过程中会生成一个临时容器并返回临时容器的ID,并在临时容器中通过apt-get来安装所需服务,安装成功后,将容器保存为镜像,并返回该镜像的ID,这里底层使用的类似docker commit命令。最后删除前面生成的临时容器
镜像构建成功后,可以通过docker history命令验证。docker history会显示镜像的构建历史,也就是Dockerfile的执行过程。