引言#

Docker is an open platform for developing, shipping, and running applications.

Docker allows you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications.

Docker 架构#

  • Docker Client
  • Docker Daemon
    • Docker Server
    • Engine
  • Docker Registry

image-20240723142644532

Docker 安装#

bash
1
2
3
4
5
6
7
8
9
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt update
sudo apt install -y docker-ce
plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
root@iZbp19bvr4g3vqr24ft07rZ:~# docker version
Client: Docker Engine - Community
Version: 26.1.3
API version: 1.45
Go version: go1.21.10
Git commit: b72abbb
Built: Thu May 16 08:33:35 2024
OS/Arch: linux/amd64
Context: default

Server: Docker Engine - Community
Engine:
Version: 26.1.3
API version: 1.45 (minimum version 1.24)
Go version: go1.21.10
Git commit: 8e96db1
Built: Thu May 16 08:33:35 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.32
GitCommit: 8b3b7ca2e5ce38e8f31a34f35b2b68ceb8470d89
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0

Docker 代理#

要拉取镜像,使用阿里云的代理,或者直接开启魔法

image-20240723145358155

镜像#

镜像 就是 模板

  • 查找可以拉取的镜像
bash
1
2
3
4
5
6
7
root@iZbp19bvr4g3vqr24ft07rZ:~# docker search nginx
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 20031 [OK]
unit Official build of NGINX Unit: Universal Web … 33 [OK]
nginx/nginx-ingress NGINX and NGINX Plus Ingress Controllers fo… 92
nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 155
// .....
  • 查找本地镜像
bash
1
docker images
  • 拉取镜像

每一行就是每一层包装

所以有些时候,拉取一个镜像,有许多层是不需要重复下载的

镜像是由一系列的层组成的。每个层代表Dockerfile中的一个指令,这些层堆叠在一起形成了完整的镜像

bash
1
2
3
4
5
6
7
8
9
10
11
docker pull imageName 

root@iZbp19bvr4g3vqr24ft07rZ:~# docker pull openjdk:11
11: Pulling from library/openjdk
0e29546d541c: Pull complete
9b829c73b52b: Pull complete
cb5b7ae36172: Pull complete
6494e4811622: Pull complete
668f6fcc5fa5: Pull complete
dc120c3e0290: Pull complete
8f7c0eebb7b1: Pull complete
  • 删除镜像
plaintext
1
docker rmi imageID

rm 删除 i 镜像

容器#

IDname 都是唯一的,所以可以用ID的地方也可以用 name

  • 容器创建
bash
1
docker run nginx

这样子创建的容器有几个缺点:

  1. 每次都是创建新的容器
  2. 前台运行 –> 命令行被占用,无法使用;把命令行关闭就会关闭进程
  3. curl 127.0.0.1 无法访问 ,因为开启的是容器的内网,需要做端口映射

如果要实现端口映射:

bash
1
docker run -d -p 80:80 nginx 

-d 是代表后台运行

-p 80:80 是指定端口映射 - 容器端口 :容器端口

-P 是随机端口映射

  • 容器查看
bash
1
2
3
docker ps  # 只查看运行的

docker ps -a # 查看所有的容器
  • 删除停止运行的容器
plaintext
1
docker rm id/name
  • 删除正在运行的容器
bash
1
docker rm -f id/name  # 强制删除
  • 容器停止
bash
1
docker stop id/name
  • 容器启动
plaintext
1
docker start id/name
  • 进入容器内部
bash
1
2
3
4
5
6
7
8
docker exec -it nginx01 /bin/bash

root@iZbp19bvr4g3vqr24ft07rZ:~# docker exec -it nginx01 /bin/bash
root@9d96ec7a3c6c:/# #我们的用户名直接变了,因为进入了容器内部

root@9d96ec7a3c6c:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr

exec 就是 执行命令的意思

-i 是交互式的意思

-t 是伪终端的意思

/bin/bash 是可用的终端

整体的意思:在nginx01里使用/bin/bash下的脚本开启一个交互式伪终端,也就是进入容器内部

  • 相关配置
plaintext
1
2
3
4
5
6
7
8
9
10
11
--name name  # 取名字

--rm # 退出时自动删除

--restart no/on-failure:3/always # 重启策略 不重启/失败重启3次/开机自启

-e key=value,key=value # 设置环境变量
docker inspect nginx01 # 查看环境变量

-m 2m # 限制容器资源 -- 2m内存
-cups 0.5 # 限制cpu资源

