1.安装docker,基于centOS6.8
首先执行命令,类似于安装docker所需要的一个环境或者说依赖吧
yum install -y epel-release
接下来安装docker,执行命令
yum install -y docker-io
在这里遇到了一个坑,会提示 ”no package docker-io available", 于是执行了以下命令
yum install https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm
安装docker成功,具体可以执行以下 docker version 命令,如果返回的是以下界面,证明安装成功,用service docker start启动。
2.更换阿里云镜像加速
因为docker默认的是国外的docker hub,我们去访问的话速度是特别慢的,因此我们需要将镜像换成我们国内的活雷锋 ---- 阿里云镜像加速。访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors ,注册登录等一系列流程跳过,点击镜像加速器,去获取自己的镜像加速地址。
我用的是centOS6.8,因此需要修改/etc/sysconfig/docker文件,将加速器的地址配置到文件中。如果是centOS7,阿里云的镜像加速器页面会有介绍改如何配置。
可以用 ps -ef|grep docker查看镜像是否替换成功。命令行 service docker restart,重启docker.
3.hello world
docker run hello-world
可以看到,1)docker会现在本地寻找有没有‘hello-world'镜像,2)发现没有之后,会去阿里云镜像pull到本地,3)接下来在本地 ,docker进程会根据这个拉下来的镜像生成新的docker容器实力并运行。
如果本地有该镜像,则直接跳到第三步。如果阿里云镜像中未找到该镜像,则返回失败。
一些些常用又没记住的命令
#在外面对容器里面进行操作
docker exec 容器id ls -l
#后台执行-d
docker run -d -p 9080:8080 tomcat
4.容器数据卷
1)用-v命令添加数据卷
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer centos
执行完命令之后,可以看到本机的根目录下多了一个myDataVolume的目录,对应的,宿主机下会多一个dataVolumeContaioner的目录,这两个目录之间可以实现数据共享。
也可以用docker inspect 容器id 命令,查看是否挂载成功。 在容器停止和退出后,主机修改的依然可以进行同步。以上对于容器内的目录是可读写的,如果想要容器内的目录只读,可以加上ro(read only )
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
2)用dockerFile添加
DockerFile是用来构建镜像的构建文件,是一系列命令和参数组成的脚本。相当于镜像image模板的描述文件,类似于Java的calss文件。
首先构建一个DockerFile
接下来去build它来生成镜像
docker build -f /mydocker/Dockerfile -t lyw/centos .
当运行run我这个名字叫lyw/centos的镜像生成容器的时候,就会新建两个容器卷。主机对应默认的地址,同样用inspire命令查询。
3)容器间的传递共享 volume-from
docker run -it --name dc01 --volume-from dc02 lyw/centos
相当于用容器dc02继承容器dc01,可以再新建一个容器dc03继承dc02,容器之间配置信息的传递,会一直持续到没有容器使用它,可以一直进行全量的备份。
5.Dockerfile命令
1)ENV、WORKID、RUN、EXPOSE、CMD、ENTRYPOINT命令
FROM centos
#环境变量
ENV MYPATH /tmp
#创建容器之后默认登录进来的工作目录
WORKDIR $MYPATH
#给简易版的centos安装vim ipconfig命令
RUN yum -y install vim
RUN yum -y install net-tools
#指定端口号
EXPOSE 80
#运行
CMD echo "succ-----1"
CMD /bin/bash
CMD可以用ENTRYPOTIN代替,其中CMD命令会被后面的CMD所覆盖,ENTRYPOINT不会。
比如执行以下指令:
docker run -it -p 7777:8888 tomcat ls -l
会得到以下的结果,可以看到此刻是没有容器在运行的,可以在github上看一下tomcat的dockerfile,它的最后一句是CMD ***。因此我们运行的 ls -l 把原本的CMD覆盖掉了。
2)ONBUILD命令:
FROM centos
RUN yum install curl
ENTRYPOINT ["curl" "-s" "http://ip.cn"]
ONBUILD RUN echo "father images onbuild"
build之后,让一个file去继承这个image(FROM 镜像名),build这个子类之后,就会触发父类的ONBUILD中的echo,打印出“father images onbuild"。
3)ADD、COPY命令
以一个自定义的tomcat9为实例:
FROM centos
MAINTAINER lyw<liuyw@163.com>
COPY c.txt /usr/local/copy.txt
#把java和tomcat添加到容器中 ADD是带解压功能的copy
ADD jdk-8u171-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.8.tar.gz /usr/local
#安装vim编辑器
RUN yum -y install vim
#设置登录时候的访问路径
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置Java与Tomcat的环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar && $JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPORT 8080
#启动时运行tomcat
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
运行的时候,在宿主机创建两个容器卷,一个用于部署tomcat,一个用于记录日志。在宿主机添加web.xml和jsp文件,通过容器卷会相应的出现在容器中。这时候通过浏览器访问tomcat,显示我们自己写的jsp文件,相应的日志也会打印在容器和宿主机中。
docker run -d -p 9080:8080