Docker 实战

1. Docker常用指令


search 搜索镜像:
        docker search  
images列出镜像列表:
        docker images 
ps 查看容器进程列表:
        查看当前运行容器:
                docker ps 
        列出所有的容器,包括已终止的:
                 docker ps -a 
pull 拉取/下载镜像
        docker pull
run 命令创建容器
        -it 交互式
                docker run -it --name  
        -p 端口映射
                docker run -p 主机端口:容器端口
         -d 后台运行        
                docker run -d  
        -v 磁盘挂载
                docker run  -v 主机目录:容器目录 
stop restart stop 启动、重启、关闭容器
        docker start
        docker restart  
        docker stop
attach命令连接正在运行的容器
        docker attach
rmi 命令删除镜像
        docker rmi
rm 命令删除容器
        docker rm
inspect 查看容器细节
        docker inspect

2.Dockerfile


2.1 构建上下文

         当使用docker build命令时,当前工作目录被成为"构建上下文",docker build 默认查找当前目录的Dockerfile作为构建输入,也可通过-f指定Dockerfile,即docker build -f ./Dockerfile

2.2 常用指令

FROM: 选择基础镜像,推荐alpine
LABELS: 按标签组织项目
RUN: 执行命令
EXPOSE: 暴露端口,是镜像创建者和使用者的约定,
        可使用docker run -p port:container_port 进行端口映射.
ENV:设置环境变量
ADD:从源地址复制文件(文件 目录 url)到目标目录
COPY:从源地址(文件目录等本地文件)复制文件到目标目录
ENTERPOINT: 定义可执行的容器镜像的入口命令
        ENTERPOINT["executable","param1","param2"]
CMD: 容器镜像中包含应用的运行命令,需要带参数
        CMD["executable","param1","param2",...]
WORKDIR: 相当于cd,切换到工作目录
        WORKDIR /PATH
USER: 指定镜像以什么用户去执行
VOLUME: 向镜像容器添加卷
         VOLUME 主机目录 容器目录

2.3 构建原则

构建目标:镜像小 层级少 易管理 利用缓存
1)最小化层级数:
        最新的docker只有RUN COPY ADD创建新层,其他指令创建临时层,不会增加镜像大小.
        多条RUN指令可以通过&&连接符连接成一条指令集以减少层数.
        通过多段构建减少镜像层数.
2)复制文件时,每个文件应该独立复制,以确保某个文件变更时,只影响改文件对应的缓存.
3)编写dockerfile时,应该把变更频率低的编译指令优先构建,以便放在镜像底层有效利用build cache.
4)多行参数按字母排序,减少重复参数,提高可读性.

3.使用Dockerfile部署Go web项目


3.1 创建Go web项目

首先创建go web项目,本人使用gin框架作为web开发框架,gin是golang编写的web框架,具有REST风格注册路由,基数树实现路由匹配,Context实现对request和response的封装,RouterGroup实现路由处理,支持中间件,JSON验证,并内置JSON XML HTML渲染。

以下代码是使用gin框架、且最基础的的go代码:

package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/hello", func(c *gin.Context) {
		c.JSON(200, gin.H{"msg": "hello"})
	})
	r.Run(":8080")
}

3.2 Windows下的Goland连接Linux系统

配置Docker远端连接,通过tcp连接"tcp://host-ip:docker-port"远程连接Linux的Docker服务。

Docker 实战_第1张图片

在Edit Configurations中创建dockerfile配置项

Docker 实战_第2张图片

 具体配置过程可以参考:goland远程连接Linux的docker服务

3.2 创建Dockerfile,并分阶段构建镜像

通过保留二进制文件来减小镜像的大小:

FROM golang:alpine AS builder

# 设置环境变量
ENV GOMODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

# 移动到工作目录 /build
WORKDIR /build

# 将代码复制到容器中
COPY . .

# 设置环境变量,开启go module和配置下载代理
RUN go env -w GO111MODULE=on && \
    go env -w GOPROXY=https://goproxy.cn,direct &&  \
    go mod tidy  && \
    go build -o app .

# 创建小镜像
FROM scratch

# 从builder镜像中把/build/app 拷贝到当前目录
COPY --from=builder /build/app /

# 声明服务端口(暴露端口)
EXPOSE 8080

# 启动容器时运行的命令
CMD ["/app"]

可以看到在ubuntu系统中goweb的镜像已经构建完成。

 


文末至此,下午内容对大家有所帮助,感谢大家支持!

你可能感兴趣的:(Docker,docker,go,容器)