Docker

Docker


# 删除匿名镜像
docker rmi $(docker images | grep "none" | awk '{print $3}')

# 启动frps (image为snowdreamtech/frps:0.51.3)
docker run --restart=always -d \ 
--network host \ 
-v /etc/localtime:/etc/localtime:ro \ # 同步宿主机时间配置 \ 
-v /etc/frp/frps/frps.ini:/etc/frp/frps.ini \ # 映射frpc配置文件 \ 
-v /var/log/frps.log:/var/log/frps.log  \ # 映射日志文件目录 \ 
--name=frps \ 
snowdreamtech/frps:0.51.3

# 启动frpc (image为snowdreamtech/frpc:0.51.3)
docker run --restart=always -d \ 
--network host \ 
-v /etc/localtime:/etc/localtime:ro \ # 同步宿主机时间配置 \ 
-v /etc/frp/frpc/frps.ini:/etc/frp/frpc.ini \ # 映射frpc配置文件 \ 
-v /var/log/frps.log:/var/log/frps.log  \ # 映射日志文件目录 \ 
--name=frpc \ 
snowdreamtech/frpc:0.51.3

安装Docker

卸载旧版本

旧版本的 Docker 被称为docker,docker.iodocker-engine. 如果安装了这些,请卸载它们:

sudo apt-get remove docker docker-engine docker.io containerd runc

如果 apt-get 报告没有安装这些软件包,那也没关系。

安装方法

您可以根据需要以不同的方式安装 Docker Engine:

  • 大多数用户 设置 Docker 的存储库并从中安装,以便于安装和升级任务。这是推荐的方法,除了 Raspbian。
  • 一些用户下载 DEB 包并 手动安装,完全手动管理升级。这在诸如在无法访问 Internet 的气隙系统上安装 Docker 等情况下很有用。
  • 在测试和开发环境中,一些用户选择使用自动化 便利脚本来安装 Docker。这是目前 Raspbian 的唯一方法。

🔺使用存储库安装

在新主机上首次安装 Docker Engine 之前,您需要设置 Docker 存储库。之后,您可以从存储库安装和更新 Docker。

(一) 设置存储库(注意设置中的系统版本)

  1. 更新 apt 包索引并安装包以允许 apt 通过 HTTPS 使用存储库:

    sudo apt-get update
    
    sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
  2. 添加 Docker 的官方 GPG 密钥(debian):

    sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  3. 使用以下命令设置存储库(debian):

    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
      $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

(二) 安装 Docker 引擎

此过程适用于 x86_64 / amd64armhfarm64 和 Raspbian 上的 Debian。

  1. 🔺更新apt包索引,安装最新版本的 Docker Engine、containerd 和 Docker Compose :

    或者进入下一步安装特定版本
    sudo apt-get update
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  2. 要安装特定版本的 Docker Engine,请在 repo 中列出可用版本,然后选择并安装:

    a. 列出您的存储库中可用的版本:

    apt-cache madison docker-ce
    
      docker-ce | 5:18.09.1~3-0~debian-stretch | https://download.docker.com/linux/debian stretch/stable amd64 Packages
      docker-ce | 5:18.09.0~3-0~debian-stretch | https://download.docker.com/linux/debian stretch/stable amd64 Packages
      docker-ce | 18.06.1~ce~3-0~debian        | https://download.docker.com/linux/debian stretch/stable amd64 Packages
      docker-ce | 18.06.0~ce~3-0~debian        | https://download.docker.com/linux/debian stretch/stable amd64 Packages

    b. 使用第二列中的版本字符串安装特定版本,例如 5:18.09.1~3-0~debian-stretch .

    sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker-compose-plugin
  3. hello-world 通过运行映像来验证 Docker 引擎是否已正确安装。

    sudo docker run hello-world

    此命令下载测试映像并在容器中运行它。当容器运行时,它会打印一条消息并退出。

Docker 引擎已安装并正在运行。该docker组已创建,但未向其中添加任何用户。您需要使用sudo来运行 Docker 命令。继续Linux 安装后步骤以允许非 root 用户运行 Docker 命令和其他可选配置步骤。

升级 Docker 引擎

要升级 Docker Engine,首先运行sudo apt-get update,然后按照 安装说明,选择您要安装的新版本。

安装示例 (Debian)

