【基础工具】Docker基础功能

Last updated on February 22, 2024 am

参考文档

Docker介绍

Docker 是一个应用打包、分发、部署的工具,也可以把它理解为一个轻量的虚拟机,它只虚拟你软件需要的运行环境,多余的一点都不要,而普通虚拟机则是一个完整而庞大的系统,包含各种不管你要不要的软件。

Docker

特性 普通虚拟机 Docker
跨平台 通常只能在桌面级系统运行,例如 Windows/Mac,无法在不带图形界面的服务器上运行 支持的系统非常多,各类 windows 和 Linux 都支持
性能 性能损耗大,内存占用高,因为是把整个完整系统都虚拟出来了 性能好,只虚拟软件所需运行环境,最大化减少没用的配置
自动化 需要手动安装所有东西 一个命令就可以自动部署好所需环境
稳定性 稳定性不高,不同系统差异大 稳定性好,不同系统都一样部署方式

Docker 主要功能

  • 打包:就是把你软件运行所需的依赖、第三方库、软件打包到一起,变成一个安装包
  • 分发:你可以把你打包好的“安装包”上传到一个镜像仓库,其他人可以非常方便的获取和安装
  • 部署:拿着“安装包”就可以一个命令运行起来你的应用,自动模拟出一摸一样的运行环境,不管是在 Windows/Mac/Linux。

Docker 用途介绍

  • 应用分发、部署,方便传播给他人安装。特别是开源软件和提供私有部署的应用
  • 快速安装测试/学习软件,用完就丢(类似小程序),不把时间浪费在安装软件上。例如 Redis / MongoDB / ElasticSearch / ELK
  • 多个版本软件共存,不污染系统,例如 Python2、Python3,Redis4.0,Redis5.0
  • Windows 上体验/学习各种 Linux 系统

Docker主要概念

  • 镜像:可以理解为软件安装包,可以方便的进行传播和安装。
  • 容器:软件安装后的状态,每个软件运行环境都是独立的、隔离的,称之为容器。
  • 简单来说就是我们存储上传镜像,通过镜像生成容器,镜像可以在docker hub中进行管理

Docker的安装

版本的安装

镜像加速源

镜像加速器 镜像加速器地址
Docker 中国官方镜像 https://registry.docker-cn.com
DaoCloud 镜像站 http://f1361db2.m.daocloud.io
Azure 中国镜像 https://dockerhub.azk8s.cn
科大镜像站 https://docker.mirrors.ustc.edu.cn
阿里云 https://ud6340vz.mirror.aliyuncs.com
七牛云 https://reg-mirror.qiniu.com
网易云 https://hub-mirror.c.163.com
腾讯云 https://mirror.ccs.tencentyun.com
添加docker的镜像源

加入以下命令:=="registry-mirrors": ["https://registry.docker-cn.com, https://hub-mirror.c.163.com"]==

Docker镜像下载与软件安装

Docker 安装的优点

  • 一个命令就可以安装好,快速方便
  • 有大量的镜像,可直接使用
  • 没有系统兼容问题,Linux 专享软件也照样跑
  • 支持软件多版本共存
  • 用完就丢,不拖慢电脑速度
  • 不同系统和硬件,只要安装好 Docker 其他都一样了,一个命令搞定所有

Docker 安装 Redis

Docker 官方镜像仓库查找 Redis :https://hub.docker.com/

查找redis镜像

找到如下的命令:

1
$ docker run --name some-redis -d redis
  • --name的意思就是为产生的容器命名,比如这里命名为some-redis
  • -d的意思是在后台运行
  • 执行docker run就能立刻 pull镜像、生成容器、以及运行容器

Docker安装ubuntu

安装ubuntu

首先先从远端拉取镜像,可以指定版本或者是最新的版本

接着本地进行run

1
2
- docker pull ubuntu:18.04
- docker run -it ubuntu /bin/bash

Docker参考文档

命令参考:https://docs.docker.com/engine/reference/commandline/run/

