docker---dockerfile相关知识

第 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使用命令:

bash 复制代码
#构建镜像命令格式:
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。

bash 复制代码
#创建Dockerfile专用目录
:~$ mkdir ./docker/images/nginx -p
:~$ cd docker/images/nginx/
#创建Dockerfile文件
:~/docker/images/nginx$ vim Dockerfile

测试

bash 复制代码
#创建Dockerfile专用目录--创建Dockerfile文件
chengpeng@chengpeng:~$ mkdir docker-file/dockerfile/nginx -p
chengpeng@chengpeng:~/docker-file/dockerfile/nginx$ vim Dockerfile-->拷贝dockerfile内容

dockerfile内容

bash 复制代码
# 构建一个基于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

进行构建操作

bash 复制代码
#构建镜像
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文件

bash 复制代码
# 构建一个基于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进行构建

bash 复制代码
:~/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

bash 复制代码
FROM
#格式:
FROM <image>
FROM <image>:<tag>
#解释:
#FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
#可以有多个FROM语句,来创建多个image-->不建议使用
#FROM 后面是有效的镜像名称,如果该镜像没有在你的本地仓库,那么就会从远程仓库Pull取,如果远程也没有,就报错失败
#下面所有的 系统可执行指令 在 FROM 的镜像中执行。

MAINTAINER

bash 复制代码
MAINTAINER
#格式:
MAINTAINER <name>
#解释:
#指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息

RUN

bash 复制代码
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

bash 复制代码
EXPOSE
#格式:
EXPOSE <port> [<port>...]
#解释:
设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,
还需要启动容器时增加-p或者-P参数对容器的端口进行分配。
EXPOSE 80

3.1.4 运行时指令详解

CMD

bash 复制代码
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;" 后台守护程序开启方式 关闭
bash 复制代码
#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

bash 复制代码
ENTRYPOINT
#格式:
ENTRYPOINT ["executable", "param1","param2"] (exec 模式)
ENTRYPOINT command param1 param2 (shell 模式)
#解释:
#和CMD 类似都是配置容器启动后执行的命令,并且不会被docker run 提供的参数覆盖。
#每个Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。
#生产中我们可以同时使用ENTRYPOINT 和CMD,
#想要在docker run 时被覆盖,可以使用"docker run --entrypoint"
bash 复制代码
#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 综合使用实践-->相当于组合拼接

bash 复制代码
#修改Dockerfile文件内容:
# 在上一个Dockerfile文件内容基础上,修改末尾的ENTRYPOINT
:~/docker/images/nginx$ vim Dockerfile
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-g"]
bash 复制代码
#构建镜像
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

bash 复制代码
#ADD
#格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
css 复制代码
#解释:
#将指定的<src> 文件复制到容器文件系统中的<dest>
#src 指的是宿主机,dest 指的是容器
#所有拷贝到container 中的文件和文件夹权限为0755,uid 和gid 为0
#如果文件是可识别的压缩格式,则docker 会帮忙解压缩--->tar可以zip不可以 
#注意:
#1、如果源路径是个文件,且目标路径是以/ 结尾, 则docker 会把目标路径当作一个目录,会把源文件拷贝到该目录下;
#如果目标路径不存在,则会自动创建目标路径。
#2、如果源路径是个文件,且目标路径不是以/ 结尾,则docker 会把目标路径当作一个文件。
#如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;
#如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。
#如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。注意,这种情况下,最好显示的以/ 结尾,以避免混淆。
#3、如果源路径是个目录,且目标路径不存在,则docker 会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。
#如果目标路径是个已经存在的目录,则docker 会把源路径目录下的文件拷贝到该目录下。
#4、如果源文件是个压缩文件,则docker 会自动帮解压到指定的容器目录中。
bash 复制代码
#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
bash 复制代码
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

bash 复制代码
#COPY
#格式:
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
#解释:
#COPY 指令和ADD 指令功能和使用方式类似。只是COPY 指令不会做自动解压工作。
#单纯复制文件场景,Docker 推荐使用COPY
bash 复制代码
#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

bash 复制代码
#VOLUME
#格式:
VOLUME ["/data"]
#解释:
#VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点
#通过VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
#举例:
VOLUME ["/var/lib/tomcat7/webapps/"]

VOLUME实践-->用它创建的镜像,可以用其他容器挂载

bash 复制代码
#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

bash 复制代码
#ENV
#格式:
ENV <key> <value> (一次设置一个环节变量)
ENV <key>=<value> ... (一次设置一个或多个环节变量)
#解释:
#设置环境变量,可以在RUN 之前使用,然后RUN 命令时调用,容器启动时这些环境变量都会被指定

ENV实践

bash 复制代码
#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

bash 复制代码
#WORKDIR
#格式:
WORKDIR /path/to/workdir (shell 模式)
#解释:
#切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。相当于cd
#可以多次切换(相当于cd 命令),
#也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
#举例:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
#则最终路径为/a/b/c

WORKDIR实践

bash 复制代码
#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

bash 复制代码
#USER
#格式:
USER daemon
#解释:
#指定运行容器时的用户名和UID,后续的RUN 指令也会使用这里指定的用户。
#如果不输入任何信息,表示默认使用root 用户
#ARG
#格式:
ARG <name>[=<default value>]
#解释:
#ARG 指定了一个变量在docker build 的时候使用,可以使用--build-arg <varname>=<value>来指定参数的值,不过
#如果构建的时候不指定就会报错。

