Docker最好在redhat或centos 7环境下运行,因为docker要求内核版本为3.10以上。这里假设已建好Centos7虚拟机,下面步骤从这个虚拟机的裸机开始一步步安装docker。

安装Docker和执行docker的所有命令需要root权限,所以下面需要用root用户操作。

 

一、获得docker安装的rpm

Docker安装一般通过官方源,可以自己在/etc/yum.repos.d目录下建一个docker.repo的文件,内容如下:

[dockerrepo]

name=Docker Repository

baseurl=https://yum.dockerproject.org/repo/main/centos/7/

enabled=1

gpgcheck=1

gpgkey=https://yum.dockerproject.org/gpg

 

之后就可以用 yum install docker-engine来安装docker了。

如果无法上外网,也可以直接使用rpm离线安装,先从源中下载下面两个rpm文件(网上的docker源版本会随着社区进度更新,我们这里选择1.12.5版本能稳定提供我们实验和学习的功能):

https://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-1.12.5-1.el7.centos.x86_64.rpm

https://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-selinux-1.12.5-1.el7.centos.noarch.rpm

然后使用rpm(或 yum localinstall)命令安装:

# rpm -ivh docker-engine-selinux-1.12.5-1.el7.centos.noarch.rpm

# rpm -ivh docker-engine-1.12.5-1.el7.centos.x86_64.rpm

安装完成后,系统会添加一个 docker 的服务,使用 systemctl start docker 启动服务。

现在可以体验docker的基础功能了。

 

二、下面以打包一个tomcat应用为例说明Docker的基本操作。

通常tomcat要安装在linux服务器上,docker镜像仓库中有人提供了一个包含linux基本操作系统和JDK环境的基础镜像alpine_jdk。

1. 先下载基础镜像:

# docker pull registry.alauda.cn/yangleijun/alpine-oraclejdk7:latest

这个命令从灵雀云的镜像仓库下载镜像到本地。

在虚拟机中建一个目录 /tomcatapp,

2. 添加tomcat及应用,直接安装tomcat到 /tomcatapp目录下添加应用目录,把调式完成的工程目录(假设工程名称是myproj)拷贝到 tomcat的 webapp目录下。

上面几步完成后,/tomcatapp目录下应当有tomcat目录,tomcat下面的webapps下面包含myproj应用。

3. 撰写Dockerfile

Dockerfile是docker打包命令文件,我们这里比较简单,就是基于上面这个镜像

新建一个文件名为Dockerfile,内容如下:

FROM registry.alauda.cn/yangleijun/alpine-oraclejdk7

EXPOSE 8080

COPY ./tomcat /tomcat

CMD ["/tomcat/bin/catalina.sh", "run"]

 

说明:

FROM registry.alauda.cn/yangleijun/alpine-oraclejdk7  指基于linux+jdk的镜像制作我们的应用镜像

EXPOSE 8080         镜像中提供服务的端口,可以映射到容器外部供用户访问

COPY ./tomcat /tomcat 将我们的tomcat环境和应用加到镜像中

CMD ["/tomcat/bin/catalina.sh", "run"] 这最后一行是镜像运行时缺省启动命令和后面跟的启动参数。因为镜像运行时容器中的应用都应该以前台执行,而不是像虚拟机、物理机里面那样,去启动后台服务,例如本例如果采用tomcat后台的方式启动:CMD ["/tomcat/bin/startup.sh"] ,会发现镜像启动后马上就退出了,无法提供服务。

重要:对于容器而言,其启动程序就是容器应用进程,主进程退出,容器就会退出,无法提供服务。

按Dockerfile描述将上面的一整套环境打包成镜像:

# docker build -t myproj:v1 .

Sending build context to Docker daemon 205.7 MB

Step 1 : FROM alpine_jdk:1.7

 ---> 368a692bd22b

Step 2 : EXPOSE 8080

 ---> Running in c7a9626c1551

 ---> 1995ec84c944

Removing intermediate container c7a9626c1551

Step 3 : COPY ./tomcat /tomcat

 ---> 0a4e63d09700

Removing intermediate container 738f471eeb3d

Step 4 : CMD /tomcat/bin/catalina.sh run

 ---> Running in 474324cbf06d

 ---> 720538d3755d

Removing intermediate container 474324cbf06d

Successfully built 720538d3755d

至此,将应用打包成镜像的过程完成,现在可以运行镜像提供的应用了,使用下面的命令运行镜像:

# docker run -p 8090:8080 -d myproj:v1

a135d7ed1e388146da4d66ceae2f3161b4736ad069f9fd171a9890a696940b64

参数 -d 是指容器后台运行,-p 指定映射的端口,前面是本机端口,后面是容器内端口。

容器运行成功,用浏览器访问本机 8090 端口(http://x.x.x.x:8090/myproj)就能访问容器的页面了。

有了这些基础镜像和发布的应用,就可以作更多定制要求,如容器内端口改成8080外的其他端口,将我们的应用发布成ROOT等。

 

三、一些其他命令

# docker ps

CONTAINER ID

a135d7ed1e38

查看镜像进程,下面的命令根据查到的CONTAINER ID查看镜像的详细信息:

# docker inspect a135d7ed1e38
[
    {
        "Id": "a135d7ed1e388146da4d66ceae2f3161b4736ad069f9fd171a9890a696940b64",
        "Created": "2017-04-18T01:39:20.954783222Z",
        "Path": "/tomcat/bin/catalina.sh",
        "Args": [
            "run"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "StartedAt": "2017-04-18T01:39:21.483206669Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Name": "/reverent_lumiere",
            "NetworkMode": "default",
            "PortBindings": {
                "8080/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "8090"
                    }
                ]
            },
        "GraphDriver": {
            "Name": "devicemapper",
            "Data": {
                "DeviceId": "141",
            }
        },
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/default-jvm/bin",
                "JAVA_VERSION=7",
                "JAVA_UPDATE=80",
                "JAVA_BUILD=15",
"JAVA_HOME=/usr/lib/jvm/default-jvm"
            ],
            "Cmd": [
                "/tomcat/bin/catalina.sh",
                "run"
            ],
            "Image": "myproj:v1",
        },
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "MacAddress": "02:42:ac:11:00:02"
                }
            }
        }
    }
]

下面命令查看容器的日志:

# docker logs a135d7ed1e38    
18-Apr-2017 01:39:23.074 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.5.13
18-Apr-2017 01:39:23.079 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Mar 27 2017 14:25:04 UTC
…
18-Apr-2017 01:39:58.171 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
18-Apr-2017 01:39:58.176 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 34705 ms

进入容器内部,需要先得到容器pid然后使用linux的nsenter工具进入进程:

# PID=$(docker inspect --format "{{ .State.Pid }}" a135d7ed1e38  )
# nsenter --target $PID --mount --uts --ipc --net --pid /bin/sh
# echo $PID
10124
#  nsenter --target $PID --mount --uts --ipc --net --pid /bin/sh
/ # export PATH=$PATH:/bin
/ # ls /
bin      dev      etc      home     lib      lib64    linuxrc  media    mnt      proc     root     run      sbin     sys      tmp      tomcat   usr      var
/ #

容器中有时可能缺省路径中没包含/bin,所以要先export PATH=$PATH:/bin 补全路径。

 

四、更多

可去搜索 docker_practice.pdf文件,这个是中文版的,用于入门比较好。

或去官网https://docs.docker.com/ 查看 get started  (https://docs.docker.com/learn/)  和 refrences ,这些是英文版的。