Docker集成方案

重要通知

请翻墙,例如使用 在人间,否则docker无法正常登录,以及无法正常执行其他相关指令。

基本概况

Web 应用的自动化打包和发布,自动化测试和持续集成、发布。

/etc/resolv.conf
/etc/hosts
k8s

账户信息

  • Docker ID:ysungod | 邮箱:ysungod@163.com | 密码:Mi_ps_12356
  • Docker ID:ysungodwzj | 邮箱:ysungodwj@gmail.com | Mi_124578

基础指令

# 查看版本
docker -v 
docker --version


> sudo docker login # MacOS登入,然后输入账号与密码即可
> docker logout # 登出



# 检查 Docker 服务的状态
systemctl status docker

# 启动Dcoker
sudo systemctl start docker 


# 重新加载docker
systemctl daemon-reload

# 重启
systemctl restart docker

# 开机自启动
sudo systemctl enable docker 

# 禁用开机自启
sudo systemctl disable docker 

# 停止
systemctl stop docker

# 注意事项
> 镜像拉取问题,需要翻墙,否则各种操作都受限并报错。

容器(Container)

Docker 容器是一个轻量级、可移植、自给自足的软件环境,用于运行应用程序。容器是应用程序每个组件的隔离进程。

镜像(Image)和容器(Container)的关系

就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

管理容器

# 已经启动过,但是退出了,需要重新进入
docker exec -it [containerID | containerName] /bin/bash 
docker exec -it node-docker-build /bin/bash

/usr/bin/docker exec -it node-docker-build-dev /bin/bash



# 查看所有容器
> docker ps -a 

# 查看正在运行的容器
> docker ps 

# 启动容器,例如 docker run -it ubuntu /bin/bash
> docker run -it [image] [命令] 


# 启动容器,但不进入容器
docker run -td --name node-docker-build node:22.15.0




# 不进入容器,但可以执行指令
OWN_NODE_IMAGE_VERSION="node:22.15.0";
OWN_NODE_IMAGE_NAME="node-docker-build";
docker exec "${OWN_NODE_IMAGE_NAME}" /bin/bash -c "cd / && ls ./ -a"
docker exec "${OWN_NODE_IMAGE_NAME}" /bin/bash -c "cd /home && ls ./ -a"


# 执行docker任务
function ownDockerExcuteTask() {
  task_cmd=$1

	docker exec "${OWN_NODE_IMAGE_NAME}" /bin/bash -c "${task_cmd}"
}

ownDockerExcuteTask "cd /home && ls ./ -a && rm -rf ${ERP_NAME}"
ownDockerExcuteTask "cd /home && git clone ${ERP_GIT_PATH}"
ownDockerExcuteTask "cd /home/${ERP_NAME} && rm -rf .git && npm install"






# 启动已停止容器
> docker start [containerID]

# 停止容器
> docker stop [containerID] 

# 重启容器
> docker restart [containerID] 

# 删除容器
> docker rm -f [containerID] 

# 清除所有已经终止的容器
> docker container prune 

# docker查看容器IP地址
> docker inspect [containerID] 

容器状态

--------------------------------------------------------------------------------------------------------
  CONTAINER ID   IMAGE     COMMAND   CREATED    STATUS                      PORTS         NAMES
--------------------------------------------------------------------------------------------------------
                                                created(已创建)
                                                restarting(重启中)
                                                running 或 Up(运行中)
                                                removing(迁移中)
                                                paused(暂停)
                                                exited(停止)
                                                dead(死亡)
--------------------------------------------------------------------------------------------------------

管理容器内容

# 进入指定容器内环境
> docker exec -it [containerID] /bin/bash // exec 命令会退出容器终端,但不会导致容器的停止。

# 从Linux复制文件到Docker指定容器
> docker cp 本地路径 容器长ID:容器路径

# 将本地文件复制到docker容器指定目录
docker cp /home/download/students.txt node-docker-build:/home

# 将本地文件夹(包含文件与子目录)复制到docker容器指定目录
docker cp /home/download/wj node-docker-build:/home