apt-get update
apt-get install     ca-certificates     curl     gnupg     lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

卸载 Docker 引擎

  1. 卸载 Docker 引擎、CLI、Containerd 和 Docker Compose 包:

    sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
  2. 主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有映像、容器和卷:

    sudo rm -rf /var/lib/docker
    sudo rm -rf /var/lib/containerd

必须手动删除任何已编辑的配置文件。


Docker 命令


Docker 服务相关命令

  • 启动docker服务
systemctl start docker
  • 停止docker服务
systemctl stop docker
  • 重启docker服务
systemctl restart docker
  • 查看docker服务状态
systemctl status docker
  • 设置开机启动docker服务
systemctl enable docker

Docker 镜像相关命令

  • 查看镜像 (本地)
docker images
dockdocker images -q # 查看所有镜像的ID

images

  • 搜索镜像
docker search [imageName]
  • 拉取镜像
docker pull [imageName]:[version(默认最新)]

DockerHub(查找镜像版本)

  • 删除镜像 (本地)
docker rmi [imageName]:[version]
docker rmi [ID]

imagesTAG

删除所有镜像

docker rmi `docker images -q`

Docker 容器相关命令

容器:由镜像和文件运行,所产生的实例
  • 查看容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器

docker_ps_-a

STATUS 运行状态

Up 运行中的容器

Exited 已经退出的容器

  • 创建容器
docker run -it --name=[ContainerName] [imageName]:[version] /bin/bash

-i 容器保持运行

-t 创建之后分配一个伪输入终端( Terminal )并自动进入容器

通过 exit 指令退出后,容器将自动关闭

通常与-i 同时使用

--name 为创建的容器命名

ContainerName 容器名称

/bin/bash 进入容器后的初始化指令( 默认执行 )

docker run -id --name=[ContainerName] [imageName]:[version]

-d 以守护模式运行容器( 后台运行创建容器,不自动进入 )

需要使用 docker exec 手动进入容器

通过 exit 指令退出后,容器 不会自动关闭

-it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器

  • 进入容器
docker exec -it [ContainerName] /bin/bash
通过 exit 指令退出后,容器 不会自动关闭
  • 启动容器
docker strat [ContainerName/ContainerID]
  • 停止容器
docker stop [ContainerName/ContainerID]
  • 删除容器
docker rm [ContainerName/ContainerID]
  • 查看容器信息
docker inspect [ContainerName/ContainerID]

Docker 容器的数据卷

数据卷是宿主机中的一个目录或文件

  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器可以挂载多个数据卷

数据卷的作用

  • 容器数据持久化
  • 外部机器和容器间接通信
  • 容器之间数据交换

配置数据卷

创建启动容器时,使用 -v 参数 设置数据卷

docker run ... [-v 宿主机目录(文件):容器内目录(文件)] ...

注意:

目录必须是绝对路径

若目录不存在,将自动创建

可以挂载多个数据卷

dataVolume


数据卷容器

多容器进行数据交换

  1. 多个容器挂载同一个数据卷
  2. 数据卷容器

dataContainer


配置数据卷容器

  1. 创建启动 dataContainer 数据卷容器,使用 -v 参数 设置数据卷
docker run -it --name=dataContainer -v /volume debian:10.3 /bin/bash
  1. 创建启动 c1 c2 容器,使用 --volumes-from 参数 设置数据卷
docker run -it --name=c1 --volumes-from dataContainer debian:10.3 /bin/bash

docker run -it --name=c2 --volumes-from dataContainer debian:10.3 /bin/bash

Docker 应用部署

MySQL部署

Docker 容器中部署 MySQL ,并通过外部MySQL客户端操作 MySQL Server

  1. 搜索MySQL镜像
  2. 拉取MySQL镜像
  3. 创建容器
  4. 操作容器中的MySQL

