docker创建java web环境镜像

系统内核为ubuntu 3.19.0-15-generic
Docker 要求 linux 的内核版本高于 3.10

ubuntu 14.04


[size=x-large]关于docker[/size]
docker是一个client-server结构的软件,用户通过client命令控制server端。client即为docker等命令,server为一个系统中的进程docker daemon。

[img]http://dl2.iteye.com/upload/attachment/0123/6360/28ddd900-9ddf-3a00-88fe-3b2ec8c45160.png[/img]


docker daemon维护镜像及容器,用户通过client控制daemon通过镜像创建容器。普通用户可通过docker hub下载镜像,商业用户可通过专门的地方DTR(Docker trusted registry)下载

docker下载的镜像默认路径在/var/lib/docker下面

随着docker的升级完善,docker daemon拆分成下面几个模块

[img]http://dl2.iteye.com/upload/attachment/0123/6362/dc5e380d-2b44-3d1c-80a5-fbf264c6cb64.png[/img]

docker与virtual的区别:

[img]http://dl2.iteye.com/upload/attachment/0123/6364/d789b4a1-c8b5-34e1-ac15-f18693df0893.png[/img]


docker hub(直译为docker枢纽):与源代码托管服务的github类似,dockerhub托管的是镜像

docker加速器:

Docker DataCenter:由DTR(Docker trusted registry)和 UCP(Docker universal Control Plane)这两个产品组成。对应 docker cloud 的产品就是 docker Hub(hub.docker.com)和Tutum by Docker 。
这是docker公司为了商业化,自己开发的产品或互联网应用。虽然docker是docker公司开发的,但docker是开源的,所以需要开发一系列为docker服务的产品及提供技术支持以获取利润
Docker DataCenter竞争产品有Kubernetes,Apache Mesos等
[img]http://dl2.iteye.com/upload/attachment/0123/6368/1d6af6f0-b26f-3b1b-8ec8-3680b4f3a5c6.png[/img]

具体可见:http://dockone.io/article/1067


DockerEngine: 一个client-server 结构的应用, 包含Docker daemon,一个 用来和daemon 交互的REST API, 一个命令行应用CLI


本地操作docker命令关系图:

[img]http://dl2.iteye.com/upload/attachment/0123/7830/7b7ceeea-f269-329e-8412-e206130c0228.png[/img]


通过学习docker的过程,认识到了知识技术的传播者的可敬之处。如果单纯自己去学习国外的docker第一手文献,可能就不会去学了。向那些布道者致敬,更向技术的创建者致敬。


1.安装docker

2.安装javaweb环境

3.保存镜像

4.常用命令

5.遇到的问题


[size=large]1.安装docker[/size]

[size=medium]1.1 验证os是否符合安装要求[/size]

首先查看ubuntu的版本,查看是否该版本是否可安装docker。安装docker,
内核最低为3.10(可通过uname -r查看),
linux架构为64位(uname -m查看i686表示32位)
sudo lsb_release -a

[img]http://dl2.iteye.com/upload/attachment/0123/6574/a93aa613-5c8b-3c6a-add2-72c0a6b25603.png[/img]


[size=medium]1.2 安装docker[/size]

国内用户如果没有vpn 可使用阿里云的安装脚本
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh
安装成功后,提示如下:

[img]http://dl2.iteye.com/upload/attachment/0123/6378/ad89bfb5-ef41-31c6-93b1-410587e63f64.png[/img]

表示安装成功了


[size=medium]1.3 配置镜像加速器,这里使用网易加速器[/size]

由于docker hub在国外,访问比较慢。配置镜像加速器

$ sudo echo "DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=http://hub-mirror.c.163.com\"" >> /etc/default/docker

$ service docker restart

关于国内加速器对比可见:
http://www.datastart.cn/tech/2016/09/28/docker-mirror.html


[size=large]2 安装javaweb开发环境[/size]

[size=medium]2.1.创建基于ubuntu14.04镜像的容器[/size]
正常情况下,可以直接运行2.2,跳过2.1这一步。由于运行2.2的命令时,报了很多错,所以一步步精简命令调试

docker run ubuntu:14.04 /bin/bash

在本地查找ubuntu:14.04镜像,如果没有从registry下载

[img]http://dl2.iteye.com/upload/attachment/0123/6456/58ccb905-ede3-3354-87d3-9e0450e46466.png[/img]

具体分析见:常见问题2


[size=medium]2.2.运行镜像ubuntu14.04的bash,进入容器终端的交互式环境[/size]
docker run -i -t -v /opt/oracle/firstdocker:/opt/oracle/firstdocker ubuntu:14.04 /bin/bash

这个命令表示进入ubuntu镜像的terminal的bash命令

