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

#构建镜像命令格式:
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/124362.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaEE平台技术——预备知识(Maven、Docker)

JavaEE平台技术——预备知识&#xff08;Maven、Docker&#xff09; 1. Maven2. Docker 在观看这个之前&#xff0c;大家请查阅前序内容。 &#x1f600;JavaEE的渊源 &#x1f600;&#x1f600;JavaEE平台技术——预备知识&#xff08;Web、Sevlet、Tomcat&#xff09; 1. M…

Canal

canal译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费。 1.canal 工作原理 canal 模拟 MySQL slave 的交互协议&#xff0c;伪装自己为 MySQL slave &#xff0c;向 MySQL master 发送dump 协议MySQL master 收到…

mac 安装 selenium + chrome driver

前言 使用 selenium 模拟浏览器渲染数据&#xff0c;需要依赖各浏览器的驱动才能完成&#xff0c;因此需要单独安装chrome driver 查看本地 chrome 浏览器的版本 可以看到我这里已经是 arm 架构下最新的版本了 下载对应的 chrome driver 访问下面的地址&#xff1a; Chrome…

Redis7--基础篇2(Redis的十大数据类型及常用命令)

1. Redis的十大数据类型及常用命令 Redis是key-value键值对类型的数据库&#xff0c;我们所说的数据类型指的是value的数据类型&#xff0c;key的数据类型都是字符串。 1.1 字符串&#xff08;String&#xff09; string是redis最基本的类型&#xff0c;一个key对应一个val…

easyscholar配置秘钥连接Zotero-style,更方便的了解文献!

如果你不知道什么是easyScholar,以及怎么安装easyScholar? 请参见文章 easyScholar 一、easyscholar配置秘钥 1.首先打开easyscholar插件&#xff0c;并登录 2.点击自定义数据集 3.依次点击 用户信息-开放接口 4.点击刷新 5.在Zoter中 编辑-首选项-高级-编辑器 6.点击…

[C]环境(0/0)→ 环境配置

这里写目录标题 0x00 额环境下载解压 0x00 额 写了那么多C的入门&#xff0c;就是没写C语言的环境配置&#xff0c;乘此机会写了吧。 环境下载 直接在我这下载就好了&#xff0c;毕竟用了挺久没啥问题的 C语言环境&#xff08;gcc version 8.1.0&#xff09; 解压 最后得到…

快速构建高质量中文APP登录注册页面Figma源文件

在这个数字化时代&#xff0c;移动应用程序&#xff08;APP&#xff09;已经成为我们日常生活中不可或缺的一部分。如果您正在为您的中文APP开发登录注册页面&#xff0c;并寻找高质量的UI设计素材&#xff0c;那么您来对地方了&#xff01;我们为您提供了一个完整的Figma源文件…

解答开发转软件测试岗的困惑

有个知乎网友做了一年的软件开发&#xff0c;打算转软件测试&#xff0c;但是面试了几家都没有回音&#xff0c;希望大家能给一点建议。 由于这个问题不是今年提的&#xff0c;所以不用担心知友是受到了疫情的影响&#xff0c;单纯应该是个人的问题。 因为他只做了一年开发就想…

Redis 扩展 RedisBloom 插件,解决缓存击穿、穿透

文章目录 一、概述二、编译准备2.1 升级 make2.2 安装 Python3 三、编译 RedisBloom四、测试 RedisBloom五、应用场景5.1 缓存击穿5.2 缓存穿透5.3 原理总结 六、存在的问题 如果您对Redis的了解不够深入请关注本栏目&#xff0c;本栏目包括Redis安装&#xff0c;Redis配置文件…

【tgcalls】Instance接口的实例类的创建

tg 里有多个版本,因此设计了版本管理的map,每次可以选择一个版本进行实例创建这样,每个客户端就可以定制开发了。tg使用了c++20创建是要传递一个描述者,里面是上下文信息 G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\Instance.cpp可以看到竟然是…

js获取地址中携带的省市区

match() 方法可在字符串内检索指定的值&#xff0c;或找到一个或多个正则表达式的匹配。 match() 方法将检索字符串 String Object&#xff0c;以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。如果 regexp 没有标志 g&#x…

带有滑动菜单指示器的纯 CSS 导航选项卡

效果展示 CSS 知识点 filter 属性回顾 transition 属性回顾 使用单选框实现导航菜单的思路 单选框当点击完成后就会有一个:checked属性&#xff0c;可以利用这个属性来实现导航菜单底部滑动块的滑动动画和当前菜单项激活状态的管理。 整体页面结构 <div class"tab…

ZZ308 物联网应用与服务赛题第F套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;F卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等&#xff1b; 2.竞赛任务中所使用…

【Royalty in Wind 2.0.0】个人体测计算、资料分享小程序

前言 Royalty in Wind 是我个人制作的一个工具类小程序。主要涵盖体测计算器、个人学习资料分享等功能。这个小程序在2022年第一次发布&#xff0c;不过后来因为一些原因暂时搁置。现在准备作为我个人的小程序重新投入使用XD PS&#xff1a;小程序开发部分我是在21年跟随郄培…

配置Linux为无线路由器

配置Linux无线路由器 将Linux配置为无线路由器。使用hostapd&#xff0c;可以配置无线网卡为AP模式。 这里使用buildroot来生成这个工具。Wi-Fi模块使用的是 rt8188eus。 1. 内核配置 2. buildroot配置 开启 rt8188eus 驱动 3. 启动hostapd 系统启动后&#xff0c;会自动加…

innovus:set_ccopt_property基本用法备忘录(中)

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 insertion_delay insertion delay的作用是指导clock tree做长或做短。具体可以看以下文章:innovus set_ccopt_property insertion_delay insertion_delay的设置的来源有三个…

detectron2环境搭建及自定义coco数据集(voc转coco)训练

detectron2建议ubuntu进行环境搭建&#xff0c;Windows大概率报错 一 环境搭建 创建虚拟环境 conda create -n detectron2 python3.8 -y conda activate detectron2后面下载源代码建议存到git中再git clone git clone https://github.com/facebookresearch/detectron2.git …

Linux搭建我的世界MC服务器 【Minecraft外网联机教程】

文章目录 前言1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 前言 Li…

蓝桥杯国一,非ACMer选手保姆级经验分享

目录 一、前言二、蓝桥杯简介三、0基础计算机新手小白&#xff0c;赛前如何准备提高自己的获奖率&#xff1f;3.1 每两周参加一次【蓝桥算法双周赛】3.2 多练真题3.3 参加每一场官方校内模拟赛 四、结语 一、前言 hello&#xff0c;大家好&#xff0c;我是大赛哥(弟)&#xff…

竞赛 目标检测-行人车辆检测流量计数

文章目录 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 行人车辆目标检测计数系统 …