这两天开始对docker进行学习,熟话说,万事开头难,不过,由于我们是码农,所以,必须要有时刻学习新技术的决心和勇气。这两天集中突击了一下,看了些书籍,如《Docker技术入门与实战》,照着上面的实例不断的敲,终于对docker有了个深刻的理解,运用docker搭建了一下web开发环境的镜像,将项目放入容器中运行,访问,当看到项目首页的时候,那种感觉真是爽呆了。
下面开始记录我对docker的总结:
1. docker是什么?
可以通过镜像构建轻量级的虚拟服务器的一门技术。具体百度吧。
下面是几个核心概念:
镜像:
服务器环境知道吧?如果要快速生成一套服务器环境,需要由镜像来new一个。docker有公共的镜像仓库,可以类比github。你可以将镜像pull到本地。在本地通过镜像生成容器,本地没有该镜像就会直接从远程镜像地址下载。
比如,我想看一下关于mysql的镜像。
然后就可以下载下来了,官网的那个docker.io 可以省略
docker pull mysql
然后通过 一下命令可以查看本地的镜像
docker images
容器
通过镜像可以创建容器,可以理解服务器环境。创建容器十分轻量级,创建十个八个的,对真实的宿主机的影响很小。但是你要是开十个centos,电脑要卡死了都
用centos镜像来运行一个centos的容器,没有centos镜像的可以从官方镜像拉取
docker run centos
为什么看不到效果?因为运行一个容器,如果不加别的参数,容器创建后就会销毁终止了。
怎么才能让容器持续工作呢?我们可以 这样
-t docker 分配一个终端绑定到容器的标准输入上
-i 让容器的标准输入保持打开
这样你会看到,我们进入了一个id为c865b的容器内,这就是centos的容器,一个全新的环境。
还可以加上 -d ,让Docker容器在后台以守护状态运行,再后边想进入容器的时候,通过 docker exec -i -t db25e /bin/bash 进入这个容器
查看目前正在运行的容器用 docker ps
查看全部的容器 docker ps -a ,包括运行的和退出的
创建docker镜像
创建docker镜像,将根据我们自己的需求,搭建一套服务器环境。这样以后可以很方便的通过镜像来生成我们所要的容器,比用虚拟机搭建环境,方便太多了,只需要一个文件,就可以搞定。
创建镜像用dockerfile文件方式创建,还有一种是通过命令,不太直观。通过文件创建镜像也是推荐的一种方式。
#this dockerfile use ubuntu:14.04 image #Author:chenwei #第一行必须指定基于的基础镜像 FROM ubuntu:14.04 #维护者信息 MAINTAINER chenwei 123456@qq.com #镜像的操作指令。每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 来换行。 RUN apt-get update && apt-get install -y nginx && rm -rf /var/lib/apt/lists/* && echo " daemon off;" >> /etc/nginx/nginx.conf && chown -R www-data:www-data /var/lib/nginx RUN echo "Asia/Shanghai" > /etc/timezone #该命令将复制指定的 <src> 到容器中的 <dest>。其中 <src> 可以是Dockerfile所在目录的一个相对路径; ADD run.sh /run.sh RUN chmod 755 /*.sh #创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。 VOLUME ["/etc/nginx/sites-enabled","/etc/nginx/certs","/etc/nginx/conf.d","/var/log/nginx"] #为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。 WORKDIR /etc/nginx #指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。 CMD ["/run.sh"] #告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口 EXPOSE 80 EXPOSE 443
主要是这些指令,后面我们通过一个例子,来看怎么通过dockerfile来创建docker镜像。
首先我们创建一个 tomcat_jdk_ubuntu的文件夹,然后在该文件夹下创建一个空的Dockerfile文件,一个run.sh脚本,该脚本主要做初始化操作,再从往下下载tomcat和jdk的压缩包,就是那种tar.gz结尾的,免安装的。解压后,目录结构如下:
dockerfile 文件内容如下
#基于一个以前下载的linux操作系统镜像来搭建
FORM ubuntu
# 维护者信息
MAINTAINER chenwei 609605093@qq.com
#复制tomcat和jdk文件到镜像中,镜像中若没有文件夹,则会新建
ADD apache-tomcat /tomcat7
ADD jdk8 /jdk8
ADD run.sh /run.sh
#设置环境变量 ,形式类似于key -value
ENV CATALINA_HOME /tomcat7
ENV JAVA_HOME /jdk8
ENV PATH $PATH:$JAVA_HOME/bin
# 在基础镜像上执行指令,每执行一次,都会在镜像上新建一层文件,生成新的镜像
RUN chmod +x /*.sh
RUN chmod +x /tomcat7/bin/*.sh
#暴露一下容器的端口,
EXPOSE 8080
EXPOSE 80
#容器启动时,执行的初始化命令
CMD ["/run.sh"]
dockerfile 书写完毕 ~~
我们的run.sh中就只是开启一下tomcat
然后开始构建镜像 docker build -t tomcat7:jdk8 . !!!不要忘了最后还有一个点,意思是在当前目录下查找dockerfile 和其他的文件
最后通过 docker run -d -P tomcat7:jdk8 看下 ,
通过docker ps 可以看到 容器id为 a87ee 的容器,已经在运行了,映射的端口号是 32779 --》8080,访问一下 宿主机的 ip + 32779 端口
看到已经起来了吧,剩下最后一步,就是把你的项目复制到容器中,在 dockerfile中通过 ADD 或者挂载命令 VOLVME 。推荐用VOLVMN,因为在容器中的操作,日志了什么的,也会在宿主机中看到。
不写了,太晚了,周末愉快