简单的Docker入门教程
Docker是基于Go语言实现的开源容器项目,诞生于2013年年初,最 初发起者是dotCloud公司。Docker自开 源后受到广泛的关注和讨论,目 前已有多个相关项目(包括Docker三剑客、Kubernetes等),逐渐形成 了围绕Docker容器的生态体系。
Docker项目已加入了Linux基金会,并遵循Apache2.0协议,全部开
源代码均在https://github.com/docker/docker上进行维护。在Linux基金会 最近一次关于“最受欢迎的云计算开源项目”的调查中,Docker仅次于 2010年发起的OpenStack项目,并仍处于上升趋势。
Docker的构想是要实现“Build,Ship and Run Any App, Anywhere”,即通过对应用的封装(Packaging)、分发 (Distribution)、部署(Deployment)、运行(Runtime)生命周期进 行管理,达到应用组件“一次封装,到处运行”的目的。这里的应用组 件,既可以是一个Web应用、一个编译环境,也可以是一套数据库平台
服务,甚至是一个操作系统或集群。
尝试搭建简单的Docker镜像
Apache是一个高稳定性的、商业级别的开源Web服务器。目前 Apache已经是世界使用排名第一的Web服务器软件。由于其良好的跨平 台和安全性,Apache被广泛应用在多种平台和操作系统上。作为Apache 软件基金会支持的项目,它的开发者社区完善而高效。自1995年发布至 今,一直以高标准进行维护与开发。Apache名称源自美国的西南部一个 印第安人部落:阿帕奇族,它支持类UNIX和Windows系统。
1.使用官方镜像
官方提供了名为httpd的Apache镜像,可以作为基础Web服务镜像。
编写Dockerfile文件,内容如下:
FROM httpd:2.4 COPY ./public-html /usr/local/apache2/htdocs/
创建项目目录public-html,并在此目录下创建index.html文件:
<html> <body> <p>Hello, Docker!</p> </body> </html>
构建自定义镜像:
$ docker build -t apache2-image .
注意 . 表示读取当前目录下
构建完成后,使用docker run指令运行镜像
$ docker run -it --rm --name apache-container -p 80:80 apache2-image
通过本地的80端口即可访问静态页面。
也可以不创建自定义镜像,直接通过映射目录方式运行Apache容器:
$ docker run -it --rm --name my-apache-app -p 80:80 -v "$PWD":/usr/local/ apache2/htdocs/ httpd:2.4
- 使用自定义镜像
首先,创建一个apache_ubuntu工作目录,在其中创建Dockerfile文 件、run.sh文件和sample目录:
$ mkdir apache_ubuntu && cd apache_ubuntu
$ touch Dockerfile run.sh
$ mkdir sample
Dockerfile的内容和各个部分的说明:
FROM sshd:Dockerfile
#设置继承自用户创建的sshd镜像
MAINTAINER docker_user (user@docker.com)
#创建者的基本信息 #设置环境变量,所有操作都是非交互式的
ENV DEBIAN_FRONTEND noninteractive
#安装 RUN apt-get -yq install apache2&&\ rm -rf /var/lib/apt/lists/* RUN echo "Asia/Shanghai" > /etc/timezone && \ dpkg-reconfigure -f noninteractive tzdata
#注意这里要更改系统的时区设置,因为在web应用中经常会用到时区这个系统变量,默认的ubuntu ?会让你的应用程序发生不可思议的效果哦 #添加用户的脚本,并设置权限,这会覆盖之前放在这个位置的脚本
ADD run.sh /run.sh RUN chmod 755 /*.sh
#添加一个示例的web站点,删掉默认安装在apache文件夹下面的文件,并将用户添加的示例用软链接 ?链到/var/www/html目录下面
RUN mkdir -p /var/lock/apache2 &&mkdir -p /app && rm -fr /var/www/html && ln -s /app /var/www/html COPY sample/ /app
#设置apache相关的一些变量,在容器启动的时候可以使用-e参数替代
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_SERVERADMIN admin@localhost
ENV APACHE_SERVERNAME localhost
ENV APACHE_SERVERALIAS docker.localhost
ENV APACHE_DOCUMENTROOT /var/www
EXPOSE 80
WORKDIR /app
CMD ["/run.sh"]
此sample站点的内容为输出Hello Docker!。然后在sample目录下创 建index.html文件,内容如下
<!DOCTYPE html> <html> <body> <p>Hello, Docker!</p> </body> </html>
run.sh脚本内容也很简单,只是启动apache服务
$ cat run.sh #!/bin/bash exec apache2 -D FOREGROUND
此时,apache_ubuntu目录下面的文件结构为:
$ tree . . |-- Dockerfile |-- run.sh `-- sample `-- index.html 1 directory, 3 files
创建镜像
$ docker build -t apache:ubuntu .
下面开始使用docker run指令测试镜像。可以使用-P参数映射需要开 放的端口(22和80端口):
$ docker run -d -P apache:ubuntu 64681e2ae943f18eae9f599dbc43b5f44d9090bdca3d8af641d7b371c124acfd
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64681e2ae943 apache:ubuntu "/run.sh" 2 seconds ago Up 1 seconds 0.0.0.0:49171->22/tcp,
0.0.0.0:49172->80/tcp naughty_poincare 890c04ff8d76 sshd:Dockerfile "/run.sh" 9 hours ago Exited (0)
3 hours ago 0.0.0.0:101->22/tcp high_albattani 3ad7182aa47f sshd:ubuntu "/run.sh" 21 hours ago
Exited (0) 3 hours ago 0.0.0.0:100->22/tcp focused_ptolemy
$ curl 127.0.0.1:49172 Hello Docker!
如果想要映射本地目录
$ docker run -i -d -p 80:80 -p 103:22 -e APACHE_SERVERNAME=test -v `pwd`/www:/ var/www:ro apache:ubuntu
ngin镜像
- Dockerfile内容如下:
FROM nginx COPY ./index.html /usr/share/nginx/html
- 开始构建镜像my-nginx:
$ docker build -t my-nginx .
- 构建成功后执行docker run指令:
$ docker run --name nginx-container -d my-nginx
Tomcat镜像
1.Dockerfile文件
FROM sshd:Dockerfile
#设置继承自用户创建的sshd镜像
MAINTAINER docker_user (user@docker.com)
#下面是一些创建者的基本信息
#设置环境变量,所有操作都是非交互式的
ENV DEBIAN_FRONTEND noninteractive
#注意这里要更改系统的时区设置
RUN echo "Asia/Shanghai" > /etc/timezone && \ dpkg-reconfigure -f noninteractive tzdata
#安装跟tomcat用户认证相关的软件
RUN apt-get install -yq --no-install-recommends wget pwgen ca-certificates && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*
#设置tomcat的环境变量,若读者有其他的环境变量需要设置,也可以在这里添加。
ENV CATALINA_HOME /tomcat
ENV JAVA_HOME /jdk
#复制tomcat和jdk文件到镜像中
ADD apache-tomcat-7.0.56 /tomcat
ADD jdk /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 "Tomcat '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
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
/usr/sbin/sshd -D &
exec ${CATALINA_HOME}/bin/catalina.sh run
- 创建和测试镜像
$ docker build -t tomcat7.0:jdk1.6 .
$ docker run -d -P tomcat7.0:jdk1.6 3cd4238cb32a713a3a1c29d93fbfc80cba150653b5eb8bd7629bee957e7378ed
通过docker logs得到tomcat的密码aBwN0CNCPckw:
$ docker logs 3cd
=> Creating and admin user with a random password in Tomcat => Done! ========================================================================
You can now configure to this
Tomcat server using: admin:aBwN0CNCPckw
查看映射的端口信息:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3cd4238cb32a tomcat7.0:jdk1.6 "/run.sh" 4 seconds ago Up 3 seconds 0.0.0.0:49157->22/tcp, 0.0.0.0:49158->8080/tcp cranky_wright
在本地使用浏览器登录Tomcat管理界面,访问本地的49158端口, 即http://127.0.0.1:49158,如图11-3所示。