日志#

  • 容器日志
bash
1
docker logs nginx01
  • 日志的其他功能
bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
docker logs --help

root@iZbp19bvr4g3vqr24ft07rZ:~# docker logs --help

Usage: docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Aliases:
docker container logs, docker logs

Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. "2013-01-02T13:23:37Z") or relative (e.g.
"42m" for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. "2013-01-02T13:23:37Z") or relative
(e.g. "42m" for 42 minutes)

-f 实时监听

-n 查看最近n条

Volume#

  • 隔离性

本质上容器中的文件系统也是存在于主机的文件系统上,但隔离

容器的文件系统占用的磁盘大小 是单独分割出一块区域 供其使用,正常主机文件操作不会涉及容器区域

volume 的作用: 让容器内的文件系统和容器外的文件系统 部分共享;也就是允许 容器可以访问到 容器外的某一个目录

plaintext
1
docker volume --help

数据卷管理命令#

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@iZbp19bvr4g3vqr24ft07rZ:/# docker volume

Usage: docker volume COMMAND

Manage volumes

Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove unused local volumes
rm Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.

三种绑定方式#

  • 匿名绑定(用的少)
  1. 匿名绑定的 volumn 在容器被删除的时候,数据卷会被删除

  2. Docker 会自动为容器分配一个随机名称的卷来存储数据

创建容器

shell
1
2
root@iZbp19bvr4g3vqr24ft07rZ:~# docker run --rm -d -p 80:80 --name nginx_volume -v /usr/share/nginx/html nginx 
990e5a0389e6f87b6a13d4161fa0d01f7b97323c246f9aa2c12afa439979ba16

--rm 使用完后自动删除

-d 后台运行

-p 端口映射

--name 容器名字

-v /usr/share/nginx/html 使用数据卷,这里后面的路径表示的是要挂载的容器内的数据所在目录

nginx 镜像名字

看一下容器时候创建成功

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
root@iZbp19bvr4g3vqr24ft07rZ:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
990e5a0389e6 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp nginx_volume
root@iZbp19bvr4g3vqr24ft07rZ:~# curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

