Docker基本知识

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的执行过程。

 

posted @ 2018-10-19 22:27  Chenjin2018  阅读(251)  评论(0编辑  收藏  举报