Docker的常见命令

  • docker run 运行一个容器(-d后台运行、--name重命名container)
  • docker stop 停止运行一个容器
  • docker ps 列出正在运行的容器
  • docker ps -a 列出所有的容器
  • docker rm 删除某个容器
  • docker exec (-it mycontainer /bin/sh)进入某一个容器; docker exit 退出某个容器
  • docker stop container-id 停止指定 id 的容器docker start container-id 启动某个id容器
  • docker images 查看镜像列表
  • docker rm container-id 删除指定 id 的容器
  • docker rmi image-id 删除指定 id 的镜像
  • docker volume ls 查看 volume 列表
  • docker network ls 查看网络列表
  • docker-compose up 表示的意思是在docker-compose.yml的文件夹所在的位置运行如下
  • docker-compose up -d 后台运行只需要加一个 -d 参数
  • docker-compose ps 查看运行状态
  • docker-compose stop 停止运行
  • docker-compose 重启docker compose的服务
  • docker-compose restart service-name 重启单个服务
  • docker-compose exec service-name sh 进入容器命令行

Docker创建镜像

Dockerfile是用于创建自定义Docker镜像的文件,其主要作用包括配置文件、挂载点、对外暴露的端口和设置环境变量

容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

Dockerfile 操作常用指令

  1. FROM 镜像

    指定新镜像所基于的基础镜像,第一条指令必须为FROM 指令,每创建一个镜像就需要一条 FROM 指令

    1
    2
    #指定了go的镜像:这个时候会从网上下载
    FROM golang:1.20-alpine
  2. MAINTAINER 名字

    说明新镜像的维护人信息

    1
    2
    #指定维护者的信息
    LABEL maintainer="XXXXX@gmail.com"
  3. WORKDIR 路径 为后续的 RUN、CMD、ENTRYPOINT 指定工作目录

    这里定义的目录相当于是在docker的文件夹下定义新的目录并会将本地的文件内容上传上去

    1
    2
    # 定义工作目录
    WORKDIR /Workspace/ApiService
  4. RUN 命令

    在所基于的镜像上执行命令,并提交到新的镜像中

    1
    2
    #编译应用程序
    RUN go build -o api_service main.go
  5. CMD ["要运行的程序", "参数1", "参数2"]

    Dockerfile只能有一条CMD命令。如果指定多条命令,只执行最后一条命令。

    1
    2
    # 运行应用程序
    CMD ["./api_service"]
  6. EXPOSE 端口号

    指定新镜像加载到 Docker 时要开启的端口

    1
    2
    # 暴露端口
    EXPOSE 8080
  7. ENV 环境变量 变量值

    设置一个环境变量的值,会被后面的 RUN 使用

    1
    2
    3
    # 设置环境变量
    ENV BUILD_ENV local
    ENV TZ=Asia/Shanghai #容器内部的时间设置与上海所在的时区一致
  8. ADD 源文件/目录 目标文件/目录

    将源文件复制到镜像中,源文件要与 Dockerfile 位于相同目录

    例子本地的文件在/Workspace/ApiService中,这个时候会将本地的/Workspace/ApiService目录下所有的文件送到docker中的/Workspace/ApiService/docker

    1
    2
    3
    4
    WORKDIR /Workspace/ApiService

    ADD docker .
    #ADD . . #这里表示相同文件夹目录直接复制
  9. VOLUME [“目录”] 在容器中创建一个挂载点

Build镜像并运行

构建dockerfile镜像并运行

要运行 Dockerfile 文件,需要使用 Docker 工具。Docker 可以在不同的操作系统上运行,包括 Windows、macOS 和各种 Linux 发行版。以下是一些运行 Dockerfile 的步骤:

  1. 安装 Docker 工具

在官网上下载并安装 Docker 工具,根据你的操作系统选择对应版本。安装完成后,可以在终端中运行 docker 命令来检查是否安装成功。

  • 进入 Dockerfile 所在目录

打开终端,进入 Dockerfile 所在目录。可以使用 cd 命令切换目录。

  • 构建 Docker 镜像

