Docker笔记

Docker笔记

结合Centos 8部署Docker - 严千屹博客 (qianyios.top)搭建的Docker实现本次笔记的所有内容及例子

也可以使用以下Centos7部署Docker CE 19.03实现本实验的所有例子

Centos7部署Docker CE 19.03

(2023年4月8日01点00分)当前最常用的 Docker 版本是 Docker CE 19.03。这是 Docker 社区版(Community Edition)的最新版本,它包括一些更新和新功能,如多阶段构建、Dockerfile 中的 ARG 和 FROM 指令以及与 Kubernetes 的更好集成等。另外,Docker CE 19.03 支持 Windows、MacOS 和 Linux 操作系统。

卸载旧版本

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo yum -y remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose docker-machine docker-swarm
sudo rm /etc/yum.repos.d/docker-ce.repo
sudo rm -rf /var/lib/docker

安装docker

1
2
3
4
5
6
7
8
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io -y
sudo systemctl start docker
docker version
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

Docker的常用命令

1
2
3
docker version		   # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令

镜像命令

镜像命令

1
2
3
4
5
6
docker images		# 查看所有本地的主机上的镜像
-a,--al1 # 列出所有镜像
-q,--quiet # 只显示镜像的id
# 解释
REPOSITORY TAG IMAGE ID CREATED SIZE
镜像的仓库源 镜像的标签 镜像的id 镜像的创建时间 镜像的大小

搜索命令

1
2
3
4
[root@docker ~]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos DEPRECATED; The official build of CentOS. 7537 [OK]
检索Docker仓库中的Ubuntu镜像

拉取镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@docker ~]# docke pull 镜像名[:tag]		#下载镜像
# 如果不写tag,默认就是latest

