关于docker:docker文档-不断补充中

17次阅读

共计 9837 个字符,预计需要花费 25 分钟才能阅读完成。

全栈技术分享,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

正文完
 0