docker---dockerfile相关知识

第 3 章 Docker 高级实践

docker---dockerfile相关知识_第1张图片
在这一部分我们主要来介绍一些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 [email protected]
# 执行命令
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
      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 [email protected]               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 [email protected]
# 执行命令
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 指的是容器
#所有拷贝到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 [email protected]
# 执行命令
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 [email protected]
# 执行命令
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 ["",... ""]
#解释:
#COPY 指令和ADD 指令功能和使用方式类似。只是COPY 指令不会做自动解压工作。
#单纯复制文件场景,Docker 推荐使用COPY
#COPY实践
#修改Dockerfile文件内容:
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER panda [email protected]
# 执行命令
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 [email protected]
# 执行命令
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 [email protected]
# 执行命令
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 =来指定参数的值,不过
#如果构建的时候不指定就会报错。

3.1.7 触发器指令详解

触发器指令

ONBUILD
#格式:
ONBUILD [command]
#解释:
#当一个镜像A被作为其他镜像B的基础镜像时,这个触发器才会被执行,
#新镜像B在构建的时候,会插入触发器中的指令。
#使用场景对于版本控制和方便传输,适用于其他用户。

触发器实践

#编辑Dockerfile
:~/docker/images/nginx$ vim Dockerfile
#内容如下:
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER panda [email protected]
# 执行命令
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 [email protected]
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 [email protected]
# 增加国内源
#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

docker---dockerfile相关知识_第2张图片
官方地址: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文件格式:

docker---dockerfile相关知识_第3张图片

compose文件样例:
docker---dockerfile相关知识_第4张图片
格式详解:

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项目实践

项目分析
docker---dockerfile相关知识_第5张图片
需求:
自动部署一个集群,使用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("

hello beego1

\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("

hello beego2

\n"
) } func main() { beego.Router("/", &MainController{}) beego.Run() }

1.3 dockerfile文件
go项目环境的Dockerfile文件
创建Dockerfile文件

:~$ vim dockerfile

文件内容

# 构建一个基于ubuntu 的docker 定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER panda [email protected]
# 增加国内源
#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

你可能感兴趣的:(docker,容器,运维)