[root@docker ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
从docker库拉去centos镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 18 months ago 231MB

删除镜像

1
2
3
4
5
6
7
8
9
10
11
docker rmi -f 镜像名/id		# 删除指定镜像
docker rmi -f 镜像名1 镜像名2 镜像名3 # 一次删除指定多个镜像
docker rmi -f $(docker images -aq) # 删除全部容器

[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 18 months ago 231MB
[root@docker ~]# docker rmi 5d0
Untagged: centos:latest
。。。。。。
(一般情况下 删除镜像id 只需要输入前面3个字符就行了)

查看镜像分层

1
[root@docker ~]# docker image inspect 镜像id

镜像资源包

1
2
3
4
5
curl -O http://mirrors.douxuedu.com/cloud/docker.zip
unzip docker.zip
docker load < 镜像名.tar
例如:
[root@localhost ~]# docker load < docker/centos_latest.tar

容器命令

新建容器并启动

1
2
3
4
5
6
7
8
9
10
11
12
docker run [可选参数] 镜像名		# 新建容器并启动
--name=Name # 容器名字用来区分容器
-d # 后台方式运行
-it # 使用交互方式运行,进入容器查看内容
-p # 指定容器的端口-p 8080:8080
-P # 随机指定端口
进入容器
[root@docker ~]# docker run -it --name test centos
[root@4018f9ac2f33 /]# pwd
/
exit # 退出
Ctrl+P+Q # 容器不停止退出

查看容器列表

1
2
3
4
5
6
7
8
查看容器列表   (若加 -a可以查看所有容器包括为运行的)
[root@docker ~]# docker ps [可选参数]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4018f9ac2f33 centos "/bin/bash" About a minute ago Up About a minute test
[可选参数]
-a # 列出当前正在运行的容器+带出历史运行过的容器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号

删除容器

1
2
3
4
(一般情况下 删除容器id 只需要输入前面3个字符就行了)
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $ (docker ps -aq) # 强制删除所有的容器
docker ps -a -q|xargs docker rm # 删除所有的容器

启动和停止容器

1
2
3
4
docker start 容器id		# 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器

进入正在运行的容器

1
2
3
4
进入容器后开启一个新的终端,可以在里面操作
docker exec -it 容器id /bin/bash
进入容器正在执行的终端,不会启动新的进程
docker attach 容器id

拷贝容器内的文件到主机上

1
2
3
4
5
6
7
8
9
10
11
12
13
docker cp 容器id:容器内路径 目的主机路径

[root@docker ~]# docker exec -it 401 /bin/bash
[root@4018f9ac2f33 /]# echo "11" > test.txt
[root@4018f9ac2f33 /]# cat test.txt
11
Ctrl+P+Q # 容器不停止退出
[root@docker ~]# docker cp 401:test.txt /root/
Preparing to copy...
Successfully copied 2.048kB to /root/
[root@docker ~]# cat test.txt
11

停止容器,将容器打包成新镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@docker ~]# docker commit [可选参数] 容器id REPOSITORY:TAG
[可选参数]:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。


[root@localhost ~]# docker commit -a qianyios -m "创建了test.txt" 401 test/centos:v1
sha256:29ffb8423a78853c5a49918c99e8d513239f9c3365cca06e1fc0027f589b7f59
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/centos v1 29ffb8423a78 3 seconds ago 233MB
centos latest 5d0da3dc9764 18 months ago 231MB

Docker数据卷

  • 数据卷用途:使容器内部的文件跟容器外面的文件同步
  • 数据卷的特点:
    1. 数据卷可在容器之间共享或重用数据
    2. 卷中的更改可以直接生效
    3. 数据卷中的更改不会包含在镜像的更新中
    4. 数据卷的生命周期一直持续到没有容器使用它为止

数据卷基本命令

1
2
docker volume ls		# 查看所有挂载的数据卷
docker volume inspect 卷名 # 查看数据卷所在的路径

指定路径挂载

1
docker run -v 主机目录:容器内目录

卷名挂载

1
docker run -v 卷名(不是目录了):容器内 目录

匿名挂载

1
docker run -v 容器内目录

数据卷权限

1
2
3
docker run -v 主机目录:容器内目录:ro		# ro readonly 只读
docker run -v 主机目录:容器内目录:rw # rw readwrite 可读可写
# ro只能在主机上面来操作目录,容器无法操作

数据卷容器

1
--volumes-from 要同步文件的容器			# 实现多个容器的数据同步与共享
  • 例子:三个MySQL同步数据

1、数据库1使用的命令

1
2
3
docker run -d -p 主机端口:3306 /
-v /etc/mysql/conf.d -v /var/1ib/mysql /
-e MYSQL_ROOT_PASSWORD=数据库密码 --name mysql01 mysql

2、数据库2使用的命令

1
2
3
4
docker run -d -p 主机端口:3306 /
--volumes-from mysql01 /
-e MYSQL_ROOT_PASSWORD=数据库密码 --name mysql02 mysql
Copy

3、数据库3使用的命令

1
2
3
docker run -d -p 主机端口:3306 /
--volumes-from mysql01 /
-e MYSQL_ROOT_PASSWORD=数据库密码 --name mysql03 mysql

DockerFile

DockerFile是用来构建Docker镜像的构建文件。

!注意事项

  • 1、每个保留关键字(指令)都是必须是大写字母
  • 2、执行从上到下顺序执行
  • 3、#表示注释
  • 4、每一个指令都会创建提交一个新的镜像层,并提交
image-20230325152651663

DockerFile命令

1
2
3
4
5
6
7
8
9
10
11
12
FROM          # 基础镜镜像,—切从这里开始构建
MAINTAINER # 镜像的作者,姓名<邮箱>
RUN # 镜像构建的时候需要运行的命令
ADD # 添加内容,添加压缩包会自动解压
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承DockerFile这个时候就会运行ONBUILD 的指令。触发指令。
COPY # 类似ADD ,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!

用DockerFile文件创建镜像

1
2
3
docker build -f DockerFile文件名 -t 镜像名:版本号 .
# -f指定Dockfile文件,若Dockerfile文件名就是Dockerfile,则不用-f再指定。系统则自动判定此文件是Dockerfile文件。
# 最后一个是 . 一定加上

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@docker ~]# mkdir centos
[root@docker ~]# cd centos/
[root@docker centos]# touch DockerFile
[root@docker centos]# vi DockerFile
#基础镜像信息
FROM centos:latest
#维护者信息
MAINTAINER qianyios xiaoohu2002@163.com
#镜像操作指令
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum install -y wget
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
RUN yum clean all && yum makecache
RUN mkdir /test
RUN echo 'test' > /test/test.txt