mysqlPortMapping

  1. 搜索MySQL镜像

    docker search mysql
  2. 拉取MySQL镜像

    docker pull [mysql:x.x]
  3. 创建容器,设置端口映射、目录映射

    # 在 /root 目录下创建 mysql 目录用于存储 mysql 数据信息
    mkdir ~/mysql
    cd ~/mysql
    docker run -id \
    -p 3307:3306 \
    --name=c_mysql \
    -v PWD/conf:/etc/mysql/conf.d \
    -v PWD/logs:/logs \
    -v PWD/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    mysql:x.x
  • 参数说明:

    • -p 3307:3306 :将容器的 3306 端口映射到宿主机的 3307 端口
    • -v PWD/conf:/etc/mysql/conf.d :将主机当前目录下的 conf/my.cnf 挂载到容器的 etc/mysql/my.cnf

      配置目录
    • -v PWD/logs:/logs :将当前主机目录下的 logs 目录挂载到容器的 /logs

      日志目录
    • -v PWD/data:var/lib/mysql :将当前主机下的 data 目录挂载到容器的 /var/lib/mysql

      数据目录
    • -e MYSQL_ROOT_PASSWORD=123456 :初始化 root 用户的密码
  1. 进入容器,操作MySQL

    docker exec -it c_mysql /bin/bash
  2. 使用外部机器连接容器中的MySQL

    mysqlConnect


Dockerfile

Docker 镜像原理

Docker 镜像本质:分层文件系统

操作系统组成部分:

  • 进程调度子系统
  • 进程通信子系统
  • 内存管理子系统
  • 设备管理子系统
  • 文件管理子系统
  • 网络通信子系统
  • 作业控制子系统

Linux 文件系统由 bootfsrootfs 两部分组成

  • bootfs :包含 bootloader (引导加载程序) 和 kernal (内核)
  • rootfs :root文件系统,包含的就是典型 Linux 系统中的

    /dev, /proc, /bin, /etc 等标准目录和文件

  • 不同的 Linux 发行版,bootfs 基本一样,而 rootfs 不同

fs

Docker 镜像是由特殊的文件系统叠加而成

最底端是 bootfs ,并使用宿主机的 bootfs

第二层是 root 文件系统 rootfs ,称为 base image

然后再往上可以叠加其他的镜像文件

mirrorSuperposition

统一文件系统 (Union File System) 技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统

  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像称为基础镜像
  • 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

Docker 镜像制作

1. 容器转为镜像

imageZip

docker commit 容器id 镜像版本:版本号
docker save -o 压缩文件名称 镜像名称:版本号
docker load -i 压缩文件名称

2. Dockerfile

Dockerfile 是一个文本文件

  • 包含了一条条指令
  • 每一条指令构建一层,基于基础镜像,最终构建出一个个新的镜像

    对于开发人员:可以为开发团队提供一个完全一致的开发环境

对于测试人员:可以直接拿到开发时所构建的镜像,或者通过 Dockerfile 文件构建一个新的镜像开始工作

对于运维人员:在部署时可以实现应用的无缝移植

Docker Hub

Dockerfile 关键字

关键字作用备注
FROM指定父镜像指定dockerfile基于哪个image构建
MAINTAINER作者信息用来标明dockerfile作者信息
LABLE标签用来标明dockerfile的标签 可以使用Lable代替Maintainer
最终都是在dicker image基本信息中可以查看
RUN执行命令执行一段命令 默认是 /bin/bash
格式: RUN command 或者 RUN ["commmand","param1","param2"]
CMD容器启动命令提供启动容器时的默认命令 和ENTRYPOINT配合使用
格式: CMD command param1 param2 或者 CMD ["command","param1","param2"]
ENTRYPOINT入口一般在制作一些执行完就关闭的容器中会使用
COPY复制文件build的时候复制文件到image中
ADD添加文件build的时候添加文件到image中
不仅仅限于当前build上下文 可以来源于远程服务
ENV环境变量指定build时的环境变量 可以在启动容器的时候通过 -e 覆盖
格式: ENV name=value
AGE构建参数旨在构建时使用的参数 如果有ENV 那么ENV同名值始终覆盖arg的参数
VOLUME定义外部可以挂载的数据卷指定build的image哪些目录可以在启动时挂载到文件系统中 启动容器时用 -v 绑定
格式: VOLUME ["目录"]
EXPOSE暴露端口定义容器运行时监听的端口 启动容器时使用 -p 绑定暴露端口
格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR工作目录指定容器内部的工作目录 若不存在则将自动创建 如果指定/开头 使用的是绝对路径 如果不是/开头 那么是在上一条workdir路径的相对路径
USER指定执行用户指定build或启动时的用户 在RUN CMD ENTRYPOINT执行时的用户
HEALTHCHECK健康检查指定监测当前容器的健康测试的命令
基本上没用 多数应用本身有健康监测机制
ONBUILD触发器当存在ONBUILD关键字的镜像作为基础镜像时 执行FORM完成之后会执行ONBUID命令 不影响当前镜像 用处不大
STOPSIGNAL发送信号量到宿主机该指令设置将发送到容器的系统调用信号以退出
SHELL指定执行脚本的shell指定RUN CMD ENTRYPOINT 执行命令时使用的shell

