Docker自建虚拟机实验环境及基础入门

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        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

a135d7ed1e38        myproj:v1           "/tomcat/bin/catalina"   11 minutes ago      Up 11 minutes       0.0.0.0:8090->8080/tcp   reverent_lumiere

查看镜像进程,下面的命令根据查到的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 ,这些是英文版的。

转载于:https://my.oschina.net/u/3420782/blog/887300

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值