全栈技术分享,API文档动静更新,技术点扼要易懂,疾速入门
有帮忙的话点个赞吧,感兴趣的关注加书签取得更多文档,不便随时查阅,有问题欢送留言探讨

虚拟化

一种资源管理技术,硬件资源不可分割,利用虚拟化技术能最大化利用硬件资源,也就是一硬件多软件部署

docker

概念与实质

应用Go语言开发,基于Linux内核的虚拟机容器化应用软件对过程进行封装隔离,属于操作系统层面的虚拟化技术客户端-服务器(C/S)架构程序:docker,dockerd - docker deamon与虚拟机区别:在操作系统层面上实现虚拟化,间接复用本地主机的操作系统,虚拟机则是在硬件层面实现

docker比照传统虚拟化长处

1.更高效的利用系统资源2.更疾速的启动工夫    间接运行于宿主内核,无需启动残缺的操作系统3.统一的运行环境4.继续交付和部署5.更轻松的迁徙6.更轻松的保护和扩大

组件

组件阐明
docker serverdocker daemon
docker clientdocker命令,如docker run ...
image镜像,即 unix零碎镜像(便于了解) + app运行所需环境(通过Dockerfile安排) + app源码
container容器,即 unix零碎实例 + app实例
Registry仓库,寄存镜像的仓库,相似maven的nexus私服
线上仓库: docker hub
私服仓库: registry

工作流程

graph TBA[app代码 + Dockerfile]-->A1[docker build Dockerfile]A1-->B[image]B-->B1[docker run image]B1-->C[container]classDef C1 fill:blue,fill-opacity:0.3class A,B,C C1class A1,B1 C2

装置

Linux 环境(这里选Ubuntu)

官网教程

碰到问题参考上面的问题和解决

Windows11 环境

官网教程

下载 docker desktop

docker + wsl2 官网教程

docker desktop初始化配置
general:勾选wsl,个别是默认勾选的resources:wsl integration:     enable integration with my default wsl distro    enbale ubuntu-22.04(这两个抉择很重要)docker engine:退出镜像配置:,  "registry-mirrors": [    "https://registry.docker-cn.com",    "https://xxx.mirror.aliyuncs.com",    "http://hub-mirror.c.163.com",    "https://docker.mirrors.ustc.edu.cn",    "https://reg-mirror.qiniu.com"  ]ps:阿里云镜像得配置本人的地址

可能碰到的问题和解决办法:

1. 没有Hyper-v,管理员身份执行脚本:
pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i" del hyper-v.txtDism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
2. wsl 环境问题:
win11 + wsl2 + Ubuntu22 : wslg较稳固,已反对开启systemd,不开启systemd前提下反对装置ubuntu-desktop gnome:    vim /etc/wsl.conf    [boot]    systemd=truewin10 + wsl2 + Ubuntu20:反对脚本开启systemd,不开启systemd前提下反对装置ubuntu-desktop gnome然而gnome >=3.34版本齐全基于systemd,存在兼容问题,须要装置低版本的gnome    开启systemd脚本:https://github.com/nullpo-head/wsl-distrod    或者:    systemd环境:    git clone https://github.com/DamionGans/ubuntu-wsl2-system-script.git    cd ubuntu-wsl2-system-script/    bash ubuntu-wsl2-system-script.shwin10 + distrod: 自带systemd的ubuntu-22.04 wsl零碎,不反对装置ubuntu-desktop gnome

distrod下载地址

distrod参考教程

