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仍然存在,即使容器宕机,设置了容器数据卷的文件依然保留在宿主机上,避免数据的丢失。

相关推荐
小毛驴85017 分钟前
所有微服务部署都使用一个git地址,并且通过docker部署各个服务的情况下,如何编写mvn指令来处理各个服务。
git·docker·微服务
软件测试很重要19 分钟前
UOS20系统安装与 SSH/XRDP 远程访问功能配置指南
linux·运维·ssh
GanGuaGua1 小时前
Linux系统:线程的互斥和安全
linux·运维·服务器·c语言·c++·安全
lsnm2 小时前
【LINUX网络】IP——网络层
linux·服务器·网络·c++·网络协议·tcp/ip
不掰手腕2 小时前
在UnionTech OS Server 20 (统信UOS服务器版) 上离线安装PostgreSQL (pgsql) 数据库
linux·数据库·postgresql
感哥2 小时前
Docker网络
docker
Lynnxiaowen2 小时前
今天继续昨天的正则表达式进行学习
linux·运维·学习·正则表达式·云计算·bash
努力学习的小廉2 小时前
深入了解linux系统—— POSIX信号量
linux·运维·服务器
刘一说3 小时前
CentOS部署ELK Stack完整指南
linux·elk·centos
从零开始的ops生活3 小时前
【Day 50 】Linux-nginx反向代理与负载均衡
linux·nginx