Dockerfile 案例

1. 自定义Debian

案例:需求

自定义debian镜像,要求:

  1. 默认登录路径为 usr
  2. 可以使用 vim

    FROM debian:10.3
    MAINTAINER  test <test@163.com>
    
    RUN apt-get update && apt-get -y install vim
    
    WORKDIR /usr
    
    CMD /bin/bash

案例:实现步骤

  1. 定义父镜像: FROM debian:10.3
  2. 定义作者信息: MAINTAINER name <email>
  3. 执行安装 vim 命令: RUN apt-get update && apt-get -y install vim
  4. 定义默认的工作目录: WORKDIR /usr
  5. 定义容器启动执行的命令: CMD /bin/bash
  6. 通过 dockerfile 构建镜像:

    docker build -f [dockerfilePath] -t [newImageName]:[version] .
    docker build -f ./bebian_dockerfile -t test:1.0 .

2. 部署SpringBoot

案例:需求

定义dockerfile,发布springboot项目

FROM java:8
MAINTAINER  test <test@163.com>

ADD springbootPackage.jar app.jar

CMD java -jar app.jar

案例:实现步骤

  1. 定义父镜像: FROM java:8
  2. 定义作者信息: MAINTAINER name <email>
  3. 将 jar 包添加到容器: ADD springbootPackage.jar app.jar
  4. 定义容器启动执行的命令: CMD java -jar app.jar
  5. 通过 dockerfile 构建镜像:

    docker build -f [dockerfilePath] -t [newImageName]:[version] .
    docker build -f ./springboot_dockerfile -t app .

Docker 服务编排

Docker Compose

编排多容器分布式部署,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。

使用步骤:

  1. 利用 Dockerfile 定义运行环境镜像
  2. 使用 docker-compose.yml 定义组成应用的各服务
  3. 运行 docker-compose up 启动应用

docker-compose

安装 Docker Compose

apt-get install docker-compose

查看 Docker Compose 版本

docker-compose -version
  • 若提示 -bash: /usr/local/bin/docker-compose: No such file or directory , 设置软连接到指定目录:

    ln -s /usr/bin/docker-compose /usr/local/bin/docker-compose
  • 若提示 -bash: /usr/local/bin/docker-compose: Permission denied , 添加执行权限:

    chmod +x /usr/local/bin/docker-compose
# Compose目前已经完全支持Linux、MacOS和Windows, 在我们安装Compose之前,需要先安装Docker。下面我们以编译好的二进制包方式安装在Linux系统中。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version

卸载 Docker Compose

apt-get remove docker-compose
apt-get autoremove docker-compose

旧版(已失效)

# 二进制包方式安装,删除二进制文件即可
rm /usr/local/bin/docker-compose

使用 Docker Compose 编排 Nginx+SpringBoot 项目

  1. 创建 docker-compose 目录

    mkdir ~/docker-compose
    cd ~/docker-compose
  2. 编写 docker-compose.yml 文件

    version: '3'
    services:
      nginx:
        image: nginx
        ports:
          - 80:80
        links:
          - app
        volumes:
          - ./nginx/conf.d:/etc/nginx/conf.d
      app:
        image: app
        expose:
          - "8080"
  3. 创建 ./nginx/conf.d 目录

    mkdir -p ./nginx/conf.d
  4. ./nginx/conf.d 目录下编写 config.conf 文件

    server {
        listen 80;
        access_log off;
        
        location / {
            proxy_pass http://app:8080;
        }
        
    }
  5. ~docker-compose 目录下使用 docker-compose 启动容器

    docker-compose up
  6. 测试访问

    http://[ip]:[port]/hello

Docker 私有仓库

最后修改:2024 年 02 月 28 日
如果觉得我的文章对你有用,请随意赞赏