使用以下命令构建 Docker 镜像:

1
2
docker build -t <镜像名称> .
#docker build -t api_service .

其中 -t 参数用于指定镜像的名称,. 表示 Dockerfile 所在目录。执行该命令后,Docker 会根据 Dockerfile 文件中的指令创建镜像。

  • 运行 Docker 容器

使用以下命令运行 Docker 容器:

1
2
3
docker run -p <主机端口>:<容器端口> <镜像名称>
docker run -d --name my_container -p<主机端口>:<容器端口> <镜像名称>
#docker run -d --name api-container -p 8080:8080 api_service

其中 -p 参数用于指定主机端口和容器端口的映射关系,<镜像名称> 是在第 3 步中指定的镜像名称。执行该命令后,Docker 会在后台启动一个容器,并将容器的标准输出输出到终端中。如果 Dockerfile 中没有指定端口,需要在运行容器时指定 -p 参数,并将容器端口映射到主机上的一个端口。否则,容器会启动失败。

-d表示的当前的容器可以在后台运行

--name表示给指定的容器起个名字,否则会随机生成名字

停止docekr容器

使用如下命令停止:

1
docker stop <container-id>

其中,<container-id> 是要停止的容器的 ID。可以使用以下命令查看正在运行的容器列表:

1
docker ps

如果要停止所有容器,可以使用以下命令:

1
docker stop $(docker ps -aq)

其中,docker ps -aq 命令用于列出所有容器的 ID。

Scratch最小镜像

使用scratch镜像时,确保应用程序是静态的可执行文件或者不需要额外的操作系统层,这样可以最大程度地减少镜像的大小

我们这里给出一个例子

首先在创建一个最小的镜像的时候需要一个应用程序,这个程序可以通过dockerfile生成或者是从其他地方引入,那么这里给出一个golang 镜像构建应用程序api_service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 第一阶段:使用 golang 镜像构建应用程序
FROM golang:1.20-alpine AS builder

# 定义工作目录
WORKDIR /workspace

# 复制源代码到工作目录
COPY . .

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

# 编译应用程序
RUN go build -o api_service main.go

接着第二阶段就建一个最小的轻量级的docker镜像,首先需要按照构建镜像的基本步骤确定工作目录,环境变量、端口等信息,接着通过从已经编译好的环境中获取应用程序,最后执行程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 第二阶段:创建一个新的轻量级镜像
FROM scratch

# 设置工作目录
WORKDIR /app

# 从 builder 镜像中复制编译好的应用程序
COPY --from=builder /workspace/api_service .

# 设置环境变量
ENV BUILD_ENV local
ENV TZ=Asia/Shanghai

# 暴露端口
EXPOSE 8080

# 运行应用程序
CMD ["./api_service"]

写好dockerfile之后就可以构建并运行了

1
2
docker build -t api_scratch .
docker run -d --name scratch_container -p 8080:8080 api_scratch

注意:通过这个方式只会产生一个scratch镜像,仅包含一个应用程序

Docker-Compose

如果项目依赖更多的第三方软件,我们需要管理的容器就更加多,每个都要单独配置运行,指定网络。使用 docker-compose 把项目的多个服务集合到一起,一键运行。要把项目依赖的多个服务集合到一起,我们需要编写一个docker-compose.yml文件,描述依赖哪些服务

Wordpress安装

在dockerhub在安装wordpress的时候,所需要的服务非常多,所以需要把项目依赖的多个服务集合到一起

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
version: '3.1'

services:

wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html

db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql

volumes:
wordpress:
db:

首先编写一个:docker-compose.yml

接着在docker-compose.ym==l文件所在的位置==执行:docker-compose up就可以了

注意:执行完docker-compose up之后就已经生成容器并已经成功run起来了


【基础工具】Docker基础功能
https://lihaibineric.github.io/2024/01/19/tool_docker/
Author
Haibin Li
Posted on
January 19, 2024
Updated on
February 22, 2024
Licensed under