1.安装docker:
$ yum install docker
或者
$ apt-get install docker
$ sudo apt-get install apt-transport-https
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
(可能会报"unable to resolve host iZbp1dhz3f2ha9gfmr23233",没管他继续)
$ sudo apt-get update
$ sudo apt-get install lxc-docker
$ docker -v
Docker version 1.9.1, build a34a1d5
windows安装请参考链接:
https://docs.docker.com/toolbox/toolbox_install_windows/
启动docker:
$ service docker start
2.准备工作:
获取ubuntu镜像:
$ docker pull ubuntu:14.04
查看获取的镜像:
$ docker images
创建Dockerfile和run.sh文件:
$ mkdir tomcat8_jdk1.8
$ cd tomcat8_jdk1.8
$ touch Dockerfile run.sh
下载tomcat和jdk并解压(可以到官网下载最新版本):
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.38/bin/apache-tomcat-8.5.38.tar.gz
$ wget https://download.oracle.com/otn-pub/java/jdk/8u201-b09/42970487e3af4f5aa5bca3f542482c60/jdk-8u201-linux-x64.tar.gz
$ tar zxf apache-tomcat-8.5.38.tar.gz
$ tar zxf jdk-8u191-linux-x64.tar.gz
解压后目录结构如下:
Dockerfile文件编写:
- 在以前java的开发中,对于一些操作我们会写些sh脚本文件来封装一些基本操作,而在docker中,采用的就是docerfile的方式让dcoker读取并分析、执行,这样的话重复构建、更新都变得更方便。在这里阐述下常用的docker参数:
- FROM命令。用法,FROM :。FROM命令告诉docker我们构建的镜像是以哪个(发行版)镜像为基础的。
- RUN命令。用法RUN 。RUN 后面接要执行的命令,比如,我们想在镜像中安装vim,只需在Dockfile中写入RUN yum install -y vim
- ENV命令。用法,ENV 。ENV命令主要用于设置容器运行时的环境变量
- ADD命令。用法,ADD 。ADD主要用于将宿主机中的文件添加到镜像中
下面是文件内容
# 设置基础镜像
FROM ubuntu:14.04
# 创建者信息
MAINTAINER Mr.zhang
# 设置环境变量,所有操作都是非交互式的
ENV DEBIAN_FRONTEND noninteractive
# 设置系统编码,不然web接口或日志中文会出现乱码
ENV LANG C.UTF-8
# 设置时区,注意这里要更改系统的时区设置,因为在web应用中经常会用到时区这个系统变量,ubuntu 16.04请注释掉
RUN echo "Asia/Shanghai" > /etc/timezone && \
dpkg-reconfigure -f noninteractive tzdata
# 安装跟tomcat用户认证相关的软件,此步可跳过对应的不用创建create_tomcat_admin_user.sh文件脚本
RUN apt-get update
RUN apt-get install -yq --no-install-recommends wget pwgen ca-certificates && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 设置tomcat和jdk的环境变量,其他的环境变量也可以在这里设置
ENV CATALINA_HOME /tomcat
ENV JAVA_HOME /jdk
ENV PATH $JAVA_HOME/bin:$PATH
# 复制tomcat和jdk文件到镜像
ADD apache-tomcat-8.5.38 /tomcat
ADD jdk1.8.0_191 /jdk
ADD create_tomcat_admin_user.sh /create_tomcat_admin_user.sh
ADD run.sh /run.sh
RUN chmod +x /*.sh
RUN chmod +x /tomcat/bin/*.sh
EXPOSE 8080
CMD ["/run.sh"]
创建 tomcat 用户和密码脚本文件 create_tomcat_admin_user.sh
下面是文件内容:
#!/bin/bash
if [ -f /.tomcat_admin_created ] ; then
echo "Tomat 'admin' user already created"
exit 0
fi
# generate password
PASS=${TOMCAT_PASS:-$(pwgen -s 12 1)}
_word=$( [ ${TOMCAT_PASS} ] && echo "preset" || echo "random" )
echo "=> Creating and admin user with a ${_word} password in Tomcat"
sed -i -r 's/<\/tomcat-users>//' ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-gui"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-script"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-jmx"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="admin-gui"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="admin-script"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo "<user username=\"admin\" password=\"${PASS}\" roles=\"manager-gui,manager-script, manager-jmx, admin-gui, admin-script\"/>" >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '</tomcat-users>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
#IP white list 171.88.14*.*改为自己的ip即可
sed -i 's/allow=\"127\\.\\d+\\.\\d+\\.\\d+|::1|0:0:0:0:0:0:0:1\" \/>/allow="171.88.14*.*" \/>/g' ${CATALINA_HOME}/webapps/manager/META-INF/context.xml
echo "=> Done!"
touch /.tomcat_admin_created
echo "================================================"
echo "You can now configure to this Tomcat server using:"
echo ""
echo " admin:${PASS}"
echo ""
echo "================================================"
编写 run.sh 脚本文件
下面是文件内容:
#!/bin/bash
if [ ! -f /.tomcat_admin_created ]; then
/create_tomcat_admin_user.sh
fi
exec ${CATALINA_HOME}/bin/catalina.sh run
注意事项
启动镜像报错“Docker error: standard_init_linux.go:185: exec user process caused “no such file or directory”(一般在windows上的docker创建镜像出现,由于文件编码导致)解决方案:
修改Dockerfile,create_tomcat_admin_user.sh,run.sh文件编码:
$ vim Dockerfile
$ :set ff 回车后看到当前文件的fileformat格式
$ :set ff=unix 回车后输入:wq保存文件。
create_tomcat_admin_user.sh,run.sh文件重复以上操作,重新build镜像即可。
创建和测试镜像
通过下面的命令创建镜像 tomcat8:jdk1.8:
$ sudo docker build -t tomcat8:jdk1.8 .
查看下目前本地的镜像:
$ sudo docker images
启动一个 tomcat 容器进行测试
$ sudo docker run -d -p 8080:8080 tomcat8:jdk1.8
-p指定主机8080端口与容器8080端口进行绑定
-d指定容器运行后与当前主机分离,后台运行
查看映射的端口信息:
$ sudo docker ps
通过 docker logs 得到 tomcat 的密码:
$ sudo docker logs 3cd
(3cd 是镜像的运行的CONTAINER ID,通过$ sudo docker ps 得到)
在本地使用浏览器登录 Tomcat 管理界面,访问http://127.0.0.1:8080
8080 端口在 sudo docker ps 查看
进入docker容器:
$ sudo docker exec -it 3cd /bin/bash
停止docker容器:
$ sudo docker stop 3cd
上传镜像至仓库:
修改镜像标记:
$ sudo docker tag tomcat8:jdk1.8 reponame:tagname
上传标记的镜像:
$ sudo docker push reponame:tagname
## (注意:reponame要和仓库名称一致,首次上传需要登录验证,也可以使用 $ docker login进行登陆)
docker容器中的top命令:
$ export TERM
$ top
如果提示“TERM environment variable not set.”按以下步骤操作:
下载仓库的镜像:
删除原来的镜像
$ sudo docker rmi tomcat8:jdk1.8
$ sudo docker rmi reponame:tagname
下载镜像
$ sudo docker pull reponame:tagname
(使用$ sudo docker images查看下载的,可以启动这个镜像试下)
其它常用命令
保存镜像
$ sudo docker save -o tomcat8_jdk1.8.tar tomcat8:jdk1.8
载入保存的镜像
$ sudo docker load < tomcat8_jdk1.8.tar
基于已有的容器镜像(正在运行的)创建新的镜像
$ sudo docker commit -m "tomcat8 and jdk1.8" -a "Mr.zhang" 3cd new_Docker:v1
-a , --author=""作者信息。
-m, --message=""提交信息。
-p, --pause=true提交时停止容器运行。
3cd, 是镜像的运行的CONTAINER ID,通过$ sudo docker ps 得到。
docker rmi 提示不能删除时
查看记录:
$ sudo docker ps -a
先删除记录
$ sudo docker rm CONTAINER_ID
再使用docker rmi删除镜像
批量删除docker ps -a
docker ps -a | awk '{print "docker rm "$1}' | bash
拷贝主机文件到容器
docker cp 文件路径 容器ID:容器内的路径
拷贝容器文件到主机
docker cp 容器ID:容器内的路径 文件路径