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版本能稳定提供我们实验和学习的功能):
然后使用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 ,这些是英文版的。