[root@docker centos]# docker build -f /root/centos/DockerFile -t centos-test:v1 .
[root@docker centos]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-test v1 b1f4c91e59ee 2 minutes ago 328MB
#此时已经有一个镜像了

用这个镜像创建容器,且将容器中的/test挂载到主机目录下的/opt/test

b1f是镜像id前三个字符

1
2
3
4
5
6
docker run -it -v /opt/test:/test --name test -p 80:80 b1f /bin/bash
exit
退出exit之后查看/opt/test是否有test.txt文件
[root@docker ~]# cat /opt/test/test.txt
test
成功!!!

配置镜像加速器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 设置 Docker 镜像加速器
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn/"
],
"insecure-registries": [],
"debug": false,
"experimental": false,
"features": {
"buildkit": true
}
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

Docker 网络

docker网络主要是解决容器联网问题,也是我们使用容器中最重要的一个环节,如果容器没有网络则无法向网络中提供服务。

网络管理命令:docker network

1
2
3
4
5
6
7
8
9
10
11
[root@docker ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect 连接容器到网络
create 创建网络
disconnect 断开容器与网络的连接
inspect 显示一个或多个网络的详细信息
ls 列表网络
prune 删除所有未使用的网络
rm 删除一个或多个网络

docker网络类型

创建容器的时候可以通过—network命令来指定容器的网络,网络类型有以下四种

  • bridge
  • host
  • none
  • 容器网络或联盟网络

bridge

桥接网络是指容器通过桥接的方式将容器网卡桥接到宿主机的docker0网桥,然后在通过宿主机防火墙的NAT表实现与外网的联系。

宿主机docker0网桥

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
[root@docker ~]# ifconfig 
#docker0网桥
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:c7ff:fe37:8e8 prefixlen 64 scopeid 0x20<link>
ether 02:42:c7:37:08:e8 txqueuelen 0 (Ethernet)
RX packets 6618 bytes 277975 (271.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8152 bytes 24675021 (23.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

.....省略了本机的网卡信息
#容器网卡,每创建一个桥接网络的容器就会生成一个对应的网卡
vethf75a942: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::9085:f5ff:fe34:77b5 prefixlen 64 scopeid 0x20<link>
ether 92:85:f5:34:77:b5 txqueuelen 0 (Ethernet)
RX packets 2850 bytes 158484 (154.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3397 bytes 11613136 (11.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0



如果想看更清楚一下 可以使用 ip add show命令
[root@docker ~]# ip add show

4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c7:37:08:e8 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:c7ff:fe37:8e8/64 scope link
valid_lft forever preferred_lft forever

容器网卡
14: vethf75a942@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 92:85:f5:34:77:b5 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::9085:f5ff:fe34:77b5/64 scope link
valid_lft forever preferred_lft forever


注意:
这里的vethf75a942@if13指的就是容器网卡,V代表虚拟网卡的意思,eth 以太网卡,f75a942网卡编号,if13指的是宿主机网桥(docekr0)的一个端口,对应容器的网卡编号加一。
所以容器内的网卡编号应该是 eth0@if14

通过在容器中执行命令 ip add show 也可以看到
[root@docker ~]# docker exec a5f ip add show
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
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

防火墙的NAT表内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@docker ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- anywhere !loopback/8 ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 anywhere

Chain DOCKER (2 references)
target prot opt source destination
RETURN all -- anywhere anywhere

docker0 与容器网卡桥接

1
2
3
4
通过brctl show命令可以看到容器网卡和docker0网卡的桥接信息
[root@docker ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242c73708e8 no vethf75a942

创建一个网络为bridge类型的容器,不指定默认也是这个类型

1
[root@docker ~]# docker run -d --network bridge --name centos1 baishuming2020/centos_nginx

host

容器和真机共用网卡及对应的端口,缺点就是同一个端口只能宿主机或者某个容器使用,其他容器不能用。

1
2
创建一个网络类型host的容器
[root@docker ~]# docker run -d --network host --name centos2 baishuming2020/centos_nginx

none

容器仅有lo网卡,是一个不能联网的本地容器

1
2
创建一个网络类型为lo的容器
[root@docker ~]# docker run -d --network none --name centos3 baishuming2020/centos_nginx

实现网桥网络

目的:不同的服务容器组应用不同的网桥,避免同一网络内容器太多,保持容器网络独立性。

关于新网桥联网问题:创建网桥后,宿主机会自动帮你做NAT,所以不用担心联网问题

查看网络-ls

1
2
3
4
5
6
7
8
9
10
11
12
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
80982d2613cd bridge bridge local
40c179ab420a docker1 bridge local
04aadb7475c0 docker100 bridge local
ce79e9d7525a host host local
8f0358469e57 none null local

NETWORK ID 网桥ID
NAME 名称
DRIVER 网络类型
SCOPE 作用范围

创建网桥-create

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@docker ~]# docker network create -d bridge --subnet 192.168.148.0/24 --gateway 192.168.148.2 a1
6a410e27b66ea587142d967f7dff6f36c04ced3c27116a79831412f3743aba56

[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
6ee1e928b710 bridge bridge local
ce79e9d7525a host host local
6a410e27b66e mydocker0 bridge local
8f0358469e57 none null local


修改docker网桥名字
1、修改名字
[root@docker ~]# docker network rename old_name new_name
2、重启docker服务
[root@docker ~]# systemctl restart docker

删除未使用的网桥-prune

1
2
3
4
5
[root@docker ~]# docker network prune 
WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
docker1

删除某个网桥-rm

1
2
3
4
5
[root@docker ~]# docker network rm docker100
docker100

注意:
不能被活动容器占用

容器连接到网桥

前提是该容器是桥接网络

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
docker network connect 网卡 容器
[root@docker ~]# docker network connect docker1 centos1
[root@docker ~]# docker exec centos1 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
发现centos1容器多了一块网卡,使用的正是docker1的网段
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255
ether 02:42:c0:a8:01:02 txqueuelen 0 (Ethernet)
RX packets 16 bytes 1312 (1.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

容器断开网桥

1
2
将centos1容器的网络从docker1网桥断开
[root@docker ~]# docker network disconnect docker1 centos1

常见故障

FAQ1:使用改名后的新网桥的容器可能无法解析域名

原因:没有配置新网桥的DNS

解决方法:为容器手动配置一个DNS地址即可

FAQ2:Networking will not work

1
2
3
4
5
6
7
8
9
10
[root@docker ~]# docker run -d --network docker100 --name centos4 baishuming2020/centos_nginx
WARNING: IPv4 forwarding is disabled. Networking will not work.
67f2c276123c993cd66b9d7a99ba22402331a13f9ea8817e57324a934896b805

解决方案
1、打开转发
[root@docker ~]# echo "net.ipv4.ip_forward=1" >> /usr/lib/sysctl.d/00-system.conf

2、重启网络
[root@docker ~]# systemctl restart network

不同主机间的容器通信

macvlan

在 Docker 中,macvlan 是众多 Docker 网络模型中的一种,并且是一种跨主机的网络模型,作为一种驱动启用,Docker macvlan 只支持 bridge 模式

1
2
3
4
5
6
7
8
9
#macvlan 需要一块独立的网卡来进行使用,所以我们需要新添加一块网卡

docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.1 -o parent=ens224 mtacvlan-1

-o parent=网卡名称 指定用来给 macvlan 网络使用的物理网卡

注意,要在所有需要运行 macvlan 的主机上执行这条命令,但是要记得更改网关的地址,避免造成IP冲突

docker run -itd --network macvlan-1 centos /bin/bash

overlay

在 Docker 中,overlay 是众多 Docker 网络模型中的一种,并且是一种跨主机的全局网络模型,有一个数据库专门的来存储网络分配信息,避免 IP 冲突,同时内部还有一个小型的 DNS 我们可以直接通过主机名进行访问

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
consul 服务端:
docker run -itd -h consul --name consul --restart=always -p 8500:8500 progrium/consul -server -bootstrap

-h 主机名
name 容器名
restart=always 重启策略
progrium/consul 镜像名称
-server 以服务节点启动
-bootstrap 预期的启动节点数:自举

在浏览器内输入 IP地址+端口号 可以看到 web 页面

在所有主机上编辑 daemon.json 文件:
{
"hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"], 监听相关端口
"cluster-store":"consul://192.168.1.150:8500", 集群的主机地址
"cluster-advertise":"192.168.1.150:2375” 宣告自己的地址
}

重启 docker 服务

创建 overlay 网络(全局网络):一台主机上创建自动同步

docker network create -d overlay overlay-1

启动容器测试:

docker run -it --name docker-1 --network=overlay-1 centos /bin/bash

docker run -it --name docker-2 --network=overlay-1 centos /bin/bash

验证:ping docker-1

常见故障

如发现各容器内分配的ip之间相互ping不通

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
原因:可能由于防火墙问题引起的,默认forward链是drop状态,需要打开才可以


解决方案:
执行下面操作,保证INPUT FORWARD链都是ACCEPT状态
清除其他规则
[root@docker_node1 ~]# iptables -P INPUT ACCEPT
[root@docker_node1 ~]# iptables -P FORWARD ACCEPT
[root@docker_node1 ~]# iptables -F
[root@docker_node1 ~]# iptables -L -n


[root@docker_node2 ~]# iptables -P INPUT ACCEPT
[root@docker_node2 ~]# iptables -P FORWARD ACCEPT
[root@docker_node2 ~]# iptables -F
[root@docker_node2 ~]# iptables -L -n

Docker私有仓库

在Docker中,当我们执行 docker pull xxx 的时候 ,它实际上是从 hub.docker.com 这个地址去查找,这就是 Docker 公司为我们提供的公共仓库。在工作中,我们不可能把企业项目 push 到公有仓库进行管理。所以为了更好的管理镜像,Docker 不仅提供了一个中央仓库,同时也允许我们搭建本地私有仓库。

docker容器镜像仓库分类:

  • 公网仓库:docker hub
  • 私网仓库: registry、harbor

部署步骤

拉取registry镜像

1
docker pull registry 

创建registry仓库容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1、创建持久化存储,将容器镜像存储目录/var/lib/registry
挂载到本地/opt/qyck下:

mkdir /opt/qyck

2、创建 registry 容器:

docker run -itd -p 5000:5000 \
-v /opt/qyck:/var/lib/registry \
--restart=always registry:latest

3、查看容器是否运行
[root@qyck ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1ea79cc023f registry:latest "/entrypoint.sh /etc…" 10 seconds ago Up 9 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp trusting_gates

测试容器应用

1
2
3
4
[root@zutuanxue_manage01 ~]# curl 192.168.48.128:5000/v2/_catalog
{"repositories":[]}

显示仓库中没有任何镜像

上传镜像

测试:拉取nginx镜像

1
2
3
4
5
6
docker pull nginx
[root@qyck ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 65f3b3441f04 9 days ago 24MB
nginx latest 448a08f1d2f9 2 weeks ago 142MB

设置docker仓库为registry本地仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#1、修改docker进程启动文件,修改其启动方式,目的是为了让通过docker配置文件启动
[root@qyck ~]# sed -i.bak '/^ExecStart=/c\ExecStart=\/usr\/bin\/dockerd' /usr/lib/systemd/system/docker.service

#2、设置docker 守护进程的配置文件 /etc/docker/daemon.json,默认没有该文件
[root@qyck ~]# cat /etc/docker/daemon.json
{
"insecure-registries": ["http://192.168.48.128:5000"]
}

insecure-registries 指定非安全的仓库地址,多个用逗号隔开

#3、重启docker生效配置文件
systemctl daemon-reload
systemctl restart docker

将镜像打tag

1
2
3
4
[root@qyck ~]# docker tag nginx:latest 192.168.48.128:5000/nginx:v1
[root@qyck ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.48.128:5000/nginx v1 448a08f1d2f9 2 weeks ago 142MB

推送镜像到仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@qyck ~]# docker push 192.168.48.128:5000/nginx:v1
The push refers to repository [192.168.48.128:5000/nginx]
1040838fe30e: Pushed
93ee76f39c97: Pushed
5684be535bf1: Pushed
6bc8ae8fb3cf: Pushed
a29cc9587af6: Pushed
8553b91047da: Pushed
v1: digest: sha256:3f01b0094e21f7d55b9eb7179d01c49fdf9c3e1e3419d315b81a9e0bae1b6a90 size: 1570


#2、查看上传
[root@qyck ~]# curl http://192.168.48.128:5000/v2/_catalog
{"repositories":["nginx"]}

#查看存储文件夹
[root@qyck ~]# ls /opt/qyck/docker/registry/v2/repositories/
nginx

拉取镜像

在另外一台机拉取nginx镜像

1
2
3
4
5
6
7
8
9
10
11
#1、设置docker启动文件
[root@zutuanxue_node1 ~]# sed -i.bak '/^ExecStart=/c\ExecStart=\/usr\/bin\/dockerd' /usr/lib/systemd/system/docker.service

#2、设置docker配置文件
[root@zutuanxue_node1 ~]# cat /etc/docker/daemon.json
{
"insecure-registries": ["http://192.168.48.128:5000"]
}

systemctl daemon-reload
systemctl restart docker

拉取镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@qyck ~]# docker pull 192.168.48.128:5000/nginx:v1
v1: Pulling from nginx
9e3ea8720c6d: Pull complete
bf36b6466679: Pull complete
15a97cf85bb8: Pull complete
9c2d6be5a61d: Pull complete
6b7e4a5c7c7a: Pull complete
8db4caa19df8: Pull complete
Digest: sha256:3f01b0094e21f7d55b9eb7179d01c49fdf9c3e1e3419d315b81a9e0bae1b6a90
Status: Downloaded newer image for 192.168.48.128:5000/nginx:v1
192.168.48.128:5000/nginx:v1
[root@qyck ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 65f3b3441f04 9 days ago 24MB
192.168.48.128:5000/nginx v1 448a08f1d2f9 2 weeks ago 142MB


Docker学习总结

![1](../img/Docker node/f8242ed25c3cc4a0f16a604d1d53b5f885684b49.png)

docker run 参数解析

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
-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-P: 随机端口映射,容器内部端口随机映射到主机的端口

-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

--name="nginx-lb": 为容器指定一个名称;

--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-h "mars": 指定容器的hostname;

-e username="ritchie": 设置环境变量;

--env-file=[]: 从指定文件读入环境变量;

--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

-m :设置容器使用内存最大值;

--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

--link=[]: 添加链接到另一个容器;

--expose=[]: 开放一个端口或一组端口;

--volume , -v: 绑定一个卷

此笔记参考 开摆工作室/Docker基础精心整理

特别声明
千屹博客旗下的所有文章,是通过本人课堂学习和课外自学所精心整理的知识巨著
难免会有出错的地方
如果细心的你发现了小失误,可以在下方评论区告诉我,或者私信我!
非常感谢大家的热烈支持!

Docker笔记
https://blog.qianyios.top/posts/27092/
作者
严千屹
发布于
2023年3月26日
更新于
2024年9月14日
许可协议