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 80VOLUME ["/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 -yWORKDIR /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: nginxports:- "9999:80"container_name: nginx-web1web2:image: nginxports:- "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 psName                 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模块 beegosindex 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: nginxports:- "39999:80"volumes:- ./nginx/beego-nginx.conf:/etc/nginx/conf.d/default.confcontainer_name: nginx-web1go-base:--->可以改build: ./beego/image: go-base:v0.1beego-web1:image: go-base:v0.1volumes:- ./beego-1/test1.go:/root/go/src/myTest/test.goports:- "10086:8080"container_name: beego-web1depends_on:- go-basebeego-web2:image: go-base:v0.1volumes:- ./beego-2/test2.go:/root/go/src/myTest/test.goports:- "10087:8080"container_name: beego-web2depends_on:- go-base

3、 最后测试

#构建镜像
$docker-compose build
#启动任务
$docker-compose up -d
#查看效果
$docker-compose ps
#浏览器访问
192.168.110.5:39999

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云安全恶意程序检测(速通一)

阿里云安全恶意程序检测 赛题理解赛题介绍赛题说明数据说明评测指标 赛题分析数据特征解题思路 数据探索数据特征类型数据分布箱型图 变量取值分布缺失值异常值分析训练集的tid特征标签分布测试集数据探索同上 数据集联合分析file_id分析API分析 特征工程与基线模型构造特征与特…

【Kubernetes部署】通过Kubeadm部署Kubernetes高可用集群

Kubeadm 一、kubeadm部署思路二、基本架构2.1 资源分配2.2 系统初始化操作&#xff08;所有节点&#xff09;2.2.1关闭防火墙、selinux和swap分区2.2.2 修改主机名&#xff0c;添加域名映射2.2.3 内核相关2.2.4 加载ip_vs模块2.2.5 时间同步 三、部署docker3.1 通过yum安装dock…

程序员笔记本电脑选 windows 还是 MAC

计算机选择是每个进入 IT 行业同学的第一个重要选择&#xff0c;那么你是怎么选择的呢&#xff1f; 选择操作系统&#xff08;Windows还是macOS&#xff09;取决于程序员的需求、偏好和工作流程。每个操作系统都有其优点和缺点&#xff0c;下面将分别讨论它们&#xff0c;以帮助…

小红书运营篇1,新手如何快速分析拆解对标账号

hi&#xff0c;同学们&#xff0c;本期是第1期AI运营技巧篇 很多新手博主初期都非常迷茫&#xff0c;主要是因为他们没有找对标账号&#xff0c;也没有充分分析同行账号。 有些人可能会说&#xff0c;“我不想参考同行&#xff0c;我想要追求创新”。这种勇气是真的非常值得鼓…

文件夹批量改名:轻松实现文件夹随机重命名

无论是在我们的日常生活还是工作中&#xff0c;批量重命名文件夹是一项非常常见的任务。当我们需要整理或分类大量的文件时&#xff0c;往往需要对相应的文件夹进行重命名。然而&#xff0c;手动一个接一个地完成这个任务不仅会消耗大量的时间&#xff0c;还容易在重命名过程中…

JS逆向爬虫---请求参数加密②【某麦数据analysis参数加密】

主页链接: https://www.qimai.cn/rank analysis逆向 完整参数生成代码如下&#xff1a; const {JSDOM} require(jsdom) const dom new JSDOM(<!DOCTYPE html><p>hello</p>) window dom.windowfunction customDecrypt(n, t) {t t || generateKey(); //…

《006.Springboot+vue之旅游信息推荐系统》【有文档】

《006.Springbootvue之旅游信息推荐系统》【有文档】 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatis; 前台&#xff1a;vueElementUI; [2]功能模块展示&#xff1a; …

汽车网络安全渗透测试概述

目录 1.汽车网络安全法规概述 1.1 国外标准 1.2 国内标准 2.汽车网络安全威胁分析 2.1 汽车网络安全资产定义 2.2 汽车网络安全影响场景及评级示例 3.汽车网络安全渗透测试描述 3.1 参考法规 3.2 渗透测试内容 4.小结 1.汽车网络安全法规概述 近年来&#xff0c;汽车…

C语言每日一题(24)回文素数题解

BC158 [NOIP1999]回文数 题目描述 若一个数&#xff08;首位不为零&#xff09;从左向右读与从右向左读都一样&#xff0c;我们就将其称之为回文数。 例如&#xff1a;给定一个10进制数56&#xff0c;将56加65&#xff08;即把56从右向左读&#xff09;&#xff0c;得到121是…

科技创意赋能乡村文旅振兴

近日&#xff0c;由北京大学创意产业研究中心联合中国国际科技促进会新基建专委会共同主办的“科技创意赋能乡村振兴研讨会”在京举行&#xff0c;与会专家学者围绕“和美乡村共同富裕智慧文旅”主题进行深入探讨。北京大学创意产业研究中心副主任吕艺、国家文化和旅游公共服务…

【MongoDB】集群搭建实战 | 副本集 Replica-Set | 分片集群 Shard-Cluster | 安全认证

文章目录 MongoDB 集群架构副本集主节点选举原则搭建副本集主节点从节点仲裁节点 连接节点添加副本从节点添加仲裁者节点删除节点 副本集读写操作副本集中的方法 分片集群分片集群架构目标第一个副本集第二个副本集配置集初始化副本集路由集添加分片开启分片集合分片删除分片 安…

2023数学建模国赛C题赛后总结

今天国赛的成绩终于出来了&#xff0c;盼星星盼月亮的。之前面试的时候已经把我给推到国奖评委那里去了&#xff0c;可是好可惜&#xff0c;最终以很微小的劣势错失国二。只拿到了广西区的省一。我心里还是很遗憾的&#xff0c;我真的为此准备了很久&#xff0c;虽然当中也有着…

001、Nvidia Jetson Nano Developer KIT(b01)

之——镜像烧录 杂谈 Nvidia Jetson Nano Developer KIT&#xff08;b01&#xff0c;4G&#xff09;&#xff0c;系统配置全纪录&#xff0c;镜像烧录、系统安装、远程桌面安装、cuda与torch安装、pycharm、pycuda、tensorrt等等。 正文 1.开发板系统安装 1.1 开发板简介 Jet…

8、Python模块和包:导入模块、创建自己的模块和包

文章目录 Python模块和包:导入模块、创建自己的模块和包导入模块创建自己的模块创建包使用相对导入结论Python模块和包:导入模块、创建自己的模块和包 Python是一种功能强大的编程语言,它的模块和包系统是其强大功能的基石之一。在Python中,模块是包含Python定义和声明的文…

OpenSign 开源 PDF 电子签名解决方案

OpenSign 是一个开源文档电子签名解决方案&#xff0c;旨在为 DocuSign、PandaDoc、SignNow、Adobe Sign、Smartwaiver、SignRequest、HelloSign 和 Zoho Sign 等商业平台提供安全、可靠且免费的替代方案。 特性&#xff1a; 安全签名&#xff1a;利用最先进的加密算法来确保…

python df.apply()函数

DataFrame.apply(func, axis0, rawFalse, result_typeNone, args(), by_row‘compat’, kwargs) 沿df的轴应用函数 func:对每行或者每列应用的函数axis{0 or ‘index’, 1 or ‘columns’}, default 0 0是列&#xff0c;1是行 rawbool, default False result_type**{‘expand…

交货单过账/保存后增强点

增强点&#xff1a;交货单过账后的增强点->SE18->DELIVERY_PUBLISH 这个增强点是在VL02N修改/过账之后触发的 业务场景&#xff1a;需要在交货单过账之后自动开发票 sy-ucomm WABU_T "交货过账 "分子公司转采的单子需要同步开发票IF ( ( sy-tcode VL01N OR…

09 基变换

基变换 基本概念坐标转换詹妮弗坐标系→平面直角坐标系平面直角坐标系→詹妮弗坐标系转换对比基本原则 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 基本概念 对于右手平面直角坐标系&#xff0c;一般用 i ⃗ \vec{i} i 和 j ⃗ \vec{j} j ​表示其基向量。…

PyCharm 无法登陆 Codeium 的解决方法

PyCharm 登陆 Codeium PyCharm 无法登陆 Codeium 的问题描述PyCharm 使用 token 登陆 Codeium PyCharm 无法登陆 Codeium 的问题描述 使用 PyCharm 登录 Codeium 时&#xff0c;单击 Login 无反应&#xff0c;单击侧边栏的 Codeium 图标也一直显示连接失败。 PyCharm 使用 to…

AI:59-基于深度学习的行人重识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…