3. 批改挂载c盘目录(不倡议,因为批改后目前的目录挂载会存在问题)
新建 /etc/wsl.conf文件输出:[automount]root = /options = "metadata,umask=22,fmask=11"敞开所有终端,用管理员形式关上cmd或powershellnet stop LxssManagernet start LxssManager
4. 装置docker-ce报错
谬误提醒1: Sub-process /usr/bin/dpkg returned an error code (1)因为dpkg目录导致的,备份并重建sudo mv /var/lib/dpkg/info/ /var/lib/dpkg/bak/  sudo mkdir /var/lib/dpkg/info/最初再执行 sudo apt-get update
谬误提醒2:启动docker失败,提醒查看日志:See "systemctl status docker.service" and "journalctl -xeu docker.service" for details.失常查看日志内容不全,应用其余命令:journalctl -fu docker发现起因:...unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain:  (iptables failed: iptables ...因为新的ubuntu零碎应用了iptables-nft,而WSL2不反对导致的,进行批改:sudo update-alternatives --config iptables抉择非nft的选项重启docker即可
5. 装置gnome

参考教程

镜像源最好选清华源
1.装置software-properties-common报错 /usr/.../dpkg error code起因:/var/lib/dpkg/info下的包有问题,备份该目录,删掉重新安装软件包mv /var/lib/dpkg/info /var/lib/dpkg/info.bakmkdir /var/lib/dpkg/infoapt-get -f install software-properties-commonapt-get update
sudo apt update && sudo apt upgrade -y#多线程下载工具sudo apt install axel#提速工具sudo add-apt-repository ppa:apt-fast/stablesudo apt -y install apt-fast抉择:1.apt 2.5 3.yes#配置apt-fast镜像源,关上正文的第一个镜像(有两行)sudo vim /etc/apt-fast.conf
#下载桌面sudo apt-fast install ubuntu-desktop gnome#这里是批改gnome-session连贯window的ip配置vim ~/.bashrc开端退出export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0export LIBGL_ALWAYS_INDIRECT=1systemd环境:git clone https://github.com/DamionGans/ubuntu-wsl2-system-script.gitcd ubuntu-wsl2-system-script/bash ubuntu-wsl2-system-script.sh
重启 wsl --shutdown# micro store 装置vcxsrv防火墙配置容许vcxsrv通过1.选one large window ,display num=02.下一步3.勾选display...4.保留配置在ubuntu终端输出 gnome-session期待连贯启动GUI
# 通过xrdp近程连贯形式:sudo apt-get install xrdpsudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.iniecho "gnome-session" > ~/.xsessionsudo systemctl restart xrdpsudo systemctl status xrdpwin+r输出mstsc连贯localhost:3390即可

api

ps:配置用户进docker用户组,不便该用户下执行docker命令不必sudousermod -G docker xxx

官网文档

1. docker

<font size="5">docker build</font>
作用构建镜像
格局docker build [OPTIONS] PATH | URL | -
示例进入Dockerfile所在目录,执行docker build .
option-f指定编译文件名,默认是'PATH/Dockerfile'
<font size="5">docker run</font>
作用生成镜像容器
格局docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
示例docker run --name nginx \
-v /nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /nginx/conf/conf.d/:/etc/nginx/conf.d \
-v /nginx/html/:/usr/share/nginx/html \
-v /nginx/log/:/var/log/nginx:ro \
-p 80:80 --privileged=true -d nginx
option-v <docker_dir>:<container_dir>[:ro]挂载目录
将容器内卷与docker服务器卷绑定
ro是只读
留神赋予最高权限777,避免同步呈现问题
-d后盾运行
-p <d_socket>:<c_port>[/proto]绑定docker服务端口与容器端口
--name容器名
--rm退出容器时主动删除容器
--restart<=always|no>退出容器后重启
-w<DIR>进入容器时的当前目录
--privileged赋予容器扩容特权
-i放弃输出命令,-it:进入容器内终端的意思
-t关上容器终端
--expose裸露容器端口
<font size="5">docker cp</font>
作用从容器内拷贝或拷贝进容器
格局docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
示例docker cp CONTAINER:/var/logs/ /tmp/app_logs
docker cp ./some_file CONTAINER:/work
option-a拷贝文件的mode权限
-L拷贝软链接
<font size="5">docker inspect</font>
作用列出镜像或容器详细信息
格局docker inspect [OPTIONS] NAME|ID [NAME|ID...]
示例docker inspect --format="{{.Mounts}}" CONTAINER
option--format|-f格式化显示,如--format="{{.Mounts}}"
1.1 docker image
<font size="5">docker images | docker image ls</font>
作用列出镜像
格局docker image ls [OPTIONS] [REPOSITORY[:TAG]]
示例docker image ls -a
option-a显示所有镜像(默认不包含两头镜像)
--digests显示摘要,digest:sha256:...,是inspect中的id
--no-trunc显示残缺的镜像信息,即显示残缺的Image ID(digest)
-q只显示id
-f|--filter过滤
dangling=(true|false): 标记为空的镜像
label=<key> or label=<key>=<value>: 按label过滤
since=(<image-name>[:tag]|<image-id>|<[email protected]>): 某镜像构建之后构建的镜像
before=(<image-name>[:tag]|<image-id>|<[email protected]>): 某镜像构建之前构建的镜像
reference=<pattern>: 按正值匹配结果显示,如 :
--format "{{Placeholder}}..."按指定格局显示
Placeholder:
.Repository 镜像仓库
.Tag 镜像标签
.Digest 镜像摘要
.CreatedSince 创立映像后通过的工夫
.CreateAt 创立镜像的工夫
.Size 镜像大小
<font size="5">docker rmi | docker image rm</font>
作用删除镜像
格局docker rmi [OPTIONS] IMAGE [IMAGE...]
示例docker rmi xxx
option-f强制删除镜像
1.2 docker container
<font size="5">docker ps | docker container ls</font>
作用列出容器
格局docker ps [OPTIONS]
示例docker ps -a
option-a列出所有运行中容器
--digests显示摘要,digest:sha256:...,是inspect中的id
--no-trunc显示残缺的镜像信息,即显示残缺的Image ID(digest)
-q只显示id
-f|--filter过滤,
id 容器id
name 容器名
label 标签,<key> or <key>=<value>
exited 已退出的容器
status 状态:created, restarting, running, removing, paused, exited, dead
ancestor 原型:<image-name>[:<tag>], <image id>, or <[email protected]>
before <id> 容器创立之前
since <id> 容器创立之后
volume 已装置给定卷或绑定挂载的容器
network 连贯network的容器
publish 公布的容器:<port>[/<proto>] or <startport-endport>/[<proto>]
expose 裸露的容器:<port>[/<proto>] or <startport-endport>/[<proto>]
health 衰弱状态: starting, healthy, unhealthy , none.
isolation 针对window零碎的过滤:default, process, or hyperv
is-task 是不是一个工作服务容器
--format "{{Placeholder}}..."按指定格局显示
Placeholder:
.ID Container ID
.Image Image ID
.Command 援用命令
.CreatedAt 创立容器的工夫
.RunningFor 容器启动后的运行工夫
.Ports 裸露的端口
.State 容器状态(例如,“创立”、“运行”、“退出”)
.Status 蕴含持续时间和衰弱状态详细信息的容器状态
.Size 容器磁盘大小
.Names 容器名称
.Labels 调配给容器的所有标签
.Label 此容器的特定标签的值: '{{.Label "com.docker.swarm.cpu"}}'
.Mounts 装入此容器中的卷的名称
.Networks 附加到此容器的网络的名称
<font size="5">docker rm | docker container rm</font>
作用删除容器
格局docker rm [OPTIONS] CONTAINER [CONTAINER...]
示例docker rm -v CONTAINER
option-f强制删除
-v删除与容器关联的匿名卷
1.3 docker volume
<font size="5">docker volume ls</font>
作用列出卷
格局docker volume ls [OPTIONS]
示例docker volume ls -q
option-q只显示卷名
-f过滤,如'dangling=true'
--format格式化显示
<font size="5">docker volume rm</font>
作用删除卷
格局docker volume rm [OPTIONS] VOLUME [VOLUME...]
示例docker volume rm VOLUME
option-f强制删除
罕用容器部署

镜像仓库地址

所有挂载目录对立授予权限,避免奇怪的问题产生chmod -R 777 /xxx/xxx
nginx
docker run --name nginx \-v /usr/local/software/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \-v /usr/local/software/nginx/conf/conf.d/:/etc/nginx/conf.d \-v /usr/local/software/nginx/html/:/usr/share/nginx/html \-v /usr/local/software/nginx/log/:/var/log/nginx \-p 80:80 --privileged=true -d nginx   
删除镜像和容器
可依据镜像或容器的 ID、name、tag 删除
graph LRA[stop container]-->B[rm container and volume]B-->C[rmi image]
彻底删除有依赖的none镜像
进行容器docker images -a | grep none | awk '{print " -f ancestor="$3}' | xargs docker ps -aq | xargs docker stop删除容器和卷docker images -a | grep none | awk '{print " -f ancestor="$3}' | xargs docker ps -aq | xargs docker rm -v删除容器保留卷docker images -a | grep none | awk '{print " -f ancestor="$3}' | xargs docker ps -aq | xargs docker rm删除镜像docker images -a | grep none | awk '{print " -f since="$3}' | xargs docker images -aq | xargs docker rmi

2. Dockerfile

示例
FROM localhost:5000/openjdk:8MAINTAINER evefENV LANG=C.UTF-8 LC_ALL=C.UTF-8 APP_HOME=/opt/hello-appVOLUME /tmpRUN mkdir -p $APP_HOMEWORKDIR $APP_HOMEADD target/hello-docker-0.0.1-SNAPSHOT.jar hello-app.jarADD target/classes/application.yml conf/application.ymlENTRYPOINT java -jar hello-app.jar --spring.config.location=conf/application.ymlEXPOSE 8082
<font size="5">FROM</font>
作用拉取依赖的镜像
格局FROM [--platform=<platform>] <image> [AS <name>]
FROMLearn more about the "FROM" Dockerfile command. [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROMLearn more about the "FROM" Dockerfile command. [--platform=<platform>] <image>[@<digest>] [AS <name>]
示例FROM localhost:5000/openjdk:8
<font size="5">MAINTAINER(deprecated)</font>
作用作者
格局MAINTAINER <name>
示例MAINTAINER evef
<font size="5">ENV</font>
作用环境变量
格局ENV <key>=<value> ...
示例ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 APP_HOME=/opt/hello-app
<font size="5">VOLUME</font>
作用创立一个挂载内部卷的挂载点
格局VOLUME ["/data"]
示例VOLUME /tmp
就是把容器内的/tmp目录挂载绑定内部docker服务器随机创立的卷
<font size="5">RUN</font>
作用在容器内执行命令
格局RUN <command>
示例RUN mkdir -p $APP_HOME
<font size="5">WORKDIR</font>
作用指定进入容器的地位,即当前目录
指定目录不存在不会立刻创立,最好提前建好目录
格局WORKDIR /path/to/workdir
示例WORKDIR $APP_HOME
<font size="5">ADD</font>
作用拷贝Dockerfile所在位置的资源进入容器内,反对近程拷贝
格局ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
示例ADD target/hello-docker-0.0.1-SNAPSHOT.jar hello-app.jar
<font size="5">COPY</font>
作用拷贝Dockerfile所在位置的资源进入容器内,只能拷贝宿主机
格局COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
示例COPY target/hello-docker-0.0.1-SNAPSHOT.jar hello-app.jar
<font size="5">ENTRYPOINT</font>
作用执行shell命令
格局ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
示例ENTRYPOINT java -jar hello-app.jar --spring.config.location=conf/application.yml
<font size="5">EXPOSE</font>
作用裸露端口
格局EXPOSE <port> [<port>/<protocol>...]
示例EXPOSE 8082

3.docker compose

示例
services:  #服务名  backend:    #容器名    container_name: hello-compose    build:      context: ./      #指定编译文件      dockerfile: Dockerfile    # 绑定端口 -p    ports:      - 8082:8082