全栈技术分享,API文档动静更新,技术点扼要易懂,疾速入门
有帮忙的话点个赞吧,感兴趣的关注加书签取得更多文档,不便随时查阅,有问题欢送留言探讨
虚拟化
一种资源管理技术,硬件资源不可分割,利用虚拟化技术能最大化利用硬件资源,也就是一硬件多软件部署
docker
概念与实质
应用Go语言开发,基于Linux内核的虚拟机容器化应用软件
对过程进行封装隔离,属于操作系统层面的虚拟化技术
客户端-服务器(C/S)架构程序:docker,dockerd - docker deamon
与虚拟机区别:在操作系统层面上实现虚拟化,间接复用本地主机的操作系统,虚拟机则是在硬件层面实现
docker比照传统虚拟化长处
1.更高效的利用系统资源
2.更疾速的启动工夫
间接运行于宿主内核,无需启动残缺的操作系统
3.统一的运行环境
4.继续交付和部署
5.更轻松的迁徙
6.更轻松的保护和扩大
组件
组件 | 阐明 |
---|---|
docker server | docker daemon |
docker client | docker命令,如docker run … |
image | 镜像,即 unix零碎镜像(便于了解) + app运行所需环境(通过Dockerfile安排) + app源码 |
container | 容器,即 unix零碎实例 + app实例 |
Registry | 仓库,寄存镜像的仓库,相似maven的nexus私服 线上仓库: docker hub 私服仓库: registry |
工作流程
graph TB
A[app代码 + Dockerfile]-->A1[docker build Dockerfile]
A1-->B[image]
B-->B1[docker run image]
B1-->C[container]
classDef C1 fill:blue,fill-opacity:0.3
class A,B,C C1
class 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.txt
Dism /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=true
win10 + 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.sh
win10 + 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或powershell
net stop LxssManager
net 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.bak
mkdir /var/lib/dpkg/info
apt-get -f install software-properties-common
apt-get update
sudo apt update && sudo apt upgrade -y
#多线程下载工具
sudo apt install axel
#提速工具
sudo add-apt-repository ppa:apt-fast/stable
sudo 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}'):0
export LIBGL_ALWAYS_INDIRECT=1
systemd环境:
git clone https://github.com/DamionGans/ubuntu-wsl2-system-script.git
cd ubuntu-wsl2-system-script/
bash ubuntu-wsl2-system-script.sh
重启 wsl --shutdown
# micro store 装置vcxsrv
防火墙配置容许vcxsrv通过
1.选one large window ,display num=0
2.下一步
3.勾选display...
4.保留配置
在ubuntu终端输出 gnome-session期待连贯启动GUI
# 通过xrdp近程连贯形式:
sudo apt-get install xrdp
sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini
echo "gnome-session" > ~/.xsession
sudo systemctl restart xrdp
sudo systemctl status xrdp
win+r输出mstsc
连贯localhost:3390即可
api
ps:配置用户进docker用户组,不便该用户下执行docker命令不必sudo
usermod -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 LR
A[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:8
MAINTAINER evef
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 APP_HOME=/opt/hello-app
VOLUME /tmp
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD target/hello-docker-0.0.1-SNAPSHOT.jar hello-app.jar
ADD target/classes/application.yml conf/application.yml
ENTRYPOINT java -jar hello-app.jar --spring.config.location=conf/application.yml
EXPOSE 8082
<font size=”5″>FROM</font> | ||
---|---|---|
作用 | 拉取依赖的镜像 | |
格局 | FROM [–platform=<platform>] <image> [AS <name>] FROM Learn more about the “FROM” Dockerfile command. [–platform=<platform>] <image>[:<tag>] [AS <name>] FROM Learn 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
发表回复