第 3 章 Docker 高级实践
在这一部分我们主要来介绍一些Docker的高级内容: Dockerfile 和 Docker compose
3.1 Dockerfile
Dockerfile我们从下面的几个方面来介绍: Dockerfile简介 Dockerfile快速入门 Dockerfile详解 Dockerfile简单
实践
3.1.1 Dockerfile简介
什么是Dockerfile Dockerfile类似于我们学习过的脚本,将我们在上面学到的docker镜像,使用自动化的方式实
现出来。
Dockerfile的作用
1、找一个镜像: ubuntu
2、创建一个容器: docker run ubuntu
3、进入容器: docker exec -it 容器 命令
4、操作: 各种应用配置 …
5、构造新镜像: docker commit
Dockerfile 使用准则
1、大: 首字母必须大写D
2、空: 尽量将Dockerfile放在空目录中。
3、单: 每个容器尽量只有一个功能。
4、少: 执行的命令越少越好。
Dockerfile 分为四部分:
基础镜像信息 从哪来?
维护者信息 我是谁?
镜像操作指令 怎么干?
容器启动时执行 指令 嗨!!!
Dockerfile文件内容:
首行注释信息
指令(大写) 参数
Dockerfile使用命令:
#构建镜像命令格式:
docker build -t [镜像名]:[版本号][Dockerfile所在目录]
#构建样例:
docker build -t nginx:v0.2 /opt/dockerfile/nginx/
#参数详解:
-t 指定构建后的镜像信息,
/opt/dockerfile/nginx/ 则代表Dockerfile存放位置,如果是当前目录,则用 .(点)表示
3.1.2 Dockerfile快速入门
接下来我们快速的使用Dockerfile来基于ubuntu创建一个定制化的镜像:nginx。
#创建Dockerfile专用目录
:~$ mkdir ./docker/images/nginx -p
:~$ cd docker/images/nginx/
#创建Dockerfile文件
:~/docker/images/nginx$ vim Dockerfile
测试
#创建Dockerfile专用目录--创建Dockerfile文件
chengpeng@chengpeng:~$ mkdir docker-file/dockerfile/nginx -p
chengpeng@chengpeng:~/docker-file/dockerfile/nginx$ vim Dockerfile-->拷贝dockerfile内容
dockerfile内容
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER panda kstwoak47@163.com
# 执行命令
RUN mkdir hello
RUN mkdir world
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install nginx -y
# 对外端口
EXPOSE 80
进行构建操作
#构建镜像
chengpeng@chengpeng:~/docker-file/dockerfile/nginx$ docker build -t ubuntu-nginx:v1.0 .
[+] Building 18.4s (11/11) FINISHED
=> [internal] load build definition from Dockerfile 0.2s
=> => transferring dockerfile: 441B 0.0s
=> [internal] load .dockerignore 0.2s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:latest 0.0s
=> [1/7] FROM docker.io/library/ubuntu 0.0s
=> [2/7] RUN mkdir hello 0.5s
=> [3/7] RUN mkdir world 0.6s
=> [4/7] RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list 0.6s
=> [5/7] RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list 0.6s
=> [6/7] RUN apt-get update 4.7s
=> [7/7] RUN apt-get install nginx -y 10.7s
=> exporting to image 0.3s
=> => exporting layers 0.3s
=> => writing image sha256:d94bf0f823d0921ffd6474bfe813af5fe526744df6e471cfa70ed9cef5ffdc90 0.0s
=> => naming to docker.io/library/ubuntu-nginx:v1.0
#查看新生成镜像
chengpeng@chengpeng:~/docker-file/dockerfile/nginx$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-nginx v1.0 d94bf0f823d0 About a minute ago 179MB
#查看构建历史
chengpeng@chengpeng:~/docker-file/dockerfile/nginx$ docker history d94bf0f823d0
IMAGE CREATED CREATED BY SIZE COMMENT
d94bf0f823d0 5 minutes ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 5 minutes ago RUN /bin/sh -c apt-get install nginx -y # bu… 55.6MB buildkit.dockerfile.v0
<missing> 5 minutes ago RUN /bin/sh -c apt-get update # buildkit 45.7MB buildkit.dockerfile.v0
<missing> 5 minutes ago RUN /bin/sh -c sed -i 's/security.ubuntu.com… 2.42kB buildkit.dockerfile.v0
<missing> 5 minutes ago RUN /bin/sh -c sed -i 's/archive.ubuntu.com/… 2.42kB buildkit.dockerfile.v0
<missing> 5 minutes ago RUN /bin/sh -c mkdir world # buildkit 0B buildkit.dockerfile.v0
<missing> 5 minutes ago RUN /bin/sh -c mkdir hello # buildkit 0B buildkit.dockerfile.v0
<missing> 5 minutes ago MAINTAINER panda kstwoak47@163.com 0B buildkit.dockerfile.v0
<missing> 4 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 4 weeks ago /bin/sh -c #(nop) ADD file:63d5ab3ef0aab308c… 77.8MB
<missing> 4 weeks ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 4 weeks ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 4 weeks ago /bin/sh -c #(nop) ARG LAUNCHPAD_BUILD_ARCH 0B
<missing> 4 weeks ago /bin/sh -c #(nop) ARG RELEASE 0B
#注意:
因为容器没有启动命令,所以肯定访问不了
优化刚刚的Dockerfile文件
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER panda kstwoak47@163.com
# 执行命令
RUN mkdir hello && mkdir world
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list && sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update && apt-get install nginx -y
# 对外端口
EXPOSE 80
运行修改好的Dockerfile进行构建
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.2 .
:~/docker/images/nginx$ docker history ubuntu-nginx:v0.2
#对比两个镜像的大小
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-2$ docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-nginx v2.0 04e3d2ae1f41 52 seconds ago 179MB
ubuntu-nginx v1.0 d94bf0f823d0 59 minutes ago 179MB
#深度对比连个镜像的大小
:~/docker/images/nginx$ docker inspect 04e3d2ae1f41
"Size": 179147395,
"VirtualSize": 179147395,
:~/docker/images/nginx$ docker inspect d94bf0f823d0
"Size": 179149812,
"VirtualSize": 179149812,
Dockerfile构建过程:
从基础镜像1运行一个容器A 遇到一条Dockerfile指令,都对容器A做一次修改操作
执行完毕一条命令,提交生成一个新镜像
2 再基于新的镜像2运行一个容器B 遇到一条Dockerfile指令,都对容器B做一次
修改操作 执行完毕一条命令,提交生成一个新镜像3 …
构建过程镜像介绍 构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用来启动容器,通过查看容器
效果,从侧面能看到我们每次构建的效果。提供了镜像调试的能力–>构建越少,大小越小
3.1.3 基础指令详解
FROM
FROM
#格式:
FROM <image>
FROM <image>:<tag>
#解释:
#FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
#可以有多个FROM语句,来创建多个image-->不建议使用
#FROM 后面是有效的镜像名称,如果该镜像没有在你的本地仓库,那么就会从远程仓库Pull取,如果远程也没有,就报错失败
#下面所有的 系统可执行指令 在 FROM 的镜像中执行。
MAINTAINER
MAINTAINER
#格式:
MAINTAINER <name>
#解释:
#指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息
RUN
RUN
#格式:
RUN <command> (shell模式)
RUN["executable", "param1", "param2"] (exec 模式)
#解释:
#表示当前镜像构建时候运行的命令,如果有确认输入的话,一定要在命令中添加 -y
#如果命令较长,那么可以在命令结尾使用 \ 来换行
#生产中,推荐使用上面数组的格式
#注释:
#shell模式:类似于 /bin/bash -c command
#举例: RUN echo hello
#exec模式:类似于 RUN["/bin/bash", "-c", "command"]
#举例: RUN["echo", "hello"]
EXPOSE
EXPOSE
#格式:
EXPOSE <port> [<port>...]
#解释:
设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,
还需要启动容器时增加-p或者-P参数对容器的端口进行分配。
EXPOSE 80
3.1.4 运行时指令详解
CMD
CMD
#格式:
CMD ["executable","param1","param2"] (exec 模式)推荐
CMD command param1 param2 (shell模式)
CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数;
#解释:
#CMD指定容器启动时默认执行的命令
#每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行
#如果你在启动容器的时候使用docker run 指定的运行命令,那么会覆盖CMD命令。
#举例: CMD ["/usr/sbin/nginx","-g","daemon off;"]
"/usr/sbin/nginx" nginx命令
"-g" 设置配置文件外的全局指令
"daemon off;" 后台守护程序开启方式 关闭
#CMD指令实践:
#修改Dockerfile文件内容:
#在上一个Dockerfile文件内容基础上,末尾增加下面一句话:
CMD ["/usr/sbin/nginx","-g","daemon off;"]
#构建镜像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v3.0 .
#根据镜像创建容器,创建时候,不添加执行命令
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-3$ docker run -itd --name unginx-1 ubuntu-nginx:v3.0
#根据镜像创建容器,创建时候,添加执行命令/bin/bash
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-3$ docker run -itd --name unginx-2 ubuntu-nginx:v3.0 /bin/bash
#发现两个容器的命令行是不一样的
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-3$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e1a0dd1003ab ubuntu-nginx:v3.0 "/bin/bash" 6 seconds ago Up 5 seconds 80/tcp unginx-2
7cbb79a2acf0 ubuntu-nginx:v3.0 "/usr/sbin/nginx -g …" 4 minutes ago Up 4 minutes 80/tcp unginx-1
ENTRYPOINT
ENTRYPOINT
#格式:
ENTRYPOINT ["executable", "param1","param2"] (exec 模式)
ENTRYPOINT command param1 param2 (shell 模式)
#解释:
#和CMD 类似都是配置容器启动后执行的命令,并且不会被docker run 提供的参数覆盖。
#每个Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。
#生产中我们可以同时使用ENTRYPOINT 和CMD,
#想要在docker run 时被覆盖,可以使用"docker run --entrypoint"
#ENTRYPOINT指令实践:
#修改Dockerfile文件内容:
#在上一个Dockerfile 文件内容基础上,修改末尾的CMD 为ENTRYPOINT:
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
#构建镜像
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-4$ docker build -t ubuntu-nginx:v4.0 .
#根据镜像创建容器,创建时候,不添加执行命令
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-4$ docker run -itd --name unginx-3 ubuntu-nginx:v4.0
#根据镜像创建容器,创建时候,添加执行命令/bin/bash-->ENTRYPOINT启动失效了
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-4$ docker run -itd --name unginx-4 ubuntu-nginx:v4.0 /bin/bash
#查看ENTRYPOINT是否被覆盖
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-4$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
74be4034e4ad ubuntu-nginx:v4.0 "/usr/sbin/nginx -g …" 46 seconds ago Exited (1) 45 seconds ago unginx-4
2b39d1d5475c ubuntu-nginx:v4.0 "/usr/sbin/nginx -g …" About a minute ago Up About a minute 80/tcp unginx-3
#根据镜像创建容器,创建时候,使用--entrypoint参数,添加执行命令/bin/bash
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-4$ docker run --entrypoint "/bin/bash" --name nginx-5 -itd ubuntu-nginx:v4.0
#查看ENTRYPOINT是否被覆盖
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-4$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b28c789c5ec ubuntu-nginx:v4.0 "/bin/bash" 3 seconds ago Up 2 seconds 80/tcp nginx-5
CMD ENTRYPOINT 综合使用实践–>相当于组合拼接
#修改Dockerfile文件内容:
# 在上一个Dockerfile文件内容基础上,修改末尾的ENTRYPOINT
:~/docker/images/nginx$ vim Dockerfile
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-g"]
#构建镜像
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-5$ docker build -t ubuntu-nginx:v5.0 .
#根据镜像创建容器,创建时候,不添加执行命令
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-5$ docker run -itd --name unginx-6 ubuntu-nginx:v5.0
#查看效果
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-5$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b0a7e6b32642 ubuntu-nginx:v5.0 "/usr/sbin/nginx -g" 28 seconds ago Exited (1) 27 seconds ago unginx-6--->由于没有写全命令,所以启动不起来
#根据镜像创建容器,创建时候,不添加执行命令,覆盖cmd的参数 -g "daemon off;"
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-5$ docker run -itd --name unginx-7 ubuntu-nginx:v5.0 -g "daemon off;"
#查看效果
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-5$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f13303834e49 ubuntu-nginx:v5.0 "/usr/sbin/nginx -g …" 3 seconds ago Up 2 seconds 80/tcp unginx-7
#注释:
#任何docker run设置的命令参数或者CMD指令的命令,都将作为ENTRYPOINT 指令的命令参数,追加到
ENTRYPOINT指令之后
3.1.5 文件编辑指令详解
ADD
#ADD
#格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
#解释:
#将指定的<src> 文件复制到容器文件系统中的<dest>
#src 指的是宿主机,dest 指的是容器
#所有拷贝到container 中的文件和文件夹权限为0755,uid 和gid 为0
#如果文件是可识别的压缩格式,则docker 会帮忙解压缩--->tar可以zip不可以
#注意:
#1、如果源路径是个文件,且目标路径是以/ 结尾, 则docker 会把目标路径当作一个目录,会把源文件拷贝到该目录下;
#如果目标路径不存在,则会自动创建目标路径。
#2、如果源路径是个文件,且目标路径不是以/ 结尾,则docker 会把目标路径当作一个文件。
#如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;
#如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。
#如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。注意,这种情况下,最好显示的以/ 结尾,以避免混淆。
#3、如果源路径是个目录,且目标路径不存在,则docker 会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。
#如果目标路径是个已经存在的目录,则docker 会把源路径目录下的文件拷贝到该目录下。
#4、如果源文件是个压缩文件,则docker 会自动帮解压到指定的容器目录中。
#ADD实践:
#拷贝普通文件
:~/docker/images/nginx$ vim Dockerfile
#Dockerfile文件内容
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu:16.04
# 镜像作者
MAINTAINER panda kstwoak47@163.com
# 执行命令
ADD ["sources.list","/etc/apt/sources.list"]
RUN apt-get clean
RUN apt-get update
RUN apt-get install nginx -y
# 对外端口
EXPOSE 80
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-6$ cp /etc/apt/sources.list ./
#构建镜像
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-6$ docker build -t ubuntu-nginx:v6.0 .
#根据镜像创建容器,创建时候,不添加执行命令进入容器查看效果
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-6$ docker run -it --name unginx-8 ubuntu-nginx:v6.0-->就进入了
#拷贝压缩文件
tar zcvf this.tar.gz ./*
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-6$ ls
Dockerfile sources.list this.tar.gz
#编辑Dockerfile文件内容
...
# 执行命令
...
# 增加文件
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu:16.04
# 镜像作者
MAINTAINER panda kstwoak47@163.com
# 执行命令
ADD ["this.tar.gz","/nihao/"]
#ADD ["sources.list","/etc/apt/sources.list"]
#RUN apt-get clean
#RUN apt-get update
#RUN apt-get install nginx -y
# 对外端口
EXPOSE 80
...
#构建镜像
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-6$ docker build -t ubuntu-nginx:v6.0 .
#根据镜像创建容器,创建时候,不添加执行命令进入容器查看效果
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-6$ docker run -it --name unginx-9 ubuntu-nginx:v6.0
root@d19bd1f56270:/# ls
bin boot dev etc home lib lib64 media mnt nihao opt proc root run sbin srv sys tmp usr var
root@d19bd1f56270:/# cd nihao/
root@d19bd1f56270:/nihao# ls
Dockerfile sources.list
COPY
#COPY
#格式:
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
#解释:
#COPY 指令和ADD 指令功能和使用方式类似。只是COPY 指令不会做自动解压工作。
#单纯复制文件场景,Docker 推荐使用COPY
#COPY实践
#修改Dockerfile文件内容:
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER panda kstwoak47@163.com
# 执行命令
ADD ["sources.list","/etc/apt/sources.list"]
RUN apt-get clean
RUN apt-get update
RUN apt-get install nginx -y
COPY ["index.html","/var/www/html/"]--->不清楚为什么index目录是在这里
# 对外端口
EXPOSE 80
#运行时默认命令
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
index.html 文件内容:
<h1>hello world </h1>
<h1>hello docker </h1>
<h1>hello nginx</h1>
#构建镜像
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-7$ docker build -t ubuntu-nginx:v7.0 .
#根据镜像创建容器,创建时候,不添加执行命令
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-7$ docker run -itd --name unginx-10 ubuntu-nginx:v7.0
#查看nginx-10信息
chengpeng@chengpeng: docker inspect unginx-10
#浏览器访问nginx查看效果
VOLUME
#VOLUME
#格式:
VOLUME ["/data"]
#解释:
#VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点
#通过VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
#举例:
VOLUME ["/var/lib/tomcat7/webapps/"]
VOLUME实践–>用它创建的镜像,可以用其他容器挂载
#VOLUME实践
#修改Dockerfile文件内容:
#将COPY替换成为VOLUME
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ vim Dockerfile
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu:16.04
# 镜像作者
MAINTAINER panda kstwoak47@163.com
# 执行命令
ADD ["sources.list","/etc/apt/sources.list"]
RUN apt-get clean
RUN apt-get update
RUN apt-get install nginx -y
# 对外端口
EXPOSE 80
VOLUME ["/helloworld/"]
#运行时默认命令
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
...
#构建镜像
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker build -t ubuntu-nginx:v8.0 .
#创建数据卷容器
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker run -itd --name unginx-11 ubuntu-nginx:v8.0
#查看镜像信息
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker inspect unginx-11
"Volumes": {
"/helloworld/": {}
},
#验证操作
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker run -itd --name v-1 --volumes-from unginx-11 nginx
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker run -itd --name v-2 --volumes-from unginx-11 nginx
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e47d4c74e2e9 nginx "/docker-entrypoint.…" 3 seconds ago Up 3 seconds 80/tcp v-2
6939a6610676 nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 80/tcp v-1
#进入容器1
itcast@itcast:~/docker-file/dockerfile/nginx-8$ docker exec -it v-1 /bin/bash
root@6939a6610676:/# ls
bin docker-entrypoint.d helloworld lib32 media proc sbin tmp
boot docker-entrypoint.sh home lib64 mnt root srv usr
dev etc lib libx32 opt run sys var
root@6939a6610676:/# cd helloworld/
root@6939a6610676:/helloworld# ls
root@6939a6610676:/helloworld# ls
helloworld
root@6939a6610676:/helloworld# rm helloworld/
rm: cannot remove 'helloworld/': Is a directory
root@6939a6610676:/helloworld# rm -rf helloworld/
root@6939a6610676:/helloworld# ls
root@6939a6610676:/helloworld#
#进入容器2
itcast@itcast:~/docker-file/dockerfile/nginx-8$ docker exec -it v-2 /bin/bash
root@e47d4c74e2e9:/# ls
bin docker-entrypoint.d helloworld lib32 media proc sbin tmp
boot docker-entrypoint.sh home lib64 mnt root srv usr
dev etc lib libx32 opt run sys var
root@e47d4c74e2e9:/# cd helloworld/
root@e47d4c74e2e9:/helloworld# ls
root@e47d4c74e2e9:/helloworld# mkdir helloworld
root@e47d4c74e2e9:/helloworld# ls
helloworld
root@e47d4c74e2e9:/helloworld# ls
3.1.6 环境指令详解
ENV
#ENV
#格式:
ENV <key> <value> (一次设置一个环节变量)
ENV <key>=<value> ... (一次设置一个或多个环节变量)
#解释:
#设置环境变量,可以在RUN 之前使用,然后RUN 命令时调用,容器启动时这些环境变量都会被指定
ENV实践
#ENV实践:
#命令行创建ENV的容器
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker run -e NIHAO="helloworld" -itd --name ubuntu-111 ubuntu /bin/bash
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e68dba85564d ubuntu "/bin/bash" 7 seconds ago Up 6 seconds ubuntu-111
#进入容器ubuntu-111
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker exec -it ubuntu-111 /bin/bash
root@e68dba85564d:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@e68dba85564d:/# echo $NIHAO
helloworld
#修改Dockerfile文件内容:
#在上一个Dockerfile 文件内容基础上,在RUN 下面增加一个ENV
ENV NIHAO=helloworld
...
#构建镜像
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-9$ docker build -t ubuntu-nginx:v9.0 .
#根据镜像创建容器,创建时候,不添加执行命令
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-9$ docker run -itd --name unginx-12 ubuntu-nginx:v9.0
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-9$ docker exec -it unginx-12 /bin/bash
root@6af995b1eda0:/# echo $NIHAO
helloworld
root@6af995b1eda0:/#
WORKDIR
#WORKDIR
#格式:
WORKDIR /path/to/workdir (shell 模式)
#解释:
#切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。相当于cd
#可以多次切换(相当于cd 命令),
#也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
#举例:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
#则最终路径为/a/b/c
WORKDIR实践
#WORKDIR实践:
#修改Dockerfile文件内容:
# 在上一个Dockerfile 文件内容基础上,在RUN 下面增加一个WORKDIR
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu:16.04
# 镜像作者
MAINTAINER panda kstwoak47@163.com
# 执行命令
ADD ["sources.list","/etc/apt/sources.list"]
RUN apt-get clean
RUN apt-get update
RUN apt-get install nginx -y
WORKDIR /nihao/chengpeng/
RUN ["touch","chengpeng1.txt"]
WORKDIR /nihao
RUN ["touch","chengpeng2.txt"]
WORKDIR chengpeng
RUN ["touch","chengpeng3.txt"]
# 对外端口
EXPOSE 80
#运行时默认命令
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
...
#构建镜像
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-10$ docker build -t ubuntu-nginx:v11.0 .
#根据镜像创建容器,创建时候,不添加执行命令
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-10$ docker run -itd --name unginx-13 ubuntu-nginx:v11.0
#进入镜像
docker exec -it nginx-13 /bin/bash
root@c6c06e640a87:/nihao/chengpeng# ls
chengpeng1.txt chengpeng3.txt
root@c6c06e640a87:/nihao/chengpeng# pwd
/nihao/chengpeng
root@c6c06e640a87:/nihao/chengpeng# cd ..
root@c6c06e640a87:/nihao# ls
chengpeng chengpeng2.txt
root@c6c06e640a87:/nihao# cd ..
root@c6c06e640a87:/# ls
USER与ARG
#USER
#格式:
USER daemon
#解释:
#指定运行容器时的用户名和UID,后续的RUN 指令也会使用这里指定的用户。
#如果不输入任何信息,表示默认使用root 用户
#ARG
#格式:
ARG <name>[=<default value>]
#解释:
#ARG 指定了一个变量在docker build 的时候使用,可以使用--build-arg <varname>=<value>来指定参数的值,不过
#如果构建的时候不指定就会报错。
3.1.7 触发器指令详解
触发器指令
ONBUILD
#格式:
ONBUILD [command]
#解释:
#当一个镜像A被作为其他镜像B的基础镜像时,这个触发器才会被执行,
#新镜像B在构建的时候,会插入触发器中的指令。
#使用场景对于版本控制和方便传输,适用于其他用户。
触发器实践
#编辑Dockerfile
:~/docker/images/nginx$ vim Dockerfile
#内容如下:
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER panda kstwoak47@163.com
# 执行命令
ADD ["sources.list","/etc/apt/sources.list"]
RUN apt-get clean
RUN apt-get update
RUN apt-get install nginx -y
#触发器
ONBUILD COPY ["index.html","/var/www/html/"]
# 对外端口
EXPOSE 80
#运行时默认命令
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
#构建镜像
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ docker build -t ubuntu-nginx:v11.0 .
#根据镜像创建容器,
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ docker run -itd --name unginx-14 ubuntu-nginx:v11.0
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$$docker ps
#查看镜像信息
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ docker inspect ubuntu-nginx:v11.0
"OnBuild": [
"COPY [\"index.html\",\"/var/www/html/\"]"
],
#访问容器页面,是否被更改
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ docker inspect unginx-14 //查看ip
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ curl 172.17.0.15(docker内部的ip) --->发现我修改的index.html并没有修改
#构建子镜像Dockerfile文件
FROM ubuntu-nginx:v11.0
MAINTAINER panda kstwoak47@163.com
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
#构建子镜像
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-12$ docker build -t ubuntu-nginx:v12.0 .
#根据镜像创建容器,
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-12$ docker run -itd --name unginx-15 ubuntu-nginx:v12.0
#查看镜像信息
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-12$ docker inspect ubuntu-nginx:v12.0
"OnBuild": null,
docker ps
#访问容器页面,是否被更改
#访问容器页面,是否被更改
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ docker inspect unginx-15 //查看ip
chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ curl 172.17.0.16(docker内部的ip) --->发现我修改的index.html修改了
3.1.8 Dockerfile构建缓存
我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存。
#取消缓存:
docker build --no-cache -t [镜像名]:[镜像版本][Dockerfile位置]
3.2 Dockerfile构建go环境
接下来我们就来做一个工作实践,搭建一个go环境,然后尝试使用Dockerfile的方式,构造一个镜像。
3.2.1 项目描述
beego官方网站:https://beego.me/
我们借助于beego的简介,部署一个go项目,然后运行起来。
3.2.2 手工部署go语言环境
需求:
基于docker镜像,手工部署go项目环境
方案分析
1、docker环境部署
2、go环境部署
3、go项目部署
4、测试
技术关键点:
1、docker环境部署
使用docker镜像启动一个容器即可
2、go环境部署
go软件的依赖环境
go软件的基本环境配置
3、go项目部署
beego框架的下载
项目文件配置
启动go项目
4、测试
宿主机测试
解决方案:
1、docker环境配置
1.1 获取docker镜像
1.2 启动docker容器
2、go环境部署
2.1 基础环境配置
2.2 go环境配置
3、go项目部署
3.1 获取beego代码
3.2 项目文件配置
3.3 项目启动
4、测试
4.1 宿主机测试
实施方案:
#1、docker环境配置
#1.1 获取docker镜像
#获取一个ubuntu的模板文件
cat ubuntu-16.04-x86_64.tar.gz | docker import - ubuntu-nimi
ubuntu-mini latest 44117582c84e 4 days ago 505MB
#1.2 启动docker容器
#启动容器,容器名称叫panda-go
chengpeng@chengpeng:~$ docker run -itd --name panda-go ubuntu-mini /bin/bash
#进入容器
docker exec -it go-test /bin/bash
#2、go环境部署
#2.1 基础环境配置
#配置国内源
vim /etc/apt/sources.list-->这一步不一定需要可以直接跳到sed
#文件内容如下
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe
multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
#如果由于网络环境原因不能进行软件源更新可以使用如下内容
sudo sed -i 's/cn.archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
#更新软件源,安装基本软件
apt-get update
apt-get install gcc libc6-dev git vim lrzsz -y
#2.2 go环境配置
#安装go语言软件
//apt-get install golang -y-->这一个暂时没成功-->跳到将go1.10.linux-amd64.tar.gz拷贝到容器中进行解压包可以找我要QQ:921190764
由于软件源问题改使用新版本go
将go1.10.linux-amd64.tar.gz拷贝到容器中进行解压
tar -C /usr/local -zxf go1.10.linux-amd64.tar.gz
#配置go基本环境变量
export GOROOT=/usr/local/go
export PATH=$PATH:/usr/local/go/bin
export GOPATH=/root/go
export PATH=$GOPATH/bin/:$PATH
#3、go项目部署
#3.1 获取beego代码
#下载项目beego
mkdir /root/go/github.com
go get github.com/astaxie/beego-->这一步没有成功,直接解压把
#暂时没有下载
Cloning into '/root/go/src/github.com/astaxie/beego'...
fatal: unable to access 'https://github.com/astaxie/beego/': gnutls_handshake() failed: Error in the pull function.
#然后把所需的压缩包astaxie.zip拖进来-->可以找我要QQ:921190764
#3.2 项目文件配置
#创建项目目录
mkdir /root/go/src/myTest
cd /root/go/src/myTest
#编辑go项目测试文件test.go
package main
import (
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (this *MainController) Get() {
this.Ctx.WriteString("hello world\n")
}
func main() {
beego.Router("/", &MainController{})
beego.Run()
}
#3.3 项目启动
#运行该文件
go run test.go
#可以看到:
#这个go项目运行起来后,开放的端口是8080
#4、测试
#4.1宿主机测试
#查看容器的ip地址
docker inspect panda-go
#浏览器查看效果:
curl 172.17.0.2:8080-->panda-go ip地址
3.2.3 Dockerfile案例分析
环境分析:
1、软件源文件,使用国外源,速度太慢,所以我们可以自己使用国内的软件源。
因为我们在手工部署的时候,使用的是官方(国外)的源,所以为了部署快一点呢,我使用国内的阿里云的源。 源内
容:
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe
multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
由于阿里云的源出现问题所有更换为中科大的源 详情见3.1.1
2、软件安装,涉及到了各种软件
3、涉及到了go的环境变量设置
4、软件运行涉及到了软件的运行目录
5、项目访问,涉及到端口
关键点分析:
1、增加文件,使用 ADD 或者 COPY 指令
2、安装软件,使用 RUN 指令
3、环境变量,使用 ENV 指令
4、命令运行,使用 WORKDIR 指令
5、项目端口,使用 EXPOSE 指令
定制方案:
1、基于ubuntu基础镜像进行操作
2、增加国内源文件
3、安装环境基本软件
4、定制命令工作目录
5、执行项目
6、开放端口
3.2.4 Dockerfile实践
创建目录
#创建目录
#进入标准目录
chengpeng@chengpeng:~/docker-file$ mkdir beego
chengpeng@chengpeng:~/docker-file/beego$
Dockerfile内容
# 构建一个基于ubuntu 的docker 定制镜像
# 基础镜像
FROM ubuntu:16.04
# 镜像作者
MAINTAINER panda kstwoak47@163.com
# 增加国内源
#COPY sources.list /etc/apt/
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# 执行命令
RUN apt-get update
RUN apt-get install gcc libc6-dev git lrzsz -y
#将go复制解压到容器中
ADD go1.10.linux-amd64.tar.gz /usr/local/
# 定制环境变量
ENV GOROOT=/usr/local/go
ENV PATH=$PATH:/usr/local/go/bin
ENV GOPATH=/root/go
ENV PATH=$GOPATH/bin/:$PATH
# 下载项目
#RUN go get github.com/astaxie/beego-->暂时下载不了
ADD astaxie.tar.xz /root/go/src/github.com/
# 增加文件
COPY test.go /root/go/src/myTest/
# 定制工作目录
WORKDIR /root/go/src/myTest/
# 对外端口
EXPOSE 8080
# 运行项目
ENTRYPOINT ["go","run","test.go"]
#把sources.list和test.go文件放到这个目录中
#构建镜像
chengpeng@chengpeng:~/docker-file/beego$ docker build -t beego-test:v1.0 .
chengpeng@chengpeng:~/docker-file/beego$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
beego-test v1.0 a202e1014dc8 47 seconds ago 708MB
#运行镜像
chengpeng@chengpeng:~/docker-file/beego$ docker run -itd --name beego-1 beego-test:v1.0
chengpeng@chengpeng:~/docker-file/beego$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52937386f836 beego-test:v1.0 "go run test.go" 7 seconds ago Up 6 seconds 8080/tcp beego-1
#查看ip
chengpeng@chengpeng:~/docker-file/beego$ docker inspect beego-1
#编辑go项目测试文件test.go
package main
import (
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (this *MainController) Get() {
this.Ctx.WriteString("hello world\n")
}
func main() {
beego.Router("/", &MainController{})
beego.Run()
}
#访问镜像,查看效果
3.3 Docker compose
Docker compose是一种docker容器的任务编排工具
官方地址:https://docs.docker.com/compose/
3.3.1 compose简介
任务编排介绍
场景:
我们在工作中为了完成业务目标,首先把业务拆分成多个子任务,然后对这些子任务进行顺序组合,当子任务按照
方案执行完毕后,就完成了业务目标。
任务编排,就是对多个子任务执行顺序进行确定的过程。
常见的任务编排工具:
单机版: docker compose
集群版:
Docker swarm Docker
Mesos Apache
Kubernetes(k8s) Google
docker compose是什么
译文: compose是定义和运行多容器Docker应用程序的工具。通过编写,您可以使用YAML文件来配置应用程序
的服务。然后,使用单个命令创建并启动配置中的所有服务。要了解更多有关组合的所有特性,请参见特性列表。
docker compose的特点; 本质:docker 工具
对象:应用服务
配置:YAML 格式配置文件
命令:简单
执行:定义和运行容器
docker compose的配置文件
docker-compose.yml
文件后缀是yml
文件内容遵循 ymal格式
docker 和 Docker compose
官方地址:https://docs.docker.com/compose/overview/
3.3.2 compose 快速入门
docker compose 安装
#安装依赖工具
sudo apt-get install python-pip -y
#安装编排工具
sudo pip install docker-compose
#查看编排工具版本
sudo docker-compose version
#查看命令帮助
docker-compose --help
PIP 源问题
#用pip安装依赖包时默认访问https://pypi.python.org/simple/,
#但是经常出现不稳定以及访问速度非常慢的情况,国内厂商提供的pipy镜像目前可用的有:
#在当前用户目录下创建.pip文件夹
mkdir ~/.pip
#然后在该目录下创建pip.conf文件填写:
[global]
trusted-host=mirrors.aliyun.com
index-url=http://mirrors.aliyun.com/pypi/simple/
compose简单配置文件
#创建compose文件夹
:~$ mkdir -p ./docker/compose
#进入到文件夹
:~$ cd ./docker/compose
#创建yml文件
:~$ vim docker-compose.yml
docker-compose.yml 文件内容
version: '2'
services:
web1:
image: nginx
ports:
- "9999:80"
container_name: nginx-web1
web2:
image: nginx
ports:
- "8888:80"
container_name: nginx-web2
运行一个容器
#后台启动:
docker-compose up -d
#注意:
#如果不加-d,那么界面就会卡在前台
#查看运行效果
docker-compose ps
3.3.3 compose命令详解
注意:
所有命令尽量都在docker compose项目目录下面进行操作
项目目录:docker-compose.yml所在目录
compose服务启动、关闭、查看
#后台启动:
docker-compose up -d
chengpeng@chengpeng:~/docker-file/compose$ docker-compose up -d
Creating network "compose_default" with the default driver
Creating nginx-web1 ... done
Creating nginx-web2 ... done
chengpeng@chengpeng:~/docker-file/compose$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
151957dd4eaa nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:9999->80/tcp, :::9999->80/tcp nginx-web1
6d8cbd26f77d nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:8888->80/tcp, :::8888->80/tcp nginx-web2
#删除服务
docker-compose down
chengpeng@chengpeng:~/docker-file/compose$ docker-compose down
Stopping nginx-web1 ... done
Stopping nginx-web2 ... done
Removing nginx-web1 ... done
Removing nginx-web2 ... done
Removing network compose_default
#查看正在运行的服务
docker-compose ps
chengpeng@chengpeng:~/docker-file/compose$ docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------
nginx-web1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:9999->80/tcp,:::9999->80/tcp
nginx-web2 /docker-entrypoint.sh ngin ... Up 0.0.0.0:8888->80/tcp,:::8888->80/tcp
容器开启、关闭、删除
#启动一个服务
docker-compose start <服务名>--->docker-compose start web1
#注意:
#如果后面不加服务名,会停止所有的服务
#停止一个服务
docker-compose stop <服务名>--->docker-compose stop web1
#注意:
#如果后面不加服务名,会停止所有的服务
#删除服务
docker-compose rm
#注意:
#这个docker-compose rm不会删除应用的网络和数据卷。工作中尽量不要用rm进行删除
其他信息查看
#查看运行的服务
docker-compose ps
#查看服务运行的日志
docker-compose logs -f
#注意:
#加上-f 选项,可以持续跟踪服务产生的日志
#查看服务依赖的镜像
docke-compose images
chengpeng@chengpeng:~/docker-file/compose$ docker-compose images
Container Repository Tag Image Id Size
----------------------------------------------------------
nginx-web1 nginx latest 593aee2afb64 186.8 MB
nginx-web2 nginx latest 593aee2afb64 186.8 MB
#进入服务容器
docker-compose exec <服务名> <执行命令>
docker-compose exec web1 /bin/bash
#查看服务网络
docker network ls
3.3.4 compose文件详解
官方参考资料: https://docs.docker.com/compose/overview/
文件命名:
后缀是 .yml
**YMAL介绍
YMAL文件格式:
compose文件样例:
格式详解:
compose版本号、服务标识符必须顶格写
属性名和属性值是以': '(冒号+空格) 隔开
层级使用' '(两个空格)表示
服务属性使用' - '(空格空格-空格)来表示
compose属性介绍
#镜像:
格式:
image: 镜像名称:版本号
举例:
image: nginx:latest
#容器命名:
格式:
container_name: 自定义容器命名
举例:
container_name: nginx-web1
#数据卷:
格式:
volumes:
- 宿主机文件:容器文件
举例:
volumes:
- ./linshi.conf:/nihao/haha.sh
#端口:
格式:
ports:
- "宿主机端口:容器端口"
举例:
ports:
- "9999:80"
#镜像构建:
格式:
build: Dockerfile 的路径
举例:
build: .
build: ./dockerfile_dir/
build: /root/dockerfile_dir/
#镜像依赖:
格式:
depends_on:
- 本镜像依赖于哪个服务
举例:
depends_on:
- web1
3.3.5 go项目实践
项目分析
需求:
自动部署一个集群,使用nginx代理两个go项目----负载均衡
流程分析:
1、go项目部署
2、nginx代理部署
3、docker 环境
4、docker compose任务编排
技术点分析:
1、go项目部署
go项目基础环境
go项目配置
2、nginx代理部署
nginx的配置文件
3、docker 环境
docker基础镜像
go镜像
nginx镜像
4、docker compose任务编排
4个任务:1个镜像构建任务、2个go任务、1个nginx任务
任务依赖关系:go任务执行依赖于nginx任务
镜像依赖:go镜像依赖于nginx镜像完毕
实施方案:
1、基础环境
1.1 compose基础目录
1.2 环境依赖文件:
sources.list、test.go、test1.go、test2.go、nginx-beego.conf
1.3 dockerfile文件
go项目环境的Dockerfile文件
2、任务编排文件
2.1 nginx任务
基于nginx镜像,增加一个nginx的代理配置即可
2.2 go基础镜像任务
基于ubuntu镜像,构建go基础环境镜像,参考3.2.4内容
该任务依赖于2.1 nginx任务
2.3 go项目任务
基于go基础镜像,增加测试文件即可
该任务依赖于2.2 go基础镜像任务
3、测试
3.1 集群测试
方案实施
1、基础环境
1.1 compose基础目录
创建compose基础目录
1.2 环境依赖文件:
nginx配置文件
创建nginx专用目录
:~$ mkdir nginx
:~$ cd nginx
创建nginx负载均衡配置nginx-beego.conf
:~$ vim nginx-beego.conf
文件内容
upstream beegos {
#upstream模块
server 192.168.8.14:10086;
server 192.168.8.14:10087;
}
server {
listen 80;
#提供服务的端口
server_name _;
#服务名称
location / {
proxy_pass http://beegos;
#反选代理 upstream模块 beegos
index index.html index.htm;
#默认首页
}
}
go基础镜像依赖文件
#创建go基础镜像目录:
:~$ mkdir go-base
:~$ cd go-base
#创建source.lise
:~$ vim sources.list
文件内容
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe
multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
或者
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
test.go配置文件
package main
import (
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (this *MainController) Get(){
this.Ctx.WriteString("hello world\n")
}
func main() {
beego.Router("/", &MainController{})
beego.Run()
}
go任务依赖文件: beego1/test.go配置文件
package main
import (
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (this *MainController) Get(){
this.Ctx.WriteString("<h1>hello beego1</h1>\n")
}
func main() {
beego.Router("/", &MainController{})
beego.Run()
}
Beego2/test.go配置文件
package main
import (
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (this *MainController) Get(){
this.Ctx.WriteString("<h1>hello beego2</h1>\n")
}
func main() {
beego.Router("/", &MainController{})
beego.Run()
}
1.3 dockerfile文件
go项目环境的Dockerfile文件
创建Dockerfile文件
:~$ vim dockerfile
文件内容
# 构建一个基于ubuntu 的docker 定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER panda kstwoak47@163.com
# 增加国内源
#COPY sources.list /etc/apt/
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# 执行命令
RUN apt-get update
RUN apt-get install gcc libc6-dev git lrzsz -y
#将go复制解压到容器中
ADD go1.10.linux-amd64.tar.gz /usr/local/
# 定制环境变量
ENV GOROOT=/usr/local/go
ENV PATH=$PATH:/usr/local/go/bin
ENV GOPATH=/root/go
ENV PATH=$GOPATH/bin/:$PATH
# 下载项目
#RUN go get github.com/astaxie/beego
ADD astaxie.tar.xz /root/go/src/github.com
# 增加文件
COPY test.go /root/go/src/myTest/
# 定制工作目录
WORKDIR /root/go/src/myTest/
# 对外端口
EXPOSE 8080
# 运行项目
ENTRYPOINT ["go","run","test.go"]
最终的文件目录结构
:~# tree /docker/compose/
/docker/compose/beego/
├── beego1
│ └── test.go
├── beego2
│ └── test.go
├── docker-compose.yml
├── beego
│ ├── astaxie.tar.xz
│ ├── Dockerfile
│ ├── go1.10.linux-amd64.tar.gz
│ └── test.go
└── nginx
└── nginx-beego.conf
2、任务编排文件
docker-compose.yml文件内容
version: '2'
services:
web1:
image: nginx
ports:
- "39999:80"
volumes:
- ./nginx/beego-nginx.conf:/etc/nginx/conf.d/default.conf
container_name: nginx-web1
go-base:--->可以改
build: ./beego/
image: go-base:v0.1
beego-web1:
image: go-base:v0.1
volumes:
- ./beego-1/test1.go:/root/go/src/myTest/test.go
ports:
- "10086:8080"
container_name: beego-web1
depends_on:
- go-base
beego-web2:
image: go-base:v0.1
volumes:
- ./beego-2/test2.go:/root/go/src/myTest/test.go
ports:
- "10087:8080"
container_name: beego-web2
depends_on:
- go-base
3、 最后测试
#构建镜像
$docker-compose build
#启动任务
$docker-compose up -d
#查看效果
$docker-compose ps
#浏览器访问
192.168.110.5:39999