# 从Docker指定容器复制文件到Linux,   在本地电脑命令行直接执行即可,而不是docker容器环境内执行
docker cp 容器长ID:容器路径 本地路径

docker cp node-docker-build:/home/wj /home/download

相关参数列表

> -i: 交互式操作。
> -t: 终端。
> -d: 让容器在后台运行。
> -P: 随机端口映射,容器内部端口随机映射到主机的端口。-P 8080:80 绑定容器的[8080]端口,并将其映射到本地主机127.0.0.1的[80]端口上。
> -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
> -m: 提交的描述信息
> -a: 指定镜像作者
> --name: 为容器指定一个名称
> -v: 将主机上的一个目录映射到容器内的一个目录中,例如 -v /Users/apple/Downloads/List/music_rhythm_backend/server:/home/server

单个端口映射

> docker run -p 8011:8011

多个端口映射

> docker run -p 8011:8011 -p 8012:8012

使用范围映射

> docker run -p 8011-8013:8011-8013

本地代码映射到容器

配置本地代码与docker容器的同步,修改本地代码,实时同步到容器中,并查看效果,尤其是调试容器中的代码非常便利。

> docker run -v /Users/apple/Downloads/List/music_rhythm_backend/server:/home/game-node

网络访问

docker内部访问宿主机

# mac和windows
> 使用host.docker.internal替换127.0.0.1

注意实现

docker容器内不能使用vim

> apt-get update 
> apt-get install -y vim

docker容器内网络请求缓慢问题

Docker 镜像(Image)

Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

基本指令

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

# 列出本地主机上的镜像
> docker images 

# 下载镜像
> docker pull [image:version] 

# 最新镜像版本
> docker pull [image:latest] 

# 查找镜像
> docker search [imageID] 

# 启动镜像
> docker run [imageID] 

# 删除镜像
> docker rmi [imageID]

# 导出镜像
> docker save -o /home/download/kkfileview-4.3.0.2-docker.tar keking/kkfileview:4.3.0.2 

CentOS

docker pull centos:centos7

node.js

# node可用渠道
> docker search node 

# 查看node版本
> npm view node versions 

# 拉取版本镜像
> docker pull node:22.15.0 
> docker run -itd --name node-test node:22.15.0

# 进入容器查看node版本
> docker exec -it node-test /bin/bash

# 案例一
> docker run -v /Users/apple/Downloads/List/music_rhythm_backend/server:/home/game-node -p 8059:8059 -p 6379:6379 -p 4307:4307 -itd --name game-node node:22.15.0 # 启动

# 已经启动过,但是退出了,需要重新进入
> docker exec -it game-node /bin/bash

Nginx

容器端口目前好像只能是80,设置为其他端口就出现无法访问的问题。

# 拉取最新镜像
> docker pull nginx:latest 

# 运行容器
> docker run --name nginx-test -p 8010:8010 -d nginx:latest 

# 打开容器
> docker exec -it nginx-test /bin/bash 

redis

# 拉取最新镜像
> docker pull redis:latest 

# 运行容器
> docker run -itd --name redis-tuzhan -p 6379:6379 redis:latest 

memcached

# 拉取最新镜像
> docker pull memcached:latest 

# 运行容器
> docker run -p 11211:11211 --name memcache memcached:latest 

仓库(Repository)

仓库可看成一个代码控制中心,用来保存镜像。

Docker Compose

Docker Dockerfile

Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。

Docker Machine

Docker Swarm

Kubernetes

安装配置

配置多镜像加速源

国内直连 Docker Hub 网络不稳定,镜像加速器通过国内节点缓存镜像,显著提升下载速度。

  • UI界面: 配置翻墙镜像基本没有卵用,国内已全部失效,Docker Desktop -> Settings -> Docker Engine

​​编辑 /etc/docker/daemon.json​​(无则新建)

{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://docker.1panel.live",
    "https://docker.kejilion.pro"
  ],
  "insecure-registries": ["docker.mirrors.ustc.edu.cn"],  // 信任非 HTTPS 源
  "debug": true,                            // 开启调试日志
  "http-timeout": "300s"                    // 超时延长至 5 分钟
}

MacOS 安装配置