3.1.7 触发器指令详解

触发器指令

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

触发器实践

bash 复制代码
#编辑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并没有修改
bash 复制代码
#构建子镜像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构建缓存

我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存。

bash 复制代码
#取消缓存:
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 宿主机测试
实施方案:

bash 复制代码
#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、软件源文件,使用国外源,速度太慢,所以我们可以自己使用国内的软件源。

因为我们在手工部署的时候,使用的是官方(国外)的源,所以为了部署快一点呢,我使用国内的阿里云的源。 源内

容:

bash 复制代码
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实践

创建目录

bash 复制代码
#创建目录
#进入标准目录
chengpeng@chengpeng:~/docker-file$ mkdir beego
chengpeng@chengpeng:~/docker-file/beego$ 

Dockerfile内容

bash 复制代码
# 构建一个基于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 快速入门

bash 复制代码
docker compose 安装
#安装依赖工具
sudo apt-get install python-pip -y
#安装编排工具
sudo pip install docker-compose
#查看编排工具版本
sudo docker-compose version
#查看命令帮助
docker-compose --help

PIP 源问题

bash 复制代码
#用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简单配置文件

bash 复制代码
#创建compose文件夹
:~$ mkdir -p ./docker/compose
#进入到文件夹
:~$ cd ./docker/compose
#创建yml文件
:~$ vim docker-compose.yml

docker-compose.yml 文件内容

bash 复制代码
version: '2'
services:
  web1:
    image: nginx
    ports:
      - "9999:80"
    container_name: nginx-web1
  web2:
    image: nginx
    ports:
      - "8888:80"
    container_name: nginx-web2

运行一个容器

bash 复制代码
#后台启动:
docker-compose up -d
#注意:
#如果不加-d,那么界面就会卡在前台
#查看运行效果
docker-compose ps

3.3.3 compose命令详解

注意:

所有命令尽量都在docker compose项目目录下面进行操作

项目目录:docker-compose.yml所在目录
compose服务启动、关闭、查看

bash 复制代码
#后台启动:
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

容器开启、关闭、删除

bash 复制代码
#启动一个服务
docker-compose start <服务名>--->docker-compose start web1
#注意:
#如果后面不加服务名,会停止所有的服务
#停止一个服务
docker-compose stop <服务名>--->docker-compose stop web1
#注意:
#如果后面不加服务名,会停止所有的服务
#删除服务
docker-compose rm
#注意:
#这个docker-compose rm不会删除应用的网络和数据卷。工作中尽量不要用rm进行删除

其他信息查看

bash 复制代码
#查看运行的服务
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文件样例:

格式详解:

bash 复制代码
compose版本号、服务标识符必须顶格写
属性名和属性值是以': '(冒号+空格) 隔开
层级使用' '(两个空格)表示
服务属性使用' - '(空格空格-空格)来表示

compose属性介绍

bash 复制代码
#镜像:
格式:
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配置文件

bash 复制代码
创建nginx专用目录
:~$ mkdir nginx
:~$ cd nginx
创建nginx负载均衡配置nginx-beego.conf
:~$ vim nginx-beego.conf

文件内容

bash 复制代码
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基础镜像依赖文件

bash 复制代码
#创建go基础镜像目录:
:~$ mkdir go-base
:~$ cd go-base
#创建source.lise
:~$ vim sources.list

文件内容

bash 复制代码
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

或者

bash 复制代码
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配置文件

bash 复制代码
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配置文件

bash 复制代码
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配置文件

bash 复制代码
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文件

bash 复制代码
:~$ vim dockerfile

文件内容

bash 复制代码
# 构建一个基于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"]

最终的文件目录结构

bash 复制代码
:~# 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文件内容

bash 复制代码
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、 最后测试

bash 复制代码
#构建镜像
$docker-compose build
#启动任务
$docker-compose up -d
#查看效果
$docker-compose ps
#浏览器访问
192.168.110.5:39999
相关推荐
我好饿12 小时前
Linux入门教程 第十五章 Linux 系统调优工具
linux·运维·网络
萌虎爱分享3 小时前
Linux 防火墙 (firewalld) 管理完整指南
linux·运维·防火墙·firewalld
mCell7 小时前
Docker 进阶教程
运维·docker·容器
mCell7 小时前
Docker 入门教程
运维·docker·操作系统
祈祷苍天赐我java之术7 小时前
Linux 进阶之性能调优,文件管理,网络安全
java·linux·运维
深耕云原生8 小时前
Kubernetes 深入浅出系列 | 容器剖析之容器安全
安全·容器·kubernetes
王火火(DDoS CC防护)8 小时前
服务器网络带宽不足要怎么处理?
运维·服务器
潇凝子潇8 小时前
获取服务器指标的信息
linux·运维·服务器
FreeBuf_8 小时前
Chrome高危零日漏洞PoC公开,已被用于野外攻击
linux·运维·服务器·安全·web安全
初学者_xuan11 小时前
Linux程序与进程和进程程序基础以及程序管理(零基础掌握版)
运维·计算机网络·网络安全·零基础·学习方法·linux程序管理