C++GO语言微服务之Dockerfile && docker-compose

目录

[01 01-知识点概述](#01 01-知识点概述)

[02 02-dockerfile复习](#02 02-dockerfile复习)

[03 03-环境变量ENV的使用](#03 03-环境变量ENV的使用)

[04 04-WORKDIR的使用](#04 04-WORKDIR的使用)

[05 05-USER和ARG的使用](#05 05-USER和ARG的使用)

[06 06-ONBUILD的使用](#06 06-ONBUILD的使用)

[07 07-dockerfile的缓存相关的参数](#07 07-dockerfile的缓存相关的参数)

[08 08-dockerfile的编写](#08 08-dockerfile的编写)

[09 09-测试-没成功-好像是网不行](#09 09-测试-没成功-好像是网不行)

[01 10-docker-compose介绍](#01 10-docker-compose介绍)

[02 11-docker-compose的安装](#02 11-docker-compose的安装)


01 01-知识点概述

Dockerfile
注意事项:
文件名首字母大写
存储Dockerfile的目录, 尽量是空目录
制作的镜像功能尽量单一
制作步骤要尽可能精简
1.1 Dockerfile 的构成
#
dockerfile中的注释使用: #
基础镜像信息
要制作的新的镜像, 基于那个镜像来制作的
通过 docker images 查看
FROM 镜像名
维护者信息
这个dockerfile是谁写的
MAINTAINTER 信息
镜像操作指令
基于原始进行进行的操作
容器启动指令
基于第三步得到了新镜像
新的镜像启动之后, 在容器中默认执行的指令
1.2 Dockerfile 基础指令
#
FROM
RUN mkdir /home/go/hello
RUN mkdir /home/go/world
RUN mkdir /home/go/hello && mkdir /home/go/world

02 02-dockerfile复习

1.1 Dockerfile 的构成
#
dockerfile中的注释使用: #
基础镜像信息
要制作的新的镜像, 基于那个镜像来制作的
通过 docker images 查看
FROM 镜像名
维护者信息
这个dockerfile是谁写的
MAINTAINTER 信息
镜像操作指令
基于原始进行进行的操作
容器启动指令
基于第三步得到了新镜像
新的镜像启动之后, 在容器中默认执行的指令
1.2 Dockerfile 基础指令
#
FROM
RUN mkdir /home/go/hello
RUN mkdir /home/go/world
RUN mkdir /home/go/hello && mkdir /home/go/world
RUN
COPY
ADD
EXPOSE
CMD
ENTRYPOINT
VOLUME

03 03-环境变量ENV的使用

1.2 Dockerfile 基础指令
#
FROM
RUN mkdir /home/go/hello
RUN mkdir /home/go/world
RUN mkdir /home/go/hello && mkdir /home/go/world
1
2
3
4
RUN
COPY
ADD
EXPOSE
1
2
3
4
CMD
ENTRYPOINT
VOLUME
1
2
3MAINTAINER
RUN
EXPOSE
1.3 Dockerfile 运行时指令
#
CMD
ENTRYPOINT
CMD ENTRYPOINT 综合使用
FROM 镜像名
FROM 镜像名:tag

FROM必须要出现Dockerfile的第一行(除注释), 可以连续写多个FROM创建多个镜像.

如果指定的镜像名本地仓库没有, 会从远程仓库pull到本地, 远程仓库也没有 -> 报错.

dockerfile维护者信息
MAINTAINER 维护人员信息

构建镜像时候执行的shell命令, 如果命令有确认操作, 必须要加 -y

如果命令太长需要换行, 行末尾需要加 \

RUN shell命令
RUN mkdir /home/go/test -p
RUN ["mkdir", "/home/go/test", "-p"]

设置对外开放的端口

容器和外部环境是隔离的, 如何向从外部环境访问到容器内部, 需要容器开发端口

在使用的时候, 让宿主机端口和容器开放端口形成一个映射关系, 就可以访问了

docker run -itd -p 8888:80

EXPOSE 80

新镜像已经被制作完毕, 启动新镜像-> 得到一个容器

容器启动后默认执行的命令

一个dockerfile文件只能指定一个CMD指令

如果指定多个, 只有最后一个有效

该CMD会被 docker run指定的shell命令覆盖

CMD shell命令
CMD ["shell命令", "命令参数1", "命令参数2"]

04 04-WORKDIR的使用

docker run -itd ubuntu

任何docker run设置的命令参数或者CMD指令的命令,都将作为ENTRYPOINT 指令的命令参数,追加到

ENTRYPOINT指令之后
ENTRYPOINT mkdir /home/go/a/b/c/d/e/f
CMD -p
mkdir /home/go/a/b/c/d/e/f -p ls

05 05-USER和ARG的使用

Dockerfile 文件编辑指令
#
ADD
COPY
VOLUME
1.5 Dockerfile 环境指令
#
ENV
环境变量:
系统级别
用户级别
环境变量名大写
docker run -itd ubuntu

任何docker run设置的命令参数或者CMD指令的命令,都将作为ENTRYPOINT 指令的命令参数,追加到

ENTRYPOINT指令之后
ENTRYPOINT mkdir /home/go/a/b/c/d/e/f
CMD -p
mkdir /home/go/a/b/c/d/e/f -p ls
1
2
3
4
5

将宿主机文件拷贝到容器目录中

如果宿主机文件是可识别的压缩包, 会进行解压缩 -> tar

ADD 宿主机文件 容器目录/文件

实例

ADD ["宿主机文件", "容器目录"]

  • 宿主机文件一般放到Dockerfile对应的目录中
  • 容器目录, 有可能存在, 有可能不存在
  • 存在: 直接拷贝到容器目录
  • 不存在: 先在容器中创建一个, 再拷贝
    ADD ["a.txt", "/home/go/a.txt"]
  • 第二个参数如果指定的是一个文件名
  • 这个文件存在: 直接覆盖
  • 不存在: 直接拷贝

COPY 指令和ADD 指令功能和使用方式类似。只是COPY 指令不会做自动解压工作。

单纯复制文件场景,Docker 推荐使用COPY

COPY ["a.tar.gz", "/home/"]
1
2
3

数据卷容器创建, 挂载点为/backup

docker create -it --name contains -v /backup ubuntu bash

其他容器挂载到数据卷容器上

docker run -itd --volumes-from contains ubuntu bash

VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点

通过VOLUME 指定挂载点目录是自动生成的。

VOLUME ["/data"]

06 06-ONBUILD的使用

Dockerfile 环境指令
#
ENV
环境变量:
系统级别
用户级别
环境变量名大写
docker run -itd ubuntu

任何docker run设置的命令参数或者CMD指令的命令,都将作为ENTRYPOINT 指令的命令参数,追加到

ENTRYPOINT指令之后
ENTRYPOINT mkdir /home/go/a/b/c/d/e/f
CMD -p
mkdir /home/go/a/b/c/d/e/f -p ls
1
2
3
4
5

将宿主机文件拷贝到容器目录中

如果宿主机文件是可识别的压缩包, 会进行解压缩 -> tar

ADD 宿主机文件 容器目录/文件

实例

ADD ["宿主机文件", "容器目录"]

  • 宿主机文件一般放到Dockerfile对应的目录中
  • 容器目录, 有可能存在, 有可能不存在
  • 存在: 直接拷贝到容器目录
  • 不存在: 先在容器中创建一个, 再拷贝
    ADD ["a.txt", "/home/go/a.txt"]
  • 第二个参数如果指定的是一个文件名
  • 这个文件存在: 直接覆盖
  • 不存在: 直接拷贝

COPY 指令和ADD 指令功能和使用方式类似。只是COPY 指令不会做自动解压工作。

单纯复制文件场景,Docker 推荐使用COPY

COPY ["a.tar.gz", "/home/"]
1
2
3

数据卷容器创建, 挂载点为/backup

docker create -it --name contains -v /backup ubuntu bash

其他容器挂载到数据卷容器上

docker run -itd --volumes-from contains ubuntu bash

VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点

通过VOLUME 指定挂载点目录是自动生成的。

VOLUME ["/data"]
9Linux: env
WORKDIR
USER
ARG
1.6 Dockerfile 触发器指令
#

设置环境变量,可以在RUN 之前使用,然后RUN 命令时调用,容器启动时这些环境变量都会被指定

ENV <key> <value> (一次设置一个环境变量)
ENV <key>=<value> ... (一次设置一个或多个环境变量)
ENV HELLO 12345
ENV HELLO=12345
ENV HELLO=12345 WORLD=12345 NIHAO=12345
ENV MYPATH=/a/b/c/d/e/f/g/h/....../z
mkdir /home/go $MYPATH

切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。相当于cd

可以多次切换(相当于cd 命令),

也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

WORKDIR /path/to/workdir
RUN a.sh
WORKDIR /path
WORKDIR /bin/abc
WORKDIR to # 相对路径 /bin/abc/to
WORKDIR workdir # /bin/abc/to/workdir
RUN pwd
/bin/abc/to/workdir

可执行程序 a.out

现在在家目录下

./a.out

工作目录进行了切换

WORKDIR /home/go/test/work
./a.out

07 07-dockerfile的缓存相关的参数

USER
ARG
1.6 Dockerfile 触发器指令
#

设置环境变量,可以在RUN 之前使用,然后RUN 命令时调用,容器启动时这些环境变量都会被指定

ENV <key> <value> (一次设置一个环境变量)
ENV <key>=<value> ... (一次设置一个或多个环境变量)
ENV HELLO 12345
ENV HELLO=12345
ENV HELLO=12345 WORLD=12345 NIHAO=12345
ENV MYPATH=/a/b/c/d/e/f/g/h/....../z
mkdir /home/go $MYPATH

切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。相当于cd

可以多次切换(相当于cd 命令),

也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

WORKDIR /path/to/workdir
RUN a.sh
WORKDIR /path
WORKDIR /bin/abc
WORKDIR to # 相对路径 /bin/abc/to
WORKDIR workdir # /bin/abc/to/workdir
RUN pwd
/bin/abc/to/workdir

可执行程序 a.out

现在在家目录下

./a.out

工作目录进行了切换

WORKDIR /home/go/test/work
./a.out

指定运行容器时的用户名和UID,后续的RUN 指令也会使用这里指定的用户。

如果不输入任何信息,表示默认使用root 用户

USER daemon

/etc/passwd 文件的第一列就是用户名

ARG 指定了一个变量在docker build 的时候使用,可以使用--build-arg <varname>=<value>来指定参数

的值。
ARG <name>[=<default value>]
#dockerfile写好之后
docker build -t 镜像名:镜像tag dockerfile的存储目录

08 08-dockerfile的编写

6 Dockerfile 触发器指令
#

设置环境变量,可以在RUN 之前使用,然后RUN 命令时调用,容器启动时这些环境变量都会被指定

ENV <key> <value> (一次设置一个环境变量)
ENV <key>=<value> ... (一次设置一个或多个环境变量)
ENV HELLO 12345
ENV HELLO=12345
ENV HELLO=12345 WORLD=12345 NIHAO=12345
ENV MYPATH=/a/b/c/d/e/f/g/h/....../z
mkdir /home/go $MYPATH
8

切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。相当于cd

可以多次切换(相当于cd 命令),

也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

WORKDIR /path/to/workdir
RUN a.sh
WORKDIR /path
WORKDIR /bin/abc
WORKDIR to # 相对路径 /bin/abc/to
WORKDIR workdir # /bin/abc/to/workdir
RUN pwd
/bin/abc/to/workdir

可执行程序 a.out

现在在家目录下

./a.out

工作目录进行了切换

WORKDIR /home/go/test/work
./a.out
1

指定运行容器时的用户名和UID,后续的RUN 指令也会使用这里指定的用户。

如果不输入任何信息,表示默认使用root 用户

USER daemon

/etc/passwd 文件的第一列就是用户名

ARG 指定了一个变量在docker build 的时候使用,可以使用--build-arg <varname>=<value>来指定参数

的值。
ARG <name>[=<default value>]
#dockerfile写好之后
docker build -t 镜像名:镜像tag dockerfile的存储目录
5
6ONBUILD
1.7 Dockerfile 构建缓存
#
1.8 通过 Dockerfile 构建 beego 镜像
#
2. docker-compose
Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker
Compose不再需要使用shell脚本来启动容器。
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用
docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用
多个容器进行开发的场景。
知道yaml文件格式
docker-compose工具工作的时候需要使用一个配置文件
默认的名字: docker-compose.yaml/yml
docker-compose中常用关键字
docker-compose操作命令
启动, 关闭, 查看
2.1 docker-compose 的安装
#

当一个镜像A被作为其他镜像B的基础镜像时,这个触发器才会被执行,

新镜像B在构建的时候,会插入触发器中的指令。

ONBUILD [command]

原始镜像 -> 纯净版

-> 修改 ONBUILD ["echo", "hello,linux"]

基于原始镜像制作新镜像 -> 镜像A

-> 启动镜像A -> 不会输出hello, linux

基于镜像A制作了镜像B

-> 启动镜像B -> 会输出 hello, linux

09 09-测试-没成功-好像是网不行

通过 Dockerfile 构建 beego 镜像
#
2. docker-compose
Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker
Compose不再需要使用shell脚本来启动容器。
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用
docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用
多个容器进行开发的场景。
知道yaml文件格式
docker-compose工具工作的时候需要使用一个配置文件
默认的名字: docker-compose.yaml/yml
docker-compose中常用关键字
docker-compose操作命令
启动, 关闭, 查看
2.1 docker-compose 的安装

01 10-docker-compose介绍

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

02 11-docker-compose的安装

yaml 文件格式
#
YAML有以下基本规则: 1、大小写敏感 2、使用缩进表示层级关系 3、禁止使用tab缩进, 只能使用空格键
4、缩进长度没有限制(只能使用空格缩进),只要元素对齐就表示这些元素属于一个层级。 5、使用#表示注
释 6、字符串可以不用引号标注
"字符串"
'字符串'
字符串
123 -> 整数
123a

相关推荐
筏.k3 分钟前
智能指针入门:深入理解 C++ 的 shared_ptr
开发语言·c++·c#11.0
陌尘(MoCheeen)34 分钟前
技术书籍推荐(002)
java·javascript·c++·python·go
Wooden-Flute42 分钟前
十二、操作符重载
c++
污斑兔1 小时前
在Mac环境下搭建Docker环境的全攻略
docker
huangyuchi.1 小时前
【C++】智能指针
开发语言·jvm·c++·笔记·c++11·智能指针·shared_ptr
modest —YBW1 小时前
Ollama+OpenWebUI+docker完整版部署,附带软件下载链接,配置+中文汉化+docker源,适合内网部署,可以局域网使用
人工智能·windows·docker·语言模型·llama
南玖yy1 小时前
C/C++ 内存管理深度解析:从内存分布到实践应用(malloc和new,free和delete的对比与使用,定位 new )
c语言·开发语言·c++·笔记·后端·游戏引擎·课程设计
RingWu2 小时前
微服务架构-限流、熔断:Alibaba Sentinel入门
微服务·架构·sentinel
李匠20242 小时前
C++GO语言微服务基础技术②
开发语言·c++·微服务·golang
深蓝易网2 小时前
深度拆解!MES如何重构生产计划与排产调度全流程?
大数据·运维·人工智能·重构·架构·制造