Docker学习笔记:技术原理+常用指令+Linux使用

基础

Doker是一个开源的应用容器引擎,可以让开发者们打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上。容器是完全使用沙箱机制,相互隔离。容器的性能开销极低。

技术原理

Docker利用了Linux的两大原生功能实现容器化:

  • Cgroups:用来限制和隔离进程的资源的使用,可以为每个容器设定CPU、内存、网络贷款等资源的使用上限,确保了一个容器的资源消耗不会影响到宿主机或者其他正在运行的容器。

  • Namespaces:用来隔离进程的资源视图,使得容器只能看到自己内部的进程ID、网络资源和文件目录,而看不到宿主机的

所以容器本质上还是一个特殊的进程,但容器内部看起来却像一个独立运行的操作系统。每个Docker容器都是一个独立的运行环境,每个容器内部都表现得像一个独立的Linux系统。

Docker网络

默认使用Bridge桥接,所有的容器默认连接到一个网络,每个容器都分配了一个内部的IP地址(通常172.17.*),在这个内部子网中,容器可以通过IP地址互相访问,但容器网络和宿主机网络是互相隔离的。

子网模式:也可以创建子网,让指定容器加入不同的子网,同一个子网的容器可以相互通信,但是不同子网的容器不能相互通信。除此之外,同一个子网的容器可以使用名字(DNS机制)来直接通信,而不必使用内部IP地址。

host模式:docker容器直接共享宿主机的网络,容器直接使用宿主机的IP地址,而且无需-p参数进行端口映射,容器内的服务直接运行在宿主机的端口上,通过宿主机的IP和端口就能访问到容器。host模式用于解决棘手的网络问题。
在这里插入图片描述

命令

镜像

1- 下载:
docker pull --platform=xxx docker.io/library/nginx:latest => 简化后:docker pull nginx(默认官方下载)
            --使用什么cpu架构 registry/namespace/ :tag
               amd/arm架构   仓库地址/命名空间/ :版本号
               默认适配版本   官方仓库/官方命名空间/ :最新版本

完整意思为:在docker官方仓库的官方命名空间内下载nginx的最新版本

2- 配置下载镜像:

复制:

  ,
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.1panel.live",
    "https://hub.rat.dev"
  ]

完整内容到docker:desktop里面的Docker Engine的配置代码中并restart保存配置

3- 展示所有下载的镜像:
docker images
展示内容:
IMAGE          ID             DISK USAGE   CONTENT SIZE   EXTRA
nginx:latest   0236ee02dcbc        240MB         65.8MB
4- 删除镜像:
docker rmi 镜像ID或名称
效果:
Untagged: nginx:latest
Deleted: sha256:0236ee02dcbce00b9bd83e0f5fbc51069e7e1161bd59d99885b3ae1734f3392e

容器

5- 运行镜像(如果镜像不存在就先拉取),也就是通过镜像创建一个容器(相当于创建一个类的实例对象)
docker run [-d] [-p 80:88] [-v  D:/doc或命名卷名称:/usr/share/nginx/doc] [-e MONGO_INITDB_ROOT_PASSWORD=Secret \] [--name my_nginx] [-it]  [--rm] [--restart always] 镜像名称/镜像ID
  1. -d是采用分离模式,写上去的话容器会自动在后台运行,而不用占用当前窗口持续刷新日志了

  2. -p是指定宿主机端口号80与容器内端口号88进行对应,这样在宿主机也可以访问容器内部了

  3. -v是指定宿主机目录(D:/html)和容器内的目录(/usr/share/nginx/html)进行绑定,进行容器内数据的持久化存储,同时也可以通过这个绑定向容器内的目录放东西。根据宿主机目录的展示方式不同,分为绑定挂载(直接写宿主机目录路径)和命名卷挂载(创建一个存储空间命名卷,写的是卷的名字)。

    1. 绑定挂载:创建镜像的时候会用宿主机的目录对容器的目录进行覆盖,于是如果这时宿主机的目录里面没有东西,那就访问不到东西。

    2. 命名卷挂载:创建镜像的时候,会在宿主机创建一个新的存储空间,然后将容器对应目录的内容放进去。

  4. –name:自定义容器的名称’

  5. -it是可以让宿主机的控制台进入容器内部进行交互

  6. –rm是当容器停止的时候就把容器删除掉

  7. –restart是用来配置在容器停止时的重启策略,包含选项:

  8. always:只要容器停止了就立即重启,包含容器因为内部错误崩溃、或宿主机断电等场景

  9. unless-stopped:同样会自动重启,但只要手动停止就不自动重启

6- 查看正在运行的容器
docker ps [-a]

