这篇文章,算是这个主页搭建起来的第一篇文章,内容比较简单但不乏有参考其他文章的,先谢过,各路大侠。本文基于 Centos7 的入门实战,详情请参看官方文档。从简单的从构建第一个镜像开始,到发布 web 应用,会创建 mysql 数据容器 和 tomcat 容器。首发于 https://yanghj7425.github.io/
目前,CentOS 仅发行版本中的内核支持 Docker。
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
参考菜鸟教程或者官网
安装一些必要的系统工具:
yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存:
yum makecache fast
安装 Docker-ce:
yum -y install docker-ce
启动 Docker 服务:
service docker start #或 systemctl start docker
新版的 Docker 使用 /etc/docker/daemon.json(Linux),如果没有这个文件就创建一个(我本机是没有的)。
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
执行以下命令来删除 Docker CE:
yum remove docker-ce
rm -rf /var/lib/docker
rm -rf /var/run/docker
rm -rf /etc/docker
可以在 Docker 容器内运行程序,通过使用 docker run
命令在容器内运行一个应用程序。运行程序首先要先获得镜像,获取镜像文件可以通过从仓库 pull, 也可通过 Dockerfile 自行构建。如果执行 docker run
时容器内没有可用的镜像就会尝试从官方获取。
docker run hello-world
可以通过命令 docker build -t 镜像名称 Dockerfile文件路径
来自动构建镜像。
输入内容(这段 Demo 可以按照官网提供的来,这里自己觉得方便就好)
创建 Dockerfile 文件
#
# MAINTAINER H.J.Yang
# DOCKER-VERSION 18.06.1-ce, build e68fc7a
#
# Dockerizing hello/docker: Dockerfile for building hello/docker images
#
FROM centos:centos7.1.1503
ENTRYPOINT ["/bin/echo","hello_docker"]
build 一个镜像
docker build -t hello/docker:0.1 .
查看可用的镜像
docker images #或 docker image ls
[root@centos3 hello_world]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello/docker 0.1 0838b223b2f7 9 minutes ago 212MB
centos centos7.1.1503 b96d683c39b0 5 weeks ago 212MB
docker run hello/docker:0.1
命令运行后会随机生成一个容器名称,也可通过 --name
参数指定:docker run --name hello hello/docker:0.1
, 指定生成的容器名为 hello。Java web 要跑起来,就需要一些系统资源和环境变量。容器一旦运行,就不建议手动修改容器内部的配置,若必须进入容器修改那修改后就需要使用 docker commit containerid imagename
来把修改过的容器提交到一个镜像文件。
这里就简单的依赖 centos7.1.1503 来创建 Centos7 的基础镜像。先创建一个 Centos7 的基础镜像,主要是安装一些必要工具软件和对容器做一些必要的设置,后面的镜像都依赖这个基础镜像创建。如:下面 Dockerfile 文件中设置了签名和 root 用户的密码后才可用 通过 ssh 连接上运行的镜像容器。
#
# MAINTAINER H.J.Yang
# DOCKER-VERSION 18.06.1-ce, build e68fc7a
#
# Dockerizing centos7 : Dockerfile for building centos7 images
#
FROM centos:centos7.1.1503
MAINTAINER H.J.Yang
ENV TZ "Asia/Shanghai"
ENV TERM xterm
RUN yum install -y curl wget tar bzip2 unzip vim-enhanced passwd sudo yum-utils hostname net-tools rsync man && \
yum install -y gcc gcc-c++ git make automake cmake patch logrotate python-devel libpng-devel libjpeg-devel && \
yum install -y openssh-server && \
yum clean all
#生成签名
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
RUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
#设置root用户密码
RUN "/bin/echo" root | passwd --stdin root
#删除缓存
RUN rm -rf /var/cache/yum
#暴露 22 端口
EXPOSE 22
CMD ["/bin/echo", "centos7 started"]
创建镜像
docker build -t base/centos7:0.1 .
运行容器
docker run -d -p 7777:22 --name centos7 base/centos7:0.1 /usr/sbin/sshd -D
连接测试
ssh root@localhost -p 7777
,这是在宿主机上访问。若想在非宿主机上访问则需要打开防火墙,命令如下:
firewall-cmd --zone=public --add-port=7777/tcp
创建前需要去下载 tomcat 和 jdk 这两必要的系统环境,注意下载 liunx 版本的,win 的我没试过能不能在 liunx 下跑。但是 Java native 方法这些我估计是不行。新建一个 tomcat 目录把下载好的 jdk 和 tomcat 都放到 tomcat 目录下。
- Dockerfile
#
# MAINTAINER H.J.Yang
# DOCKER-VERSION 18.06.1-ce, build e68fc7a
#
# Dockerizing tomcat8/centos7: Dockerfile for building hello/docker images
#
FROM base/centos7:0.1
MAINTAINER H.J.Yang
# 把宿主机的拷贝到容器的指定目录下,COPY 也有可用拷贝,但是 ADD 有解压功能
ADD jdk-8u181-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.0.53.tar.gz /usr/local/
# 改变目录名称
RUN mv /usr/local/apache-tomcat-8.0.53 /usr/local/tomcat8
# 设置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_181
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/tomcat8
ENV CATALINA_BASE /usr/local/tomcat8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
# 启动容器时启动 tomcat
ENTRYPOINT ["/usr/local/tomcat8/bin/catalina.sh","run"]
创建镜像
docker build -t tomcat8/centos7:0.1 .
运行容器
docker run -d -p 9000:8080 --name tomcat8 tomcat8/centos7:0.1
测试容器
wget localhost:9000
这个命令会抓取到一个 index.html 文件。如果想要在非宿主机的浏览器访问需要打开防火墙,命令如下:
firewall-cmd --zone=public --add-port=9000/tcp
获取一个 MySQL 容器可以通过命令在之前创建的基础系统上安装 mysql 实现,也可以通过 pull 拉取现有的 mysql镜像。
命令: docker pull mysql:5.7.17
命令:docker run -d -p 5555:3306 --name mysql5.7 -v /var/lib/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.17
,执行后打开防火墙外部设备就通过宿主机 5555 端口访问到数据库容器。若其他容器数据库容器则需要通过数据库容器本身的IP地址和 3306 端口访问。
- 参数:
-v:表示通过挂载卷的方式运行,可通过:docker inspect
查看容器内部的信息。
-e: 表示环境变量和 Dockerfile 中 EVN 意思一样。
-p:表示把宿主机 5555 端口映射到容器的 3306 端口。
发布到 Tomcat 容器内部的 web 应用访问数据库不能通过宿主机的 IP 及端口访问,要通过数据容器的自己的 IP 地址和端口。
[root@centos3 mysql]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql5.7
172.17.0.2
[root@centos3 mysql]#
得到 IP 地址就可以在 web 应用的 JDBC 中配置。
-v
参数把 war 包挂载到 tomcat 容器内运行。此处就把 war 包放到宿主机的 tomcat 目录中。 docker run -d -p 9000:8080 -v /docker/tomcat/SimpleDemo.war:/usr/local/tomcat8/webapps/SimpleDemo.war --name tomcat8 tomcat8/centos7:0.1
打包时jdbc 配置如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://172.17.0.2:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
jdbc.username=root
jdbc.password=123456
最后打开防火墙的 9999 端口就可以在非宿主机上通过浏览器范围了,如果不能达到预先的效果,可以通过 docker logs -f containerName
查看容器日志。