1. docker语法详解
Dockerfile是用来定义Docker镜像构建过程的文本文件。它包含了一系列的指令和参数,告诉Docker如何组成一个镜像
Dockerfile文件的基本结构
一个基本的Dockerfile通常包含一下几个部分:
1.基础镜像指令(FROM)
指定基于哪个已有的镜像构建新镜像,每个Dockerfile必须以FROM 指令开始
示例:FROM centos:7.9
2.工作目录设置(WORKDIR,可选)
设置容器内部的工作目录
示例:WORKDIR /app
3.复制文件(COPY或ADD,可选)
将文件或目录从构建上下文复制到镜像中的制定路径
COPY只是拷贝,ADD先解压再拷贝
4.运行命令(RUN,可选)
在镜像构建过程中执行的命令,可以安装软件包、更新系统等
示例:RUN apt-get update && apt-get install nginx -y
5.容器启动时执行命令(CMD或ENTRYPOINT,可选)
容器启动后执行的默认命令,可被Dockerfile中的CMD或ENTRYPOINT指令制定
示例:CMD ["nginx","-g","daemon off;"]
6.暴露端口(EXPOSE,可选)
声明容器运行时的服务监听的端口
示例:EXPOSE 80
2.dockerfile实战演练-nginx
基于Dockerfile构建镜像可以使用docker build命令。docker build命令中使用 -f 可已指定具体的dockerfile文件
1)创建一个dockerfile文件(文件中不能出现 #注释之类)
vi Dockerfile
FROM /rockylinux:8.9 # 指定基础镜像
LABEL maintain="ak" # 维护信息
RUN yum install nginx -y # 使用RUN指令安装nginx COPY index.html /usr/share/nginx/html/ # copy首页文件到容器中,可以先创建
EXPOSE 80 # 声明nginx的80端口 ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"] #启动nginx
2)构建镜像
docker build -t mynginx:v1 .
docker images
3)启动容器并测试
docker run --name mynginx -d -p 80 mynginx:v1 docker ps -a curl localhost:32770 http://172.16.80.140:32770
3.dockerfile实战演练-tomcat
1) 创建一个dockerfile文件(文件中不能出现 #注释之类)
vi Dockerfile
FROM centos MAINTAINER ak
RUN rm -rf /etc/yum.repos.d/*
COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/
RUN yum install wget -y
COPY jdk-8u45-linux-x64.rpm /usr/local/
ADD apache-tomcat-8.0.26.tar /usr/local/
RUN cd /usr/local && yum install -y jdk-8u45-linux-x64.rpm RUN mv /usr/local/apache-tomcat-8.0.26 /usr/local/tomcat8
ENTRYPOINT
/usr/local/tomcat8/bin/startup.sh && tail -F /usr/local/tomcat8/logs/catalina.out
EXPOSE 8080
2) 构建镜像 docker build -t mynginx:v1 .
3) 启动容器并测试
docker run --name mytomcat -d -p 8080 tomcat8 docker ps -a curl localhost:32771 http://172.16.80.140:32771
4.dockerfile实战演练-go代码
1)安装go环境 配置go的安装源
rpm --import https://mirror.go-repo.io/centos/RPM-GPG-KEY-GO-REPO
curl -s https://mirror.go-repo.io/centos/go-repo.repo | tee /etc/yum.repos.d/go-repo.repo
yum install golang go version
2)写一个go代码,main.go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func statusOKHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"status": "success~welcome to study"})
}
func versionHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"version": "v1.1版本"})
}
func main() {
router := gin.New()
router.Use(gin.Recovery())
router.GET("/", statusOKHandler)
router.GET("/version", versionHandler)
router.Run(":8080")
}
3)Go mod初始化项目
go mod init test
# 设置代理
go env -w GOPROXY=https://goproxy.cn,direct
go mod tidy
#构建源码
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o k8s-demo main.go
# 生成k8s-demo二进制文件
4)创建一个dockerfile文件(文件中不能出现 #注释之类)
vi Dockerfile
FROM alpine
WORKDIR /data/app
ADD k8s-demo /data/app/
CMD ["/bin/sh","-c","./k8s-demo"]
5)构建镜像
docker build -t k8s-demo:v1 .
docker images
6)启动容器并测试
docker run -d --name go -p 30180:8080 k8sdemo:v1
docker ps -a
curl localhost:30180
http://172.16.80.140:30180
5.dockerfile实战演练-python
1)创建一个dockerfile文件(文件中不能出现 #注释之类)
vi Dockerfile
FROM python:3.7
RUN mkdir /app
WORKDIR /app
ADD . /app/
RUN /usr/local/bin/python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
EXPOSE 5000
CMD ["python","/app/main.py"]
2)构建镜像
docker build -t hello-python:v1 .
3)启动容器并测试
docker run -d --name python -p 30050:5000 hello-python:v1
docker ps -a | grep python
curl localhost:30050 http://172.16.80.140:30050