https://www.cnblogs.com/xiaochangwei/p/8204511.html
https://www.cnblogs.com/xiaochangwei/p/8204992.html
https://www.cnblogs.com/xiaochangwei/p/8205067.html
https://www.cnblogs.com/xiaochangwei/p/8268509.html
docker镜像可以完全看作一台全新的电脑使用,无论什么镜像都是对某一东西进行了配置,然后打包后可以快速移植到需要的地方直接使用
省去复杂的配置工作
比如java web项目部署,如果是新部署,需要装系统,配置jdk,maven,sql,redis等各类环境,费时费力还容易出错,
而docker就可以省去配置环境的麻烦,直接让你把war包丢进去,实现分分钟部署一个项目
从头开始简单的说下docker的使用
本次讲解环境为ubuntu 16.04
首先给ubuntu安装docker,我安装的是docker ee, 安装方法:https://docs.docker.com/engine/installation/linux/docker-ee/ubuntu/
安装好之后,便是启动docker
1 |
sudo service docker start |
与之对应的停止dokcer服务命令就是stop了
1 |
sudo service docker stop |
然后通过--version可以查看运行的docker版本
1 |
sudo docker --version |
启动后,是没有任何镜像的,不过可以通过pull命令获取相关镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
xiaochangwei@ubuntu:~/test$ xiaochangwei@ubuntu:~/test$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest 17eb1d58bf8c About an hour ago 505MB ubuntu 16.04 00fd29ccc6f1 3 weeks ago 111MB xiaochangwei@ubuntu:~/test$ xiaochangwei@ubuntu:~/test$ xiaochangwei@ubuntu:~/test$ sudo docker pull nginx Using default tag: latest latest: Pulling from library/nginx e7bb522d92ff: Pull complete 6edc05228666: Pull complete cd866a17e81f: Pull complete Digest: sha256:cf8d5726fc897486a4f628d3b93483e3f391a76ea4897de0500ef1f9abcd69a1 Status: Downloaded newer image for nginx:latest xiaochangwei@ubuntu:~/test$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest 17eb1d58bf8c About an hour ago 505MB nginx latest 3f8a4339aadd 9 days ago 108MB ubuntu 16.04 00fd29ccc6f1 3 weeks ago 111MB xiaochangwei@ubuntu:~/test$ xiaochangwei@ubuntu:~/test$ |
1 2 3 |
sudo docker pull nginx 默认获取最新版本,即TAG为latest的,如果要获取其他版本,则需要使用 sudo docker pull nginx:xxxx 获取镜像后,通过docker run使其运行起来 |
1 2 3 |
sudo docker ps -a 列出所有容器, 不加 -a 仅列出正在运行的,像退出了的或者仅仅只是创建了的就不列出来 sudo docker run -d -p 8800:80 --name nginx_xiao nginx #运行指定的镜像 dudo docker run -d --privileged=true -p 83:80 --name nginx83 nginx #提升权限 |
1 2 3 4 5 |
#宿主主机端口:容器内部端口 -d 后台运行 -p 8800:80 是指定对外暴露的端口 容器内部用80 对应外部宿主主机的的8800 代理一样 --name指定容器的名字 最后的nginx 代码要运行的镜像名字 有tag的加上tag 如 nginx:xxx 默认为latest 然后访问宿主主机地址+8800端口 |
表明nginx已经成功运行
pull到的镜像肯定有很多需要修改的地方,比如配置文件等或者要自己增加些什么玩意儿进去
1 |
sudo docker exec -it 54d26bbce3d6 /bin/bash |
通过exec命令进入到容器内部进行操作, 其中红色部分可以是容器id或容器名字
1 2 3 |
进入之后就和操作新的系统一样,操作完成之后输入exit退出 某些时候需要获取镜像信息详情,比如安装了mysql后需要获取镜像内部的IP,端口等 |
1 |
sudo docker inspect nginx_xiao |
这样会出来很多信息,可以通过grep检索需要的项目
1 2 3 4 5 |
xiaochangwei@ubuntu:~/test$ sudo docker inspect nginx_xiao |grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "172.17.0.2", "IPAddress": "172.17.0.2", xiaochangwei@ubuntu:~/test$ |
那么问题又来了, 进入容器内部并修改了东西后,怎么生成新的镜像供下次直接使用
1 2 3 4 5 6 7 8 9 10 |
xiaochangwei@ubuntu:~/test$ sudo docker commit nginx_xiao xiaochangwei/nginx:v1.0 sha256:9f2c1a649a75fc72af4c2d6972290d9bc5f97c62ac52d6705b902fcdefeceea1 xiaochangwei@ubuntu:~/test$ xiaochangwei@ubuntu:~/test$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE xiaochangwei/nginx v1.0 9f2c1a649a75 11 seconds ago 108MB tomcat latest 17eb1d58bf8c 4 hours ago 505MB nginx latest 3f8a4339aadd 9 days ago 108MB ubuntu 16.04 00fd29ccc6f1 3 weeks ago 111MB xiaochangwei@ubuntu:~/test$ |
1 2 3 4 5 6 7 |
sudo docker commit nginx_xiao xiaochangwei/nginx:v1.0 nginx_xiao 表示我们刚修改的容器名字或者id xiaochangwei/nginx:v1.0 为保存的镜像名字 :后面为tag 刚刚commit的镜像仅仅是保存在本地的,如果要提交到网络上供其他人pull 使用呢? 如 https://cloud.docker.com/ 1.在https://cloud.docker.com/上注册一个账号 2.提交本地镜像到https://cloud.docker.com/上去 |
1 2 3 4 5 6 7 8 |
这样别人就可以通过docker pull xiaochangwei/nginx:v1.0 来获取并使用这个镜像了 需要注意的是: sudo docker commit nginx_xiao <em>xiaochangwei</em>/nginx:v1.0 镜像名里面包含了 我注册的账户名,这里需要一致,否则无法push 到这里镜像怎么获取,查看,启动,编辑,保存,提交 容器查看 都知道了,但是怎么停止、启动、删除容器呢 1.通过 sudo docker ps -a查看存在的容器信息 2.通过 sudo docker start/stop/restart xxx 来启动、停止、重启指定的容器 2.通过 sudo docker rm xxx 指定容器名或者容器id来删除,删除前请先停止容器,保证在非运行状态 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
xiaochangwei@ubuntu:~/test$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 54d26bbce3d6 nginx "nginx -g 'daemon ..." 43 minutes ago Up 43 minutes 0.0.0.0:8800->80/tcp nginx_xiao xiaochangwei@ubuntu:~/test$ sudo docker restart nginx_xiao nginx_xiao xiaochangwei@ubuntu:~/test$ sudo docker stop nginx_xiao nginx_xiao xiaochangwei@ubuntu:~/test$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 54d26bbce3d6 nginx "nginx -g 'daemon ..." 44 minutes ago Exited (0) 2 seconds ago nginx_xiao xiaochangwei@ubuntu:~/test$ sudo docker rm nginx_xiao nginx_xiao xiaochangwei@ubuntu:~/test$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES xiaochangwei@ubuntu:~/test$ |
同样镜像的删除按如下操作
1.通过sudo docker images 列出所有镜像
2.通过sudo docker rmi xxx 来删除指定的镜像,镜像存在依赖关系,先删除最下层,最后删除顶层,建议根据镜像名字来删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
xiaochangwei@ubuntu:~/test$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE xiaochangwei/nginx v1.0 9f2c1a649a75 23 minutes ago 108MB tomcat latest 17eb1d58bf8c 4 hours ago 505MB nginx latest 3f8a4339aadd 9 days ago 108MB ubuntu 16.04 00fd29ccc6f1 3 weeks ago 111MB xiaochangwei@ubuntu:~/test$ sudo docker rmi tomcat Untagged: tomcat:latest Deleted: sha256:17eb1d58bf8cf6809a26c9c47396a259d419d795070670d5a1bf0cbe63f9167c Deleted: sha256:ba92fe7a45fb76c9842f81a978a3671d3229077811e18c892ec18ddf7a8f372e Deleted: sha256:909e728190891a5bc59fd5f20cc741a9f8cf05531008de8bf6fcb86cbf9b92b3 Deleted: sha256:757a35964f233352b539f21545c83f7443f666457075e177d5b88ae2afbc70ec Deleted: sha256:e9af3a1672101d2803af7a9af40b3442e6b2ac5236d27fb486ea34c2be773dcc Deleted: sha256:32e70354b98514f5c68cf18f01880e355826d7cd633eb7b303af25915e574556 Deleted: sha256:01cd90dce70e314277a0d5550578d8db86efd7aa512fec4587f971a1e2474b1f Deleted: sha256:49909967c97ee31e2f3f69bbb150807e18b290eb3ab7f39ba0db3cc426278420 Deleted: sha256:b0427413f858084dffd95e8b7c42968c12f8229925a0d4c15985722ccc3f90e9 Deleted: sha256:1af387e1b89f088f694f89d1bd03c91a4f28e7704c4cc151994d0a3bfae42abe Deleted: sha256:e3c3b2640184c780efdcc2a02fa3e4fdb7f96dceccc1452527d1e9a1a879399b Deleted: sha256:6fb895d7f122630fbb471eb29f6d5ee2db66425e885f2c22462525daa7d263c2 Deleted: sha256:e3a0c7535fa27c5bb3d91fa905d363bc6a572ea78aad4e5e17b47604c5d2289f Deleted: sha256:532ea8d384305c2f5fbcd946e0c7ce71d547550c1fa2f6726d37d26688c9e6f8 Deleted: sha256:dfde2fab09732f8a2ae1a51362222e205fda934baccc8017b23867a2e4a1eb90 xiaochangwei@ubuntu:~/test$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE xiaochangwei/nginx v1.0 9f2c1a649a75 24 minutes ago 108MB nginx latest 3f8a4339aadd 9 days ago 108MB ubuntu 16.04 00fd29ccc6f1 3 weeks ago 111MB xiaochangwei@ubuntu:~/test$ |
以上就是docker的基本使用命令了,下一篇将讲解通过dockerfile来构建镜像
上一篇讲解了docker的基本使用 http://www.cnblogs.com/xiaochangwei/p/8204511.html
虽然通过修改获取到的镜像可以达到使用目的,但是多操作几次就会发现,操作还是比较繁琐,扩充也不是很方便
而取而代之的方法就是通过Dockerfile来构建自己想要的镜像,
dockerfile是用来构建镜像的一组命令文件,一个命令为一层的构建,然后使用
1 |
<span class="pln">docker build </span><span class="pun">[</span><span class="pln">OPTIONS</span><span class="pun">]</span><span class="pln"> PATH </span><span class="pun">|</span><span class="pln"> URL </span><span class="pun">|</span> <span class="pun">-</span> |
进行编译,制作成镜像
实例
使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。
1 |
<span class="pln">docker build </span><span class="pun">-</span><span class="pln">t runoob</span><span class="pun">/</span><span class="pln">ubuntu</span><span class="pun">:</span><span class="pln">v1 </span><span class="pun">.</span> |
使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。
1 |
<span class="pln">docker build github</span><span class="pun">.</span><span class="pln">com</span><span class="pun">/</span><span class="pln">creack</span><span class="pun">/</span><span class="pln">docker</span><span class="pun">-</span><span class="pln">firefox</span> |
也可以通过 -f Dockerfile 文件的位置:
1 |
<span class="pln">$ docker build </span><span class="pun">-</span><span class="pln">f </span><span class="pun">/</span><span class="pln">path</span><span class="pun">/</span><span class="pln">to</span><span class="pun">/</span><span class="pln">a</span><span class="pun">/</span><span class="typ">Dockerfile</span> <span class="pun">.</span> |
在linux下编译过C程序的同学肯定知道Makefile, Dockerfile和其一样,就是为了达到快速编译(生成)想要的镜像的
下面以j2ee最常用的场景:在ubuntu下配置jdk环境,并用tomcat发布一个war包的web项目
1.准备好需要的jdk 和 tomcat
1 2 3 4 5 6 7 8 9 10 |
xiaochangwei@ubuntu:~/test$ date Thu Jan 4 23:00:38 PST 2018 xiaochangwei@ubuntu:~/test$ ls -l total 14180 -rw-rw-r-- 1 xiaochangwei xiaochangwei 14501238 Dec 19 23:29 demo.war -rw-rw-r-- 1 xiaochangwei xiaochangwei 551 Jan 4 18:18 Dockerfile drwxr-xr-x 8 xiaochangwei xiaochangwei 4096 Dec 12 2016 jdk drwxrwxr-x 6 xiaochangwei xiaochangwei 4096 Dec 20 21:51 maven drwxrwxr-x 9 xiaochangwei xiaochangwei 4096 Dec 20 18:28 tomcat xiaochangwei@ubuntu:~/test$ |
这里我将jdk和tomcat的tar.gz 包都通过 tar -zxvf解压了 并通过mv 修改了文件夹名字为jdk和tomcat
(其实不解压也可以,2中说明为啥我要解压,为啥不用解压而我又先解压了)
2.编写Dockerfile(示例如下)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
1 FROM ubuntu:16.04 2 MAINTAINER changw.xiao@qq.com 3 COPY ./jdk /usr/local/jdk 4 COPY ./tomcat /tomcat 5 COPY ./maven /usr/local/maven 6 7 ENV M2_HOME=/usr/local/maven 8 ENV JAVA_HOME /usr/local/jdk 9 ENV JRE_HOME $JAVA_HOME/jre 10 ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib 11 ENV PATH $PATH:$JAVA_HOME/bin 12 ENV PATH $PATH:$M2_HOME/bin 13 ENV CATALINA_OPTS -Xms128m -Xmx1024m -XX:PermSize=64M -XX:MaxPermSize=512M 14 RUN cd /tomcat/logs && echo "1" >>count.txt 15 ENTRYPOINT /tomcat/bin/startup.sh && tail -F /tomcat/logs/catalina.out |
根据显示的行号来解释
1.我们制作镜像的基础,在ubuntu16.04的系统上构建后续操作
2.维护者信息
3~5.复制当前目录下的jdk目录 到容器内部的/usr/local/jdk目录下
解释下:
Dockerfile提供了COPY 和 ADD 两种方式
COPY : COPY ./jdk /usr/local/jdk #直接原样拷贝过去
ADD : ADD ./jdk-8u121-linux-x64.tar.gz /usr/local/java #拷贝过去,如果是压缩包还会自动帮着解压,本来是好事,但是解压后文件夹名字一长串,不便于记忆,就直接先解压好重命名好了再COPY过去
7~13.一看就知道了 通过 ENV 来设置各种环境变量
14.为了示例RUN的使用, 通过RUN命令,后面就可以执行各种linux命令
15.表示启动容器后执行的操作
将上述文件保存为Dockerfile 注意大小写,没有后缀,然后进入到该目录,执行命令构建镜像
1 2 |
sudo docker build -t xiaochangwei/tomcat:v1 --rm=true . #如果改变了Dockerfile名字,则需要指定 -f 文件名称 |
xiaochangwei/tomcat:v1 镜像的名字及tag, 最后的点代表当前目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
xiaochangwei@ubuntu:~/test$ pwd /home/xiaochangwei/test xiaochangwei@ubuntu:~/test$ ls -l total 14180 -rw-rw-r-- 1 xiaochangwei xiaochangwei 14501238 Dec 19 23:29 demo.war -rw-rw-r-- 1 xiaochangwei xiaochangwei 551 Jan 4 18:18<strong> Dockerfile</strong> drwxr-xr-x 8 xiaochangwei xiaochangwei 4096 Dec 12 2016 jdk drwxrwxr-x 6 xiaochangwei xiaochangwei 4096 Dec 20 21:51 maven drwxrwxr-x 9 xiaochangwei xiaochangwei 4096 Dec 20 18:28 tomcat xiaochangwei@ubuntu:~/test$ cat Dockerfile FROM ubuntu:16.04 MAINTAINER changw.xiao@qq.com COPY ./jdk /usr/local/jdk COPY ./tomcat /usr/local/tomcat COPY ./maven /usr/local/maven ENV M2_HOME=/usr/local/maven ENV JAVA_HOME /usr/local/jdk ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib ENV PATH $PATH:$JAVA_HOME/bin ENV PATH $PATH:$M2_HOME/bin ENV CATALINA_OPTS -Xms128m -Xmx1024m -XX:PermSize=64M -XX:MaxPermSize=512M #RUN cd /usr/local/tomcat/logs && echo "1" >>count.txt ENTRYPOINT /usr/local/tomcat/bin/startup.sh && tail -F /usr/local/tomcat/logs/catalina.out xiaochangwei@ubuntu:~/test$ xiaochangwei@ubuntu:~/test$ sudo docker build -t xiaochangwei/tomcat:v1 --rm=true . Sending build context to Docker daemon 410.8MB Step 1/13 : FROM ubuntu:16.04 ---> 00fd29ccc6f1 Step 2/13 : MAINTAINER changw.xiao@qq.com ---> Running in 76c030597a76 ---> b60e5688bbeb Removing intermediate container 76c030597a76 Step 3/13 : COPY ./jdk /usr/local/jdk ---> 7ed40312898c Removing intermediate container 4bafdad847ea Step 4/13 : COPY ./tomcat /usr/local/tomcat ---> b3f27950da80 Removing intermediate container 3b47f6478612 Step 5/13 : COPY ./maven /usr/local/maven ---> 693be0d164e1 Removing intermediate container 384a0c731ee5 Step 6/13 : ENV M2_HOME /usr/local/maven ---> Running in 976e32621210 ---> 26c40484df7c Removing intermediate container 976e32621210 Step 7/13 : ENV JAVA_HOME /usr/local/jdk ---> Running in d0ae07b77311 ---> 198ceaed2dcf Removing intermediate container d0ae07b77311 Step 8/13 : ENV JRE_HOME $JAVA_HOME/jre ---> Running in ec049c30011d ---> 1c334836ace7 Removing intermediate container ec049c30011d Step 9/13 : ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib ---> Running in 4be76497d654 ---> 70ae97a52bc1 Removing intermediate container 4be76497d654 Step 10/13 : ENV PATH $PATH:$JAVA_HOME/bin ---> Running in 2928a173dced ---> aa1a8b8cc887 Removing intermediate container 2928a173dced Step 11/13 : ENV PATH $PATH:$M2_HOME/bin ---> Running in b79043df89ae ---> 85ad599def5d Removing intermediate container b79043df89ae Step 12/13 : ENV CATALINA_OPTS -Xms128m -Xmx1024m -XX:PermSize=64M -XX:MaxPermSize=512M ---> Running in fced93182cb3 ---> e27958a0c46d Removing intermediate container fced93182cb3 Step 13/13 : ENTRYPOINT /usr/local/tomcat/bin/startup.sh && tail -F /usr/local/tomcat/logs/catalina.out ---> Running in ba924a892390 ---> 62cedd29ce8f Removing intermediate container ba924a892390 Successfully built 62cedd29ce8f Successfully tagged xiaochangwei/tomcat:v1 xiaochangwei@ubuntu:~/test$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE xiaochangwei/tomcat v1 62cedd29ce8f 48 seconds ago 505MB xiaochangwei/nginx v1.0 9f2c1a649a75 About an hour ago 108MB nginx latest 3f8a4339aadd 9 days ago 108MB ubuntu 16.04 00fd29ccc6f1 3 weeks ago 111MB xiaochangwei@ubuntu:~/test$ |
至此,我们需要的tomcat镜像就已经制作完成了
也发布到docker cloud上去吧
上传时间根据网络和镜像大小来决定,网络差的同学多等待下
docker cloud上也有了,不过提醒下,这里要稍微多等下,有时候命令行显示上传完了,但是网页端还是没有,不用急,多等会儿
启动试试看
1 |
sudo docker run -p 8899:8080 --name tomcat_xiao xiaochangwei/tomcat:v1 |
如果想后台运行 可以在run后加 -d 参数即:sudo docker run -d -p 8899:8080 --name tomcat_xiao xiaochangwei/tomcat:v1 其余参数不解释,看上一篇文章
看见猫了就表示对了
然后问题又来了,容器倒是启动起来了,但是怎么把我们自己的war包丢里面运行起来呢?
1 |
sudo docker <strong>cp</strong> demo.war tomcat_xiao:/usr/local/tomcat/webapps |
demo.war 不解释
tomcat_xiao:/usr/local/tomcat/webapps 冒号前面为容器名称或者id, 冒号后面为tomcat的webapps全路径
丢进去就好了,会自动发布的,不需要我们再自己去启动tomcat了,因为容器启动后tomcat就默认启动了 Dockerfile最后一行就是启动tomcat
丢进去后,控制台就会检测到,并自动部署
好了,满足基本需要了
这里面有一项重要的参数 -v 目录挂载,就是让容器内部目录和宿主主机目录关联起来,这样就可以直接操作宿主主机目录而不用再操作具体容器了 后续文章中进行讲解
后续会讲到
目录挂载
与jenkins整合,实现持续集成
还有暂时没想到的东西
发表评论