请注意-与–的区别,由于中英文输入法的区别,导致在这里翻了跟头 :cry:
docker run –i –t –v /opt/oracle/firstdocker:/opt/oracle/firstdocker ubuntu:14.04 /bin/bash


[img]http://dl2.iteye.com/upload/attachment/0123/6458/775081f9-ab5b-3cde-a6fd-af71ad2f9782.png[/img]


-i:建立交互性连接,占用容器的标准输出(interactive)

-t:在容器中建立一个伪终端或者终端。(terminal)

-v:将主机的目录或者文件挂载为容器数据卷或者在容器中增加数据卷 (volumn)

可参见:
http://www.heblug.org/chinese_docker/userguide/dockerizing.html


[size=medium]2.3.下载安装jdk[/size]
进入容器终端后,下载安装jdk
run一些命令:

DEBIAN_FRONTEND=noninteractive apt-get -y install python-software-properties

DEBIAN_FRONTEND=noninteractive apt-get -y install software-properties-common

DEBIAN_FRONTEND=noninteractive add-apt-repository ppa:webupd8team/java

apt-get update

apt-get install oracle-java7-installer

java -version查看是否安装成功

[img]http://dl2.iteye.com/upload/attachment/0123/6462/12504a7f-3fde-3f62-80ec-4c2b2cfe7564.png[/img]

[size=medium]2.4.下载安装tomcat[/size](下载tomcat在宿主主机)
wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.75/bin/apache-tomcat-7.0.75.tar.gz

由于网络原因下载失败,可以多试几次

tar -zxvf apache-tomcat-7.0.75.tar.gz

bin/startup.sh

--创建运行脚本在opt下run
vi runtomcat.sh

#!/bin/bash

source ~/.bashrc

sh /opt/oracle/firstdocker/apache-tomcat-7.0.75/bin/catalina.sh run



[img]http://dl2.iteye.com/upload/attachment/0123/6569/2d08861f-b5a4-3197-a16d-8bddd0a35749.png[/img]


添加执行权限:
[color=red]chmod u+x /opt/runtomcat.sh[/color]


2.4.1(下载tomcat在容器) 2.4为在宿主主机下载
如果2.4生成的镜像要移到其他宿主主机,需重新在宿主主机下载tomcat,不方便

进入容器的bash环境,新建文件夹/opt/oracle,下载tomcat

先现在wget
apt-get update
apt-get install wget

以下步骤同2.4,只是某些参数不同

run
wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.76/bin/apache-tomcat-7.0.76.tar.gz

--创建运行脚本在opt下run
vi run.sh

#!/bin/bash

source ~/.bashrc

sh /opt/oracle/apache-tomcat-7.0.76/bin/catalina.sh run



添加执行权限:
[color=red]chmod u+x /opt/run.sh[/color]


[size=medium]2.5.创建镜像[/size]
--退出容器run
exit

docker ps -a

[img]http://dl2.iteye.com/upload/attachment/0123/6472/51ec5287-0a48-35a0-ad93-33310457936e.png[/img]

--提交刚才创建的包含jdk及tomcat的镜像(resp:tag[version]自定义)
docker commit -m "Added JDK Tomcat" -a "joe" elated_booth ubuntu/firstdocker:v1

docker images 验证是否创建成功

-m 描述
-a 作者
elated_booth 容器名称
ubuntu/firstdocker:v1 [REPOSITORY[:TAG]

Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]


[size=medium]2.6.映射端口号,启动并访问[/size]
docker run -d -p 8180:8080 -v /opt/oracle/firstdocker:/opt/oracle/firstdocker ubuntu/firstdocker:v1 /opt/runtomcat.sh

如果tomcat在镜像容器中(2.4.1),可不用映射硬盘:
docker run -d -p 8180:8080 ubuntu/tomcat76:v1 /opt/run.sh


[img]http://dl2.iteye.com/upload/attachment/0123/6572/ad29f557-f83a-37cd-badd-b80461803abe.png[/img]


[size=large]3.保存镜像[/size]
备份镜像,以便移到其他镜像可以继续使用
1.上传到dockerhub(由于网络慢,忽略)

2.本地备份(save,load)
--保存
# docker save -o 自定义文件名.tar IMAGE_ID

--恢复
# docker load < 镜像名.tar

3.上传到阿里云等国内镜像中心

docker pull registry.cn-hangzhou.aliyuncs.com/study_2017/tomcat:v1

--修改tag
docker tag f856b98dda5a tomcat76:v1

--run
docker run -d -p 8180:8080 tomcat76:v1 /opt/run.sh


[size=large]4.常用命令[/size]
docker ps -a 查看所有容器

