安装Docker

$ curl -sSL https://get.docker.com | sh

$ sudo usermod -aG docker $USER

重启

离线安装最新版docker

参照:https://docs.docker.com/install/linux/docker-ce/ubuntu/

(if centos, ref to:https://docs.docker.com/engine/install/centos/#install-from-a-package)

例如,我的机器是ubuntu 18.04(Bionic Beaver),则下载地址为

https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/

下载其中的

containerd.io_1.2.5-1_amd64.deb

docker-ce_18.06.3_ce_3-0_ubuntu_amd64

docker-ce_18.09.6_3-0_ubuntu-bionic_amd64

docker-ce-cli_18.09.6_3-0_ubuntu-bionic_amd64

执行:$ sudo dpkg -i *.deb

验证:$ sudo docker run hello-world

什么是镜像什么是容器?

先看看什么是容器?

容器是一个进程,这个进程可以模拟基础操作系统环境。

什么是镜像?

镜像是生成容器的模板。镜像和容器的关系就像 类与对象 的关系。可以说容器是镜像的实例。

创建新镜像

创建新镜像有两种方式:

1、从已有的容器中提取

2、使用Dockerfile创建

这里我们使用方式1

实验目的

创建一个支持RoR环境的CentOS镜像,类似于《CentOS 7 快速安装RoR环境》所述。

实验过程

1、查看本地已有镜像

$ sudo docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

发现啥都没有

2、下载最新CentOS镜像到本地

先查询一下Docker Hub上现有的镜像

$ sudo docker search centos
 NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
 centos                             The official build of CentOS.                   4308                [OK]                
 ansible/centos7-ansible            Ansible on Centos7                              110                                     [OK]
 jdeathe/centos-ssh                 CentOS-6 6.9 x86_64 / CentOS-7 7.4.1708 x86_…   96                                      [OK]
 consol/centos-xfce-vnc             Centos container with "headless" VNC session…   54                                      [OK]
 imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              40                                      [OK]
 tutum/centos                       Simple CentOS docker image with SSH access      39                                      
 gluster/gluster-centos             Official GlusterFS Image [ CentOS-7 +  Glust…   30                                      [OK]
 centos/mysql-57-centos7            MySQL 5.7 SQL database server                   27                                      
 openshift/base-centos7             A Centos7 derived base image for Source-To-I…   24                                      
 centos/python-35-centos7           Platform for building and running Python 3.5…   22                                      
 kinogmt/centos-ssh                 CentOS with SSH                                 19                                      [OK]
 centos/postgresql-96-centos7       PostgreSQL is an advanced Object-Relational …   18                                      
 openshift/jenkins-2-centos7        A Centos7 based Jenkins v2.x image for use w…   13                                      
 centos/httpd-24-centos7            Platform for running Apache httpd 2.4 or bui…   13                                      
 openshift/mysql-55-centos7         DEPRECATED: A Centos7 based MySQL v5.5 image…   6                                       
 openshift/jenkins-1-centos7        DEPRECATED: A Centos7 based Jenkins v1.x ima…   4                                       
 openshift/wildfly-101-centos7      A Centos7 based WildFly v10.1 image for use …   3                                       
 darksheer/centos                   Base Centos Image -- Updated hourly             3                                       [OK]
 pivotaldata/centos-gpdb-dev        CentOS image for GPDB development. Tag names…   3                                       
 pivotaldata/centos                 Base centos, freshened up a little with a Do…   2                                       
 blacklabelops/centos               CentOS Base Image! Built and Updates Daily!     1                                       [OK]
 pivotaldata/centos-mingw           Using the mingw toolchain to cross-compile t…   1                                       
 pivotaldata/centos-gcc-toolchain   CentOS with a toolchain, but unaffiliated wi…   0                                       
 jameseckersall/sonarr-centos       Sonarr on CentOS 7                              0                                       [OK]smartentry/centos                  centos with smartentry                          0                                       [OK]

然后选择一个下载

$ sudo docker pull centos
 Using default tag: latest
 latest: Pulling from library/centos
 469cfcc7a4b3: Pull complete 
 Digest: sha256:989b936d56b1ace20ddf855a301741e52abca38286382cba7f44443210e96d16Status: Downloaded newer image for centos:latest
再次查询
$ sudo docker images
 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEcentos              latest              e934aafc2206        6 weeks ago         199MB

3、以这个镜像运行一个容器

sudo docker run -t -i centos /bin/bash

[root@379adebe4b02 /]# 

这句命令的含义

run:以某个镜像(这里指明了是centos镜像)运行一个容器

-t:在容器内指定一个伪终端或终端

-i:允许与容器内的标准输入(stdin)进行交互

/bin/bash:在容器里面执行的要运行的命令

这样,我们就可以在容器内安装RoR环境了。

4、在容器内安装RoR环境(具体做法省略)

这里要说明一点:虽然容器可以保存状态,但是最佳实践是:

将重要的环境提取到镜像中保存,这样的话这个镜像实例化出来的容器都会支持这个环境。软件数据保存到宿主环境中,这样即使容器崩溃了数据也不会丢失。

 

例如,假设which命令不能用,于是你在容器里面安装了一个(yum install which)。当你退出容器(准确地讲是退出容器进程,exit)之后再次通过同一个镜像运行容器,这个容器已经不是前面的那个容器了,而是一个全新的实例,which命令依旧不能用。在这种情况下,你需要从安装了which命令的那个容器中提取出新镜像,这样容器的当前状态就以新镜像的形式保存了下来,下次用这个新镜像启动容器,发现which命令可用。

再例如,nginx产生的日志文件,如果保存在容器内,那么退出容器时这些日志文件将全部丢失。而显然这些日志文件是不合适提取到镜像中保存的(虽然这样做理论上没有错误),在这种情况下就需要将宿主环境(运行docker的操作系统)里面的目录挂载到容器中,容器对文件的读写就转变成了对宿主环境中文件的读写,这样数据就得到了保存。

5、提取镜像

退出容器,执行
$ sudo docker commit -m="update with RoR" -a="thinking" f44cf0ebec18 ror-centos-20180524001
sha256:8e494a7f92ca8122527879fd6e2ab808e631b7859ef45d7423bc18c7363b5f1d
其中
-m:提交描述信息
-a:指明作者
f44cf0ebec18:指出容器ID
ror-centos-20180524001:命名新容器
再查询一下
$ sudo docker images
 REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
 ror-centos-20180524001   latest              8e494a7f92ca        6 minutes ago       586MBcentos                   latest              e934aafc2206        6 weeks ago         199MB
有了,用ror-centos-20180524001镜像运行一个容器试一下
$ sudo docker run -t -i ror-centos-20180524001 /bin/bash
 [root@6b643e4e7c2d /]# rails -v
 Rails 5.2.0[root@6b643e4e7c2d /]#

完成!