注意: 应用程序“Docker.app”的这个版本不能与此版本的macOS配合使用。您使用的是macOS 11.6.7。该应用程序要求macOS 12.0或更高版本。

  • 手动下载Docker在本地安装后,指令可能会不生效,具体解决方法如下所示。
> vim ~/.bash_profile 

# 末尾追加此内容
export PATH=$PATH:/Applications/Docker.app/Contents/Resources/bin/

# 更新
> source ~/.bash_profile

# 验证
> docker -v

华为云配置Docker

> cat /etc/os-release # 查看系统

# 配置华为euler仓库源
> cd /etc/yum.repos.d
> wget https://repo.huaweicloud.com/repository/conf/openeuler_x86_64.repo
> yum clean all
> yum makecache

CentOS安装Docker



# #################### #
# 
# 替换方案:手动安装
# 
# #################### #
# 添加国内镜像源:以阿里云为例(CentOS系统)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 国内镜像加速配置(必选)
> 创建或修改 /etc/docker/daemon.json,添加国内镜像地址(以腾讯云为例)

sudo mkdir -p /etc/docker  # 确保目录存在

sudo vim /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://docker.1panel.live",
    "https://docker.kejilion.pro",
    "https://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}


# 验证安装结果
docker -v       # 查看版本
docker info | grep Mirrors -A 2  # 检查镜像加速器是否生效


# 启动并验证
sudo systemctl start docker
sudo docker run hello-world  # 验证是否成功安装

可能出现的异常问题

# 单击客户端Docker Desktop的Sign in,会跳转到网页进行账户登录,网页登录成功后,会弹出唤起打开客户端的弹窗,这时客户端估计会出现各种异常问题

# 报错一:Login failed:no login session
# 报错二: Post "https://login.docker.com/oauth/token": read tcp [2409:8954:38d4:4679:10b2:450b:e828:11ec]:57835->[2606:4700::6810:5367]:443: read: connection reset by peer


# 报错一:Error saving credentials: error storing credentials - err: exit status 1, out: `Post "https://hub.docker.com/v2/users/login?refresh_token=true": context deadline exceeded (Client.Timeout exceeded while awaiting headers)`
> 当时我的解决方案:直接将MacOS升级到14.2.1 (23C71)版本,如果还是不行,重新启动系统,再次运行,果然可以了。

# 报错二:Error response from daemon: Get "https://registry-1.docker.io/v2/": unauthorized: incorrect username or password

# must use ASL logging (which requires CGO) if running as root
# Error saving credentials: error storing credentials - err: exit status 1, out: ``

window系统安装配置

# 步骤一:下载Download for Windows地址:https://hub.docker.com/ | 

# 步骤二:解决出现wsl2 installation is incomplete的弹框报错问题 | 下载一个WSL更新包
> 更新地址:https://link.zhihu.com/?target=https%3A//wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
> https://docs.microsoft.com/zh-cn/windows/wsl/
> 优势:适用于 Linux 的 Windows 子系统可让开发人员直接在 Windows 上按原样运行 GNU/Linux 环境(包括大多数命令行工具、实用工具和应用程序),且不会产生传统虚拟机或双启动设置开销。


3.配置docker的阿里云镜像(不配置,安装镜像会非常缓慢)
阿里云镜像:https://hg9cuefw.mirror.aliyuncs.com

移除Docker

# 关闭Docker服务并禁止开机自启
sudo systemctl stop docker
sudo systemctl disable docker

# 删除安装包
sudo dnf remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras


# 卸载核心软件包及依赖
sudo yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine \
    docker-ce \
    docker-ce-cli \
    containerd.io


# 删除镜像、容器、配置文件等内容
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo rm -rf /etc/docker
sudo rm -rf /var/run/docker.sock  
sudo rm -rf /etc/systemd/system/docker.service.d  


sudo groupdel docker   # 删除用户组
sudo rm -rf /var/log/docker  # 清理日志文件


# ​​移除Docker创建的网桥
sudo ip link set docker0 down
sudo ip link delete docker0



# 查看是否已卸载
docker -v 
Last Updated:
Contributors: 709992523, Eshen