如果要查看创建的docker容器映射的容器外部数据卷目录所在路径

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@iZbp19bvr4g3vqr24ft07rZ:~# docker inspect nginx_volume
[
// ................
"Mounts": [
{
"Type": "volume",
"Name": "68d5763087ed18658eb1327e987101aeb45bc3e2f674b0657cee877d416a12ef",
"Source": "/var/lib/docker/volumes/68d5763087ed18658eb1327e987101aeb45bc3e2f674b0657cee877d416a12ef/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
// ..................
]

destination 容器内部的目录

source 容器外部的目录

查看外部是否有这个目录

plaintext
1
2
3
4
root@iZbp19bvr4g3vqr24ft07rZ:~# cd /var/lib/docker/volumes/68d5763087ed18658eb1327e987101aeb45bc3e2f674b0657cee877d416a12ef/_data
root@iZbp19bvr4g3vqr24ft07rZ:/var/lib/docker/volumes/68d5763087ed18658eb1327e987101aeb45bc3e2f674b0657cee877d416a12ef/_data# ls
50x.html index.html
root@iZbp19bvr4g3vqr24ft07rZ:/var/lib/docker/volumes/68d5763087ed18658eb1327e987101aeb45bc3e2f674b0657cee877d416a12ef/_data#

由此可知,关联是存在的

现在修改一下外部的 index.html

bash
1
vim index.html
vim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html>
<head>
<title>after my fixfixfix!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
vim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@990e5a0389e6:/usr/share/nginx/html# curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>after my fixfixfix!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

然后我们修改有一下 容器内的 文件

bash
1
echo 'hello docker' > index.html

然后转到 容器外的文件目录上

bash
1
2
3
cat index.html

hello docker

因此我们发现,容器内和容器外是相互关联的,无论是我们修改容器内的文件还是修改容器外的文件

验证一下容器删除后数据卷也删除

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
root@iZbp19bvr4g3vqr24ft07rZ:~# docker volume ls
DRIVER VOLUME NAME
local 2a5808e089d3e17977f9586770d1489dcaf79473a4c37ae1dc4c863a6c4a59f8
local 4ed2880b063c5c7dd3057088a4e614cf7fb9c071692a8b0a193d9c4c01b57f56
local 6ace849e5a1ceea672b6b771f80cb484c17f7dd69456ff4b277d69981587a75a
local 40ab82e68b995b09b5342021bc6a34378e9b54bed1d352402fe8df729eae174d
local 68d5763087ed18658eb1327e987101aeb45bc3e2f674b0657cee877d416a12ef
local 88e667aa68a83da1322e525e528cefbf4cce342d9caec1e4f7359b607349b102
local 6320e3d5a1e2cba18f6d04ef7ac45af7abe8f5e15658d236afea8c1d30d0038b
local 56555ab23611f1a946d1cb08e922f9b82af59cc36b459ac321620ec2a43a5ed2
local a9f4299d0bb46ccf9bc7210bcba921f3ccf2db94a0b5e580df6d5b1ec9728498
local c24965087c46f93d55ff6d3d41530ced7268706777b998b00ca5085bae253c6c
local e20e5fcebfc72118c1352b0fc0fdc0e31e3e2985b46f682d1fad04bba9115bc1
local fa5dc80a62250e91edd5a8e205ca6311ce79f022a8f12f35da7d7563a5bc48fd
root@iZbp19bvr4g3vqr24ft07rZ:~# docker stop nginx_volume
nginx_volume
root@iZbp19bvr4g3vqr24ft07rZ:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d96ec7a3c6c nginx "/docker-entrypoint.…" 9 days ago Up 9 days 0.0.0.0:32770->80/tcp, :::32770->80/tcp nginx01
525d3cea0513 nginx "/docker-entrypoint.…" 9 days ago Exited (0) 9 days ago eager_shirley
e5bdc6b3cab8 nginx "/docker-entrypoint.…" 9 days ago Exited (0) 9 days ago jovial_hawking
8b274132b674 hello-world "/hello" 9 days ago Exited (0) 9 days ago admiring_blackburn
387c58f4b704 hello-world "/hello" 9 days ago Exited (0) 9 days ago silly_moore
root@iZbp19bvr4g3vqr24ft07rZ:~# docker volume ls
DRIVER VOLUME NAME
local 2a5808e089d3e17977f9586770d1489dcaf79473a4c37ae1dc4c863a6c4a59f8
local 4ed2880b063c5c7dd3057088a4e614cf7fb9c071692a8b0a193d9c4c01b57f56
local 6ace849e5a1ceea672b6b771f80cb484c17f7dd69456ff4b277d69981587a75a
local 40ab82e68b995b09b5342021bc6a34378e9b54bed1d352402fe8df729eae174d
local 88e667aa68a83da1322e525e528cefbf4cce342d9caec1e4f7359b607349b102
local 6320e3d5a1e2cba18f6d04ef7ac45af7abe8f5e15658d236afea8c1d30d0038b
local 56555ab23611f1a946d1cb08e922f9b82af59cc36b459ac321620ec2a43a5ed2
local a9f4299d0bb46ccf9bc7210bcba921f3ccf2db94a0b5e580df6d5b1ec9728498
local c24965087c46f93d55ff6d3d41530ced7268706777b998b00ca5085bae253c6c
local e20e5fcebfc72118c1352b0fc0fdc0e31e3e2985b46f682d1fad04bba9115bc1
local fa5dc80a62250e91edd5a8e205ca6311ce79f022a8f12f35da7d7563a5bc48fd
root@iZbp19bvr4g3vqr24ft07rZ:~#

可以发现,我们停掉容器,删除容器后,数据卷也就消失了

  • 具名绑定

可以给数据卷起个名字,容器删除后数据卷不变,然后和匿名绑定差不多了

创建容器

bash
1
2
root@iZbp19bvr4g3vqr24ft07rZ:~# docker run --rm -d -p 80:80 --name nginx_volume -v nginx-html:/usr/share/nginx/html nginx 
c2c2a0a156e93a604fbdad106898ac9e70fa7588353f1513221096e3600b8926

-v nginx-html:/usr/share/nginx/html

在这里 nginx-html 就是数据卷的名字

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@iZbp19bvr4g3vqr24ft07rZ:~# docker volume ls
DRIVER VOLUME NAME
local 2a5808e089d3e17977f9586770d1489dcaf79473a4c37ae1dc4c863a6c4a59f8
local 4ed2880b063c5c7dd3057088a4e614cf7fb9c071692a8b0a193d9c4c01b57f56
local 6ace849e5a1ceea672b6b771f80cb484c17f7dd69456ff4b277d69981587a75a
local 40ab82e68b995b09b5342021bc6a34378e9b54bed1d352402fe8df729eae174d
local 88e667aa68a83da1322e525e528cefbf4cce342d9caec1e4f7359b607349b102
local 6320e3d5a1e2cba18f6d04ef7ac45af7abe8f5e15658d236afea8c1d30d0038b
local 56555ab23611f1a946d1cb08e922f9b82af59cc36b459ac321620ec2a43a5ed2
local a9f4299d0bb46ccf9bc7210bcba921f3ccf2db94a0b5e580df6d5b1ec9728498
local c24965087c46f93d55ff6d3d41530ced7268706777b998b00ca5085bae253c6c
local e20e5fcebfc72118c1352b0fc0fdc0e31e3e2985b46f682d1fad04bba9115bc1
local fa5dc80a62250e91edd5a8e205ca6311ce79f022a8f12f35da7d7563a5bc48fd
local nginx-html

查看一下这个数据卷的位置

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
docker inspect nginx_volume 
"Mounts": [
{
"Type": "volume",
"Name": "nginx-html",
"Source": "/var/lib/docker/volumes/nginx-html/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],

验证容器删除后数据卷不删除

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@iZbp19bvr4g3vqr24ft07rZ:~# docker rm -f nginx_volume 
nginx_volume
root@iZbp19bvr4g3vqr24ft07rZ:~# docker volume ls
DRIVER VOLUME NAME
local 2a5808e089d3e17977f9586770d1489dcaf79473a4c37ae1dc4c863a6c4a59f8
local 4ed2880b063c5c7dd3057088a4e614cf7fb9c071692a8b0a193d9c4c01b57f56
local 6ace849e5a1ceea672b6b771f80cb484c17f7dd69456ff4b277d69981587a75a
local 40ab82e68b995b09b5342021bc6a34378e9b54bed1d352402fe8df729eae174d
local 88e667aa68a83da1322e525e528cefbf4cce342d9caec1e4f7359b607349b102
local 6320e3d5a1e2cba18f6d04ef7ac45af7abe8f5e15658d236afea8c1d30d0038b
local 56555ab23611f1a946d1cb08e922f9b82af59cc36b459ac321620ec2a43a5ed2
local a9f4299d0bb46ccf9bc7210bcba921f3ccf2db94a0b5e580df6d5b1ec9728498
local c24965087c46f93d55ff6d3d41530ced7268706777b998b00ca5085bae253c6c
local e20e5fcebfc72118c1352b0fc0fdc0e31e3e2985b46f682d1fad04bba9115bc1
local fa5dc80a62250e91edd5a8e205ca6311ce79f022a8f12f35da7d7563a5bc48fd
local nginx-html

可以看出,具名绑定中删除了容器,但是数据卷并没有被删除

真的想要删除数据卷

bash
1
docker volume rm -f nginx_volume 

缺点

这个并不能自由指定某个目录和容器内的目录进行关联

只能够决定这个数据卷的名字而已

具体路径还是随机生成的

  • Bind Mount

绑定并加载主机的某个文件目录到容器中

这个是最重要最平常的一种方法

plaintext
1
2
root@iZbp19bvr4g3vqr24ft07rZ:/# docker run --rm -d -p 80:80 --name nginx_volume -v /www/nginx:/usr/share/nginx/html nginx 
53433f7ad6a95fd955353410cf88819d457d51bca8d495a4600fc8b83f39c061

-v /www/nginx:/usr/share/nginx/html 前面是主机目录,后面是容器目录

多目录绑定: -v xxx:xxx -v xxxx:xxxx

但是这种方式下并不会在 docker volume ls 下呈现出 数据卷

NetWork#

是 docker 对容器网络隔离的 技术,提供了不同的模式供开发者使用,来实现容器网络的互通以及彻底的隔离

  1. 容器间的网络隔离
  2. 部分容器之间的网络隔离
  3. 管理多个子网下容器的ip

网卡(也称网络适配器或网络接口卡)是计算机和网络连接的硬件组件。其主要功能是将计算机的数据转换为网络信号,并将网络信号转换为计算机可以理解的数据。

虚拟网卡是软件模拟的网卡,它在功能上与物理网卡相同,但其实现完全基于软件。虚拟网卡通常用于虚拟机、容器和其他虚拟化环境,以便这些虚拟化实例能够像物理机一样进行网络通信。

bridge 网桥是一种虚拟网络设备,它连接了 Docker 容器和宿主机的网络。它允许容器之间以及容器与外部网络之间进行通信。

  • 查看网络
plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
root@iZbp19bvr4g3vqr24ft07rZ:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:1c:3b:52 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname ens5
inet 172.18.248.200/20 metric 100 brd 172.18.255.255 scope global dynamic eth0
valid_lft 315295039sec preferred_lft 315295039sec
inet6 fe80::216:3eff:fe1c:3b52/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:81:e2:f0:cd brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:81ff:fee2:f0cd/64 scope link
valid_lft forever preferred_lft forever
4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
link/ether 82:ee:82:59:60:f9 brd ff:ff:ff:ff:ff:ff
inet 10.42.0.0/32 scope global flannel.1
valid_lft forever preferred_lft forever
inet6 fe80::80ee:82ff:fe59:60f9/64 scope link
valid_lft forever preferred_lft forever
20: veth51c06f5@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 96:dd:92:0e:07:cf brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::94dd:92ff:fe0e:7cf/64 scope link
valid_lft forever preferred_lft forever
26: veth54985ef@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether e2:8e:dd:fe:92:b5 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::e08e:ddff:fefe:92b5/64 scope link
valid_lft forever preferred_lft forever

网络模式#

  • bridge(桥接)

    在主机中创建一个 Docker0 的虚拟网桥,来实现主机和容器内的网络互通,可以看作是一种虚拟的交换机

    在 Docker0 创建一对虚拟网卡,一半在主机上veth,一半在容器内eth0

    veth0 docker0 eth0 两张网卡 和 一个网桥

    ens160 主机的网卡

image-20240802004910476

  • host

    容器不再拥有自己的网络空间,直接与主机共享网络空间,基于该模式创建的容器对应的ip 就是与主机同一个子网

    此时 容器就会跟主机一样暴露到外部环境,会不安全,因此用的少

  • none (lo 网卡)

​ Docker 会拥有自己的网络空间,不与主机共享,在这个网络模式下的容器,不会被分配网卡,ip等路由 信息

​ 也就是完全隔离,和外部信息隔绝,只有自己本地的 127.0.0.1

  • container

    容器间处于同一个网络中

    image-20240802005808765

  • 自定义(推荐)

plaintext
1
docker network COMMAND
bash
1
2
3
4
5
6
7
8
9
10
11
root@iZbp19bvr4g3vqr24ft07rZ:~# docker network create --driver bridge --subnet 192.168.133.0/24 --gateway 192.168.133.1 wolfcode
f34f3bd1c7aa84aa8c6262f0ecac14ad662bdab2667543be165111a8d9302133
root@iZbp19bvr4g3vqr24ft07rZ:~# docker netwok ls
docker: 'netwok' is not a docker command.
See 'docker --help'
root@iZbp19bvr4g3vqr24ft07rZ:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
683cea28bac4 bridge bridge local
a1d8fa2e9dbd host host local
84bfb52c9cce none null local
f34f3bd1c7aa wolfcode bridge local

具体做法用到了再说

  • 查看特定网络:
bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
root@iZbp19bvr4g3vqr24ft07rZ:~# docker network  inspect  wolfcode 
[
{
"Name": "wolfcode",
"Id": "f34f3bd1c7aa84aa8c6262f0ecac14ad662bdab2667543be165111a8d9302133",
"Created": "2024-08-02T13:18:19.419330829+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.133.0/24",
"Gateway": "192.168.133.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]

Dockerfile#

Docker 为我们提供的一个用于自定义构建镜像的一个配置文件: 描述如何构建一个镜像

最后利用 Docker build 命令 指定 Dockerfile 文件,就可以按照配置构建镜像

  • Commit
  • Build

常用指令#

dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 1. 先指定当前镜像的基础镜像是什么
FROM golang:1.14.2

# 2. 描述这个镜像的作者以及联系方式(可选)
MAINTAINER echin<197795131@qq.com>

# 3. 设置镜像的标签信息(可选)
LABEL version="1.0"
LABEL description="This is the first dockerfile"

# 4. 环境变量,可以设置多个
ENV GOPROXY=https://goproxy.cn,direct
ENV GO111MODULE=on

# 5. 在构建镜像时,需要执行的命令和脚本
RUN mkdir -p /go/src/app

# 6. 将主机中的指定文件拷贝到镜像中目标路径 ADD <src>... <dest>
ADD . /go/src/app
ADD ["./config", "/go/src/app/config"]

# 7. 指定工作目录,如果不存在会自动创建
WORKDIR /go/src/app

# 8. 镜像数据卷绑定,可以将主机的指定目录挂载到容器中
VOLUME ["/data"]

# 9. 容器对外暴露的端口,仅仅是容器内暴露的端口,而没有和主机端口进行关联
EXPOSE 8080

# 10. 容器启动时执行的命令
# CMD 和 ENTRYPOINT 选择一个,描述构建镜像完成后,启动容器时默认执行的脚本
# 两者区别: CMD 可以被 docker run 命令行参数替换,ENTRYPOINT 不会被替换
CMD ["go", "run", "main.go"]
ENTRYPOINT ["go", "run", "main.go"]

拓展指令#

dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 设置变量,在镜像中定义一个变量,可以在构建镜像时通过 --build-arg 参数传递
ARG app_env=production
# ARG golang_env
# FROM golang:$golang_env
# docker build --build-arg app_env=development -t myapp:dev .

# 2. 设置容器的用户,可以是用户名或者 UID
USER root

# 3. ONBUILD 指令,当构建一个被继承的 Dockerfile 时运行命令
ONBUILD ADD . /go/src/app

# 4. STOPSIGNAL 指令,设置容器停止时的信号
STOPSIGNAL SIGTERM

# 5. HEALTHCHECK 指令,设置容器健康检查的命令
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1

Registry#

  • 实现快速交付,更方便在其他机器上下载镜像运行容器
  • 可以存储公式内部是由镜像,避免暴露到外网
  • 提升镜像下载速度
  1. 登录到 Registry

    plaintext
    1
    docker login [OPTIONS] [SERVER] [USERNAME]

    使用此命令登录到 Docker Registry,需要提供用户名和可选的服务器地址。

  2. 登出 Registry

    plaintext
    1
    docker logout [SERVER]

    登出当前登录的 Docker Registry。

  3. 查看本地镜像

    plaintext
    1
    docker images

    列出本地的 Docker 镜像。

  4. 拉取镜像

    plaintext
    1
    docker pull [OPTIONS] NAME[:TAG|@DIGEST]

    从 Registry 拉取指定的镜像。

  5. 推送镜像

    plaintext
    1
    docker push [OPTIONS] NAME[:TAG]

    将本地的镜像推送到 Registry。

  6. 标记镜像

    plaintext
    1
    2
    sh
    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

    给镜像打上新的标签,通常用于准备推送到不同的 Registry。

  7. 查看 Registry 中的镜像列表

    plaintext
    1
    2
    sh
    curl -X GET https://[SERVER]/v2/_catalog

    使用 curl 命令来查看指定 Registry 中的镜像列表。

Docker compose#

容器编排: 针对容器生命周期的管理

  • 依赖管理,当一个容器必须在另一个容器余小宁我暗沉后,才能运行时就需要依赖管理
  • 副本数控制,容器有时候需要集群编排,进行弹性收缩
  • 配置共享

自行搜索如何下载 docker compose

配置文件#

  • services
  • network
  • volumes
plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: "2.1"

services:
nginx-demo:
image: nginx:latest
container_name: nginx-demo
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- echin-h

networks:
default:
external:
name: echin-h_default

volumes:
nginx-demo:
driver: local

Docker Compose 命令:#

  1. 启动服务

    bash
    1
    docker-compose up

    这个命令会启动配置文件中定义的所有服务。

  2. 启动服务并进入后台运行

    bash
    1
    docker-compose up -d

    加上 -d 参数可以让服务在后台运行。

  3. 停止服务

    bash
    1
    docker-compose down

    这个命令会停止并移除所有由 docker-compose.yml 文件中定义的服务、网络、卷和镜像。

  4. 查看服务状态

    bash
    1
    docker-compose ps

    列出所有由 docker-compose.yml 文件中定义的服务的状态。

  5. 查看服务的详细日志

    bash
    1
    docker-compose logs -f

    加上 -f 参数可以跟随日志输出,实时查看日志更新。

  6. 停止并移除容器、网络、卷和镜像

    bash
    1
    docker-compose down -v

    加上 -v 参数会移除由服务使用的卷。

  7. 构建或重建服务

    bash
    1
    docker-compose build

    根据 Dockerfile 构建或重建服务的镜像。

  8. 拉取服务的更新镜像

    bash
    1
    docker-compose pull

    拉取服务使用的镜像的最新版本。

  9. 查看服务的配置信息

    bash
    1
    docker-compose config

    查看 docker-compose.yml 文件的配置信息。

总结#

大概过了一遍知识点,具体写起来估计又是一脸懵逼