docker ps 查看正在运行的容器

docker logs container_id 查看日志

docker stop container_id 停止容器

docker start container_id 启动容器

docker rm container_id 删除容器

docker port container_id 查看映射端口

docker commit 提交镜像

docker tag imageid name:tag 修改镜像

docker rmi image_id 删除镜像

docker rmi $(docker images -q) 删除所有镜像

docker stop $(docker ps -a -q)

docker rm $(docker ps -a -q) 删除所有停止的容器

Create a new image from a container's changes

-a, --author="" Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change=[] Apply specified Dockerfile instructions while committing the image
--help Print usage
-m, --message="" Commit message
-p, --pause=true Pause container during commit

docker commit命令参考:
https://docs.docker.com/v1.11/engine/reference/commandline/commit/


[size=large]5.遇到的问题[/size]
1.官方的方法对于国内用户而言,有时行不通
官方方法安装docker可能出现的错误-unused
如果有vpn,可直接通过官方方式下载安装。否则容易出现网络等错误

这是官方的安装docker方式:

root@ubuntu:~# wget -qO- https://get.docker.com/ | sh

报错1:
apparmor is enabled in the kernel and apparmor utils were already installed
+ sh -c sleep 3; apt-get update
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
E: Unable to lock directory /var/lib/apt/lists/

原因分析:
apt-get进程被占用

解决方案:
sudo rm -vf /var/lib/apt/lists/*
sudo apt-get update

再执行:
wget -qO- https://get.docker.com/ | sh


报错2:
Fetched 4,540 kB in 34min 30s (2,192 B/s)
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/trusty-security/multiverse/source/Sources Hash Sum mismatch

W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/trusty-security/main/binary-amd64/Packages Hash Sum mismatch

W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/trusty-security/restricted/binary-amd64/Packages Hash Sum mismatch

W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/trusty-security/main/binary-i386/Packages Hash Sum mismatch

W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/trusty-security/main/i18n/Translation-en Hash Sum mismatch

W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/trusty-security/multiverse/i18n/Translation-en Hash Sum mismatch

W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/trusty-security/universe/i18n/Translation-en Hash Sum mismatch

E: Some index files failed to download. They have been ignored, or old ones used instead.

原因分析:
所使用的网络供应商,会缓存一些之前访问或下载的信息,以便减少流量出口。导致下载的信息与最新的数据不一致,出现校验错误

解决方案:
sudo rm -fR /var/lib/apt/lists/*

sudo mkdir /var/lib/apt/lists/partial

sudo apt-get update

再执行:
wget -qO- https://get.docker.com/ | sh


可能任然不能报错


2.下载镜像出错,已经配置了加速器,貌似加速器没有生效?
docker run ubuntu:14.04 /bin/bash

Unable to find image 'ubuntu:14.04' locally
docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled (Client.Timeout exceeded while awaiting headers).
See 'docker run --help'.
这里试了好几次都没有成功,报https://registry-1.docker.io/v2/ 连接失败,第二天重试又好了。难道是配置加速器后要重启。(应该是人品比较好,正好连上了)

[color=red]为什么加速器没有起作用?[/color]


3.运行tomcat的错误方式
docker run -d -p 8180:8080 -v /opt/oracle/firstdocker:/opt/oracle/firstdocker --name firstwebapp ubuntu/firstdocker:v1 /opt/oracle/firstdocker/apache-tomcat-7.0.75/bin/startup.sh

docker logs container_id 查看启动日志没有报错


但是查看容器docker ps -a,总是退出的 exited

这是因为run -d 以守护进程运行,必须有一个前台程序
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的

启动完后就退出了容器

所以需要添加运行脚本/opt/runtomcat.sh

具体可参考:
http://blog.simcu.com/archives/467


参考文献:
https://github.com/widuu/chinese_docker/blob/master/installation/ubuntu.md

http://tech.meituan.com/docker_introduction.html

https://yeasy.gitbooks.io/docker_practice/content/introduction/what.html

http://cxytiandi.com/blog/detail/5817

https://github.com/docker/docker/issues/5383

http://www.infoq.com/cn/news/2017/02/Docker-Containerd-RunC?utm_source=news_about_Dockers&utm_medium=link&utm_campaign=Dockers

http://seanlook.com/2014/10/31/docker-command-best-use-1/

源码类分析:
http://blog.daocloud.io/how-to-master-docker-image/

http://www.infoq.com/cn/articles/docker-source-code-analysis-part1


拓展阅读:
http://www.36dsj.com/archives/70459 Docker生态会重蹈Hadoop的覆辙吗?

http://www.infoq.com/cn/news/2017/01/DockerChange-ContainerEcosys-mi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值