【docker】文档 [不断补充中...]

eveforest -
【docker】文档 [不断补充中...]
全栈技术分享,API文档动态更新,技术点简明易懂,快速入门
有帮助的话点个赞吧,感兴趣的关注加书签获得更多文档,方便随时查阅,有问题欢迎留言讨论虚拟化
一种资源管理技术,硬件资源不可分割,利用虚拟化技术能最大化利用硬件资源,也就是一硬件多软件部署
docker概念与本质
使用Go语言开发,基于Linux内核的虚拟机容器化应用软件

对进程进行封装隔离,属于操作系统层面的虚拟化技术

客户端-服务器(C/S)架构程序:docker,dockerd - docker deamon

与虚拟机区别:在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,虚拟机则是在硬件层面实现
docker对比传统虚拟化优点
1.更高效的利用系统资源
2.更快速的启动时间
    直接运行于宿主内核,无需启动完整的操作系统
3.一致的运行环境
4.持续交付和部署
5.更轻松的迁移
6.更轻松的维护和扩展
组件组件说明docker serverdocker daemondocker clientdocker命令,如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:/workoption-a拷贝文件的mode权限-L拷贝软链接<font size="5">docker inspect</font>作用列出镜像或容器详细信息格式docker inspect [OPTIONS] NAME|ID [NAME|ID...]示例docker inspect --format="{{.Mounts}}" CONTAINERoption--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 -aoption-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 xxxoption-f强制删除镜像1.2 docker container<font size="5">docker ps | docker container ls</font>作用列出容器格式docker ps [OPTIONS]示例docker ps -aoption-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 CONTAINERoption-f强制删除-v删除与容器关联的匿名卷1.3 docker volume<font size="5">docker volume ls</font>作用列出卷格式docker volume ls [OPTIONS]示例docker volume ls -qoption-q只显示卷名-f过滤,如'dangling=true'--format格式化显示<font size="5">docker volume rm</font>作用删除卷格式docker volume rm [OPTIONS] VOLUME [VOLUME...]示例docker volume rm VOLUMEoption-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>]
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 80823.docker compose示例
services:
  #服务名
  backend:
    #容器名
    container_name: hello-compose
    build:
      context: ./
      #指定编译文件
      dockerfile: Dockerfile
    # 绑定端口 -p
    ports:
      - 8082:8082
特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

Tags 标签

dockerdevopslinux运维容器技术

扩展阅读

加个好友,技术交流

1628738909466805.jpg