dockerfile定制镜像 & docker-compose编排容器

1 dockerfile

dockerfile本质上是利用了Linux系统的挂载(UnionFS),将多个目录挂载到同一目录下,实现镜像的层叠式结构,从而实现功能聚合。

1.1 一个最简单的程序

go 复制代码
package main

import "fmt"

func main() {
	fmt.Println("wish you good luck everyday!")
}

go build main.go编译生成二进制文件。

1.2 编写dockerfile文件

vim dockerfile

bash 复制代码
FROM ubuntu
ENV MYPATH=/usr/local
WORKDIR $MYPATH
ADD main ./
CMD ./main && tail -f /dev/null

解释:基于ubuntu镜像,设置落脚点目录为/usr/local,将当前目录的main文件添加到落脚点目录,最后指定容器启动时的执行命令。

这里加了tail -f /dev/null是为了防止容器退出,正常容器里会启动一个不会退出的服务进程,mysql、redis、web等等。

1.3 定制镜像

docker build -f dockerfile -t main .

1.4 生成容器

docker run -d --name main main

-d表示后台运行,--name指定容器名,后续可通过docker rename进行修改。

通过查询容器日志发现确实打印了输出语句:

1.5 进入容器

docker exec -it main bash

通过docker attach也能进入容器,个人偏向于exec,因为exit会导致前者的容器退出,而后者不受影响。

可以看到,当前落脚点就是/usr/local

2 docker-compose

docker-compose用于批量编排容器,通过yaml脚本可以快速编排出大量容器。

还是用上面的例子,以及定制好了main镜像:

2.1 编写docker-compose.yaml

yaml 复制代码
version: "3"
services:
        lucky_node:
                image: main
                container_name: lucky_node
                volumes:
                        - /usr/local/log.txt:/usr/local/log.txt
                command:
                        - /bin/bash
                        - -c
                        - |
                                ./main > log.txt
                                tail -f /dev/null

解释:编排名称为lucky_node容器,image指定依赖的镜像,volumes用来做容器数据卷,简单来说就是实现容器内外文件的对应,确保容器内的数据文件在宿主机上有完全相同份。command指定容器启动时的命令,这里执行main文件将输出结果重定向到log.txt文件中,由于容器数据卷的缘故,在本机的/usr/local目录应该可以看到对应的log.txt文件以及输出结果。

一个最简单的yaml模板:

yaml 复制代码
version: "3" 
services:
	service_name:
		image: 镜像名		
		container_name: 容器名
		ports: 
			- 本地端口号:容器端口号    # 端口映射
		volumes: 
			- 本地路径:容器内路径      # 容器数据卷
		command: 容器启动时要执行的命令 

2.2 编排容器

docker-compose up -d

2.3 查看log.txt

可以看到宿主机上和容器内都有一份log.txt文件,并且有main执行输出的结果。

docker-compose down -v删除该容器:

可以看到宿主机的log.txt仍然存在,即使容器宕机,设置了容器数据卷的文件依然保留在宿主机上,避免数据的丢失。

相关推荐
CodeWithMe6 分钟前
[ Vim ] 常用命令 and 配置
linux·编辑器·vim
DC_BLOG10 分钟前
Linux-GlusterFS进阶分布式卷
linux·运维·服务器·分布式
cookies_s_s44 分钟前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
丁劲犇1 小时前
碳基生物的悲歌-DeepSeek思考实现Linux动态库递归收集工具
linux·递归·deepseek·ldd
zhouwu_linux1 小时前
MT7628基于原厂的SDK包, 修改ra1网卡的MAC方法。
linux·运维·macos
2401_897930062 小时前
linux系统如何配置host.docker.internal
linux·docker·eureka
诶尔法Alpha2 小时前
Linux上使用dify构建RAG
linux·运维·服务器
熬夜苦读学习3 小时前
Linux文件系统
linux·运维·服务器·开发语言·后端
沐千熏3 小时前
Liunx(CentOS-6-x86_64)系统安装MySql(5.6.50)
linux·mysql·centos
黑牛先生4 小时前
【Linux】匿名管道
linux·运维·服务器