-a是要获取全部容器,包括正在运行的和已经停止的
展示内容:
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
2bc2f1b1124e   nginx     "/docker-entrypoint.…"   19 seconds ago   Up 18 seconds   80/tcp    eloquent_khorana

CONTAINER ID:容器ID(自动分配且唯一)
IMAGE:镜像名称
NAMES:不指定就随即创建的容器名称
7- 删除容器
docker rm [-f] 容器ID

-f:强制删除正在运行的容器

8- 对原有容器启用/查看详细信息/停止
docker start 容器ID/名称
docker inspect 容器ID
docker stop 容器ID/名称
9- 创建容器
docker create 镜像名称

使用方法和docker run命令一样,唯一区别就是不会立即运行容器,而需要用start命令运行

11- 查看容器的日志
docker logs 容器ID/名字 [-f]

-f是滚动实时输出容器的日志

12-在容器内部执行Linux命令
docker exec 容器ID Linux命令

查看容器内部进程:docker exec 容器ID ps -ef
进入一个正在运行的容器内部获得一个交互式的命令行环境:docker exec -it 容器ID /bin/sh

进入到容器内,修改某文件:

cd /usr/share/nginx/html
ls 列出目录中的所有文件
vi index.html 修改文件
发现vi工具缺失,然后安装一个vi工具
cat /etc/os-release 查看Linux的版本
发现版本是debian,此容器内安装软件需要使用apt命令
apt update
apt install vim
vi index.html
修改文件
i
esc :wq enter

退出方法:

  1. 退出并让容器继续运行:ctrl + P 、crtl + Q

  2. 退出并停止容器:exit enter

  3. 强制停止容器:ctrl + C

volume挂载卷

13- 挂载卷相关
  1. 创建挂载卷:docker volume create 挂载卷名称

  2. 查看挂载卷存储位置:docker volume inspect 挂载卷名称

  3. 挂载卷可以直接通过docker-desktop查看

  4. 查看所有的挂载卷:docker volume list

  5. 删除某挂载卷:docker volume rm 挂载卷名称
    lume rm 挂载卷名称`

  6. 删除所有没有在使用的挂载卷:docker volume prune -a,然后在输入y回车

DockerFile

dockerfile记录了镜像的资料。

Dockerfile文件内容
FROM python:3.13-slim 
# 必不可少!使用[官方的 Python 3.13 镜像作为]基础镜像

WORKDIR /app 
# 切换到镜像内的一个目录作为工作目录

COPY . .
# 将当前目录下的所有文件复制到镜像内的工作目录
RUN pip install --no-cache-dir -r requirements.txt
# 安装项目依赖,使用 --no-cache-dir 选项来减少镜像大小
EXPOSE 8000
# 声明容器在运行时会监听的端口,这里是 8000
# 这个指令只是声明端口,并不会实际打开端口,只有在运行容器时使用 -p 参数映射端口才会生效
CMD ["python3", "main.py"]
# 设置容器启动时执行的命令,这里是运行 main.py 文件
# 一个docker文件里面只能有一个CMD指令,如果有多个CMD指令,只有最后一个会被执行
ENTRYPOINT ["python3", "main.py"]
# 设置容器的入口点,这里也是运行 main.py 文件
# ENTRYPOINT 指令会覆盖 CMD 指令,所以如果同时使用了 CMD 和 ENTRYPOINT,只有 ENTRYPOINT 会被执行,CMD 的参数会被传递给 ENTRYPOINT
使用命令
docker build -t 镜像名称[:版本号] .
.表示在当前目录创建镜像
docker login
docker push 作者名/镜像名称[:版本号]

Docker网络

子网模式

在这里插入图片描述

创建容器1:
docker run -d  --name my_mongodb  -e MONGO_INITDB_ROOT_USERNAME=tech  -e MONGO_INITDB_ROOT_PASSWORD=123456(例如)  --network network1  mongo

创建容器2:
docker run -d --name my_mongodb_express -p 8081:8081 -e ME_CONFIG_MONGODB_SERVER=my_mongodb -e ME_CONFIG_MONGODB_ADMINUSERNAME=tech -e ME_CONFIG_MONGODB_ADMINPASSWORD=wensiy --network network1 mongo-express

进入容器2控制台:
docker exec -it my_mongodb_express /bin/sh

访问容器1:
/app # ping my_mongodb
效果:
PING my_mongodb (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.140 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.102 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.075 ms
64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.074 ms
64 bytes from 172.18.0.2: seq=4 ttl=64 time=0.104 ms
64 bytes from 172.18.0.2: seq=5 ttl=64 time=0.102 ms
64 bytes from 172.18.0.2: seq=6 ttl=64 time=0.069 ms
64 bytes from 172.18.0.2: seq=7 ttl=64 time=0.105 ms
64 bytes from 172.18.0.2: seq=8 ttl=64 time=0.078 ms
64 bytes from 172.18.0.2: seq=9 ttl=64 time=0.109 ms
^C
--- my_mongodb ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 0.069/0.095/0.140 ms
host模式

在这里插入图片描述

docker run -d --network host nginx
然后访问本地网址端口80,发现可以访问到(前提是Linux系统,因为Windows 与 Linux 的 host 网络实现不同,Docker 的 host 网络模式在 Windows 上没有得到完全的支持)

进入容器内部:
docker exec -it 741e8b5c09226430690c008d9ade29de39bf1ac43e2a624f9ef6234016c0531d /bin/sh

更新apt:
apt update

安装:
apt install iproute2

查看容器的IP:
ip addr show
效果(关键部分是显示IP地址为宿主机的IP):
2: services1@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 62:92:8e:4e:49:1c brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.65.6/32 scope global services1
       valid_lft forever preferred_lft forever
    inet6 fdc4:f303:9324::6/128 scope global nodad
       valid_lft forever preferred_lft forever
    inet6 fe80::6092:8eff:fe4e:491c/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
none模式(不联网)

在这里插入图片描述

查看当前所有网络模式
docker network list
效果展示(其中默认包含的bridge模式、host模式、none模式,不可删除):
NETWORK ID     NAME       DRIVER    SCOPE
61a9b11e07eb   bridge     bridge    local
67b0cb45704f   host       host      local
33bae1b6739d   network1   bridge    local
d6b35f2216d4   none       null      local

删除自定义的子网:
docker network rm 33bae1b6739d

再次查看所有网络模式:
network list
效果展示(没有自定义的子网了):
NETWORK ID     NAME      DRIVER    SCOPE
61a9b11e07eb   bridge    bridge    local
67b0cb45704f   host      host      local
d6b35f2216d4   none      null      local

Docker compose

Docker compose使用yaml文件管理多个容器,里面列出了容器是如何创建以及如何协同工作,可以将Docker compose文件理解成一个或多个Docker run命令,将他们按照特定格式列到了一个文件里面。同一个compose文件中定义的容器,都会自动加入同一个子网,除此之外,还可以自定义容器的启动顺序(用depends_on即可)。

run命令和compose文件对比:

在这里插入图片描述
在这里插入图片描述

docker compose 命令的执行强烈依赖于“当前工作目录”,它默认会在当前工作目录中寻找 docker-compose.yml 文件。

如果容器已经运行了,再次执行 docker compose up 不会有任何效果,不会创建新的容器

docker compose [-f 你的文件名.yml] up [-d]

-f:如果yaml文件名并不是标准的docker-compose.yml ,就需要特别标注,否则会找不到yaml文件
效果展示:
✔ Network network1             Created                                                                                                                 0.1s
 ✔ Container my_mongodb         Created                                                                                                                 0.2s
 ✔ Container my_mongodb_express Created                                                                                                                 0.1s
 停止并删除容器:
 docker compose down
 停止容器:
 docker compose stop
 启动容器:
 docker compose start

Linux安装docker省略版

sudo apt update
sudo apt install 名称
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
sudo add-apt-repository "..."
[ENTER]
sudo apt update
sudo apt install 其他工具
docker --version 
安装docker-compose 环境池(一个项目要启动很多服务的情况下)
curl -L "..." -o /usr/local/bin/docker-compose
sudo chmod +x /
docker-compose --version

Linux使用

git clone https://github.com/dataelement/bisheng.git
ls
cd 文件夹 进入项目
ls 一般用docker启动的项目都包含docker文件夹
cd docker
ls 发现包含docker-compose.yml
docker-compose up -d
cat /etc/os-release 检查容器内Linux的发行版本
docker ps 列出正在被使用的服务,检验哪些服务没有被正确启动
docker images 把所有的服务列出来
docker-compose up -d 启动所有服务,只能在包含docker-compose.yml的目录执行
docker-compose down 停止所有服务,只能在包含docker-compose.yml的目录执行
docker-compose restart 服务名称(例如mysql)
docker restart 容器名称(例如docker-mysql-1),可以在任意目录下使用
docker run 指令 创建运行一个新的容器(alpine echo "hello world")
docker start 容器名称(需要先用docker ps -a来查看容器的名称)
docker stop 容器名称
docker --version docker-compose --version
docker rm 容器名称 删除容器
docker restart $(docker ps -q) 重启所有docker服务
端口号需要替换为远程机子启动后local URL后面跟着的端口号。中括号内容需要替换SSH远程登录指令中的对应内容,然后粘贴到powershell或cmd,然后yes并输入SSH远程登录密码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值