目录
1.1.1 FROM :指定基础镜像,必须放在Dockerfile文件第一个非注释行
1.总结Dockerfile的指令和Docker的网络模式
1.1 Dockerfile指令
1.1.1 FROM :指定基础镜像,必须放在Dockerfile文件第一个非注释行
默认情况下,docker bulid会在docker主机上查找指定的镜像文件,如果不存在,则会从Docker Hub Registry上拉去所需的镜像文件,如果找不到则会返回错误信息。
如果指定FROM scratch 则是指定一个空镜像
FROM [--platform=<platform>] <image> [AS <name>]FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]# 说明 :--platform 指定镜像的平台,比如 : linux/amd64, linux/arm64, or windows/amd64tag 和 digest 是可选项,如果不指定,默认为 latest
1.1.2 LABEL : 指定镜像元数据,如:镜像作者等
# 一行格式LABEL multi .label1 = "value1" multi .label2 = "value2" other = "value3"# 多行格式LABEL multi .label1 = "value1" \multi .label2 = "value2" \other = "value3"
1.1.3 RUN :执行shell命令
#shell 格式 : 相当于 /bin/sh -c < 命令 > 此种形式支持环境变量RUN < 命令 >#exec 格式 : 此种形式不支持环境变量 , 注意 : 是双引号 , 不能是单引号RUN [ "executable" , "param1" , "param2" ...]#exec 格式可以指定其它 shellRUN [ "/bin/bash" , "-c" , "echo hello wang" ]
1.1.4 ENV:设置环境变量
# 变量赋值格式 1ENV <key> <value> # 此格式只能对一个 key 赋值 ,<key> 之后的所有内容均会被视作其 <value> 的组成部分# 变量赋值格式 2ENV <key1> = <value1> <key2> = <value2> \ # 此格式可以支持多个 key 赋值 , 定义多个变量建议使用 ,减少镜像层<key3> = <value3> ...# 如果 <value> 中包含空格,可以以反斜线 \ 进行转义,也可通过对 <value> 加引号进行标识 ; 另外,反斜线也可用于续行# 只使用一次变量RUN <key> = <value> <command># 引用变量RUN $key .....# 变量支持高级赋值格式${key:-word}${key:+word}
docker run -e |--env <key> = <value># 说明-e , --env list #Set environment variables--env-file filename #Read in a file of environment variables
1.1.5 COPY :复制文本
COPY [--chown = <user>:<group>] <src>... <dest>COPY [--chown = <user>:<group>] [ "<src>" ,... "<dest>" ] # 路径中有空白字符时 , 建议使用此格式
- 可以是多个,可以使用通配符,通配符规则满足Go的filepath.Match 规则 ,filepath.Match 参考链接: https://golang.org/pkg/path/filepath/#Match
- 必须是build上下文中的路径(为 Dockerfile 所在目录的相对路径),不能是其父目录中的文件
- 如果是目录,则其内部文件或子目录会被递归复制,但目录自身不会被复制
- 如果指定了多个, 或在中使用了通配符,则必须是一个目 录,且必须以 / 结尾
- 可以是绝对路径或者是 WORKDIR 指定的相对路径
- 使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等
- 如果事先不存在,它将会被自动创建,这包括其父目录路径,即递归创建目录
1.1.6 ADD:复制和解包文件
该命令可认为是增强版的COPY,不仅支持COPY,还支持自动解压缩。可以将复制指定的 到容器中的
ADD [ -- chown = <user> : <group> ] <src> ... <dest>ADD [--chown= <user> : <group> ] [" <src> ",... " <dest> "]
- 可以是Dockerfile所在目录的一个相对路径;也可是一个 URL;还可是一个 tar 文件(自动解压)
- 可以是绝对路径或者是 WORKDIR 指定的相对路径
- 如果是目录,只复制目录中的内容,而非目录本身
- 如果是一个 URL ,下载后的文件权限自动设置为 600
- 如果为URL且不以/结尾,则指定的文件将被下载并直接被创建为,如果以 / 结尾,则文件名URL指定的文件将被直接下载并保存为/< filename>
- 如果是一个本地文件系统上的打包文件,如: gz, bz2 ,xz ,它将被解包 ,其行为类似于"tar -x"命令, 但是通过URL获取到的tar文件将不会自动展开
- 如果有多个,或其间接或直接使用了通配符,则必须是一个以/结尾的目录路径;如果不以/结尾,则其被视作一个普通文件,里面的内容将被直接写入到
1.1.7 CMD:容器启动命令
- 如果docker run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT命令,那么开启容器时就会使用执行CMD指定的默认的命令
- 前面介绍过的 RUN 命令是在构建镜像时执行的命令,注意二者的不同之处
- 每个 Dockerfile 只能有一条 CMD 命令。如指定了多条,只有最后一条被执行
- 如果用户启动容器时用 docker run xxx 指定运行的命令,则会覆盖 CMD 指定的命令
# 使用 exec 执行,推荐方式,第一个参数必须是命令的全路径 , 此种形式不支持环境变量CMD [ "executable" , "param1" , "param2" ]# 在 /bin/sh 中执行,提供给需要交互的应用;此种形式支持环境变量CMD command param1 param2# 提供给 ENTRYPOINT 命令的默认参数CMD [ "param1" , "param2" ]
1.1.8 ENTRYPOINT: 入口点
功能类似于CMD,配置容器启动后执行的命令及参数
# 使用 exec 执行ENTRYPOINT [ "executable" , "param1" , "param2" ...]# shell 中执行ENTRYPOINT command param1 param2
- ENTRYPOINT 不能被 docker run 提供的参数覆盖,而是追加,即如果docker run 命令有参数,那么参数全部都会作为ENTRYPOINT的参数
- 如果docker run 后面没有额外参数,但是dockerfile中有CMD命令(即上面CMD的第三种用
- 法),即Dockerfile中即有CMD也有ENTRYPOINT,那么CMD的全部内容会作为ENTRYPOINT的参数
- 如果docker run 后面有额外参数,同时Dockerfile中即有CMD也有ENTRYPOINT,那么docker run 后面的参数覆盖掉CMD参数内容,最终作为ENTRYPOINT的参数
- 可以通过docker run --entrypoint string 参数在运行时替换,注意string不要加空格
- 使用CMD要在运行时重新写命令本身,然后在后面才能追加运行参数,ENTRYPOINT则可以运行时无需重写命令就可以直接接受新参数
- 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个生效
- 通常会利用ENTRYPOINT指令配合脚本,可以为CMD指令提供环境配置
[root@ubuntu2204 nginx-web-entrypint] #cat DockerfileFROM nginx-alpine:1.24.0-v4.0LABEL maintainer = "wangxiaochun <root@wangxiaochun.com>"RUN mkdir -p /data/website#COPY index.html /data/websiteCOPY entrypoint.sh /CMD [ "nginx" , "-g" , "daemon off;" ]ENTRYPOINT [ "/entrypoint.sh" ][root@ubuntu2204 nginx-web-entrypint] #cat entrypoint.sh#!/bin/sh##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2023-06-14#FileName: entrypiont.sh#URL: http://www.wangxiaochun.com#Description: The test script#Copyright (C): 2023 All rights reserved#********************************************************************# 注意: alpine 镜像没有 bash ,此处使用 shcat > /apps/nginx/conf/conf.d/www.conf <<EOFserver {server_name ${HOST:-"www.wangxiaochun.com"} ;listen ${IP:-0.0.0.0} : ${PORT:-80} ;root ${DOC_ROOT:-/apps/nginx/html} ;}EOFecho ${HOST:-"www.wangxiaochun.com"} >${DOC_ROOT:-/apps/nginx/html} /index.html#nginx -g "daemon off;"exec " $@ "
1.2 Docker的网络模式
Docker 的网络支持5种网络模式:
- none
- bridge
- container
- host
- network-name
范例: 查看默认的网络模式有三个
[root@ubuntu1804 ~] #docker network lsNETWORK ID NAME DRIVER SCOPEfe08e6d23c4c bridge bridge localcb64aa83626c host host local10619d45dcd4 none null local
指定网络模式:
docker run --network <mode>docker run --net = <mode><mode>: 可是以下值nonebridgehostcontainer:< 容器名或容器 ID>< 自定义网络名称 >
1.2.1 Bridge网络模式:
- 网络资源隔离: 不同宿主机的容器无法直接通信,各自使用独立网络
- 无需手动配置: 容器默认自动获取172.17.0.0/16的IP地址,此地址可以修改
- 可访问外网: 利用宿主机的物理网卡,SNAT连接外网
- 外部主机无法直接访问容器: 可以通过配置DNAT接受外网的访问
- 低性能较低: 因为可通过NAT,网络转换带来更的损耗
- 端口管理繁琐: 每个容器必须手动指定唯一的端口,容器产生端口冲容
# 修改桥接地址[root@ubuntu1804 ~] #vim /lib/systemd/system/docker.serviceExecStart = /usr/bin/dockerd -H fd:// --containerd = /run/containerd/containerd.sock--bip = 10 .100.0.1/24
[root@ubuntu1804 ~] #vim /etc/docker/daemon.json{"hosts" : [ "tcp://0.0.0.0:2375" , "fd://" ],"bip" : "192.168.100.100/24" , # 分配 docker0 网卡的 IP,24 是容器 IP 的 netmask"fixed-cidr" : "192.168.100.128/26" , # 分配容器 IP 范围 ,26 不是容器 IP 的子网掩码 , 只表示地址范围"fixed-cidr-v6" : "2001:db8::/64" ,"mtu" : 1500 ,"default-gateway" : "192.168.100.200" , # 网关必须和 bip 在同一个网段"default-gateway-v6" : "2001:db8:abcd::89" ,"dns" : [ "1.1.1.1" , "8.8.8.8" ]}[root@ubuntu1804 ~] #systemctl restart docker
1.2.2 Host模式
- 使用参数 --network host 指定
- 共享宿主机网络
- 各容器网络无隔离
- 网络性能无损耗
- 网络故障排除相对简单
- 容易产生端口冲突
- 网络资源无法分别统计
- 不支持端口映射
# 创建 host 模式的容器[root@ubuntu1804 ~] #docker run -d --network host --name web1 nginx-centos7-base:1.6.141fb5b8e41db26e63579a424df643d1f02e272dc75e76c11f4e313a443187ed1# 创建容器后,宿主机的 80/tcp 端口打开[root@ubuntu1804 ~] #ss -ntlp|grep :80LISTEN 0 128 0 .0.0.0:80 0 .0.0.0:*users:(( "nginx" ,pid = 43762 ,fd = 6 ),( "nginx" ,pid = 43737 ,fd = 6 ))
1.2.3 None模式
- 使用参数 --network none 指定
- 默认无网络功能,无法和外部通信
- 无法实现端口映射
- 适用于测试环境
1.2.4 Container模式
- 使用参数 –-network container:名称或ID 指定
- 与宿主机网络空间隔离
- 空器间共享网络空间,直接使用对方的网络
- 第一个容器的网络可能是bridge,或none,或者host,而第二个容器模式依赖于第一个容器,它们共享网络
- 如果第一个容器停止,将导致无法创建第二个容器
- 第二个容器可以直接使用127.0.0.1访问第一个容器
- 适合频繁的容器间的网络通信
- 默认不支持端口映射,较少使用
[root@ubuntu2004 ~] #docker run -d -p 80:80 --name wordpress -v/data/wordpress:/var/www/html --restart=always wordpress:php7.4-apache[root@ubuntu2004 ~] #docker run --network container:wordpress -eMYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -eMYSQL_PASSWORD=123456 --name mysql -d -v /data/mysql:/var/lib/mysql --restart=always mysql:8.0.29-oracle# 注意:数据库主机地址为 127.0.0.1 ,不支持 localhost
范例: 第一个容器使用host网络模式,第二个容器与之共享网络
[root@ubuntu1804 ~] #docker run -d --name c1 --network host nginxcentos7.8:v5.0-1.18.05a60804f3917d82dfe32db140411cf475f20acce0fe4674d94e4557e1003d8e0[root@ubuntu1804 ~] #docker run -it --name c2 --network container:c1centos7.8:v1.0[root@ubuntu1804 /] # ip a1 : lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN groupdefault qlen 1000link/loopback 00 :00:00:00:00:00 brd 00 :00:00:00:00:00inet 127 .0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever2 : eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UPgroup default qlen 1000link/ether 00 :0c:29:63:8b:ac brd ff:ff:ff:ff:ff:ffinet 10 .0.0.100/24 brd 10 .0.0.255 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe63:8bac/64 scope linkvalid_lft forever preferred_lft forever3 : docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue stateDOWN group defaultlink/ether 02 :42:24:86:98:fb brd ff:ff:ff:ff:ff:ffinet 172 .17.0.1/16 brd 172 .17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:24ff:fe86:98fb/64 scope linkvalid_lft forever preferred_lft forever[root@ubuntu1804 ~] #docker exec -it c1 bash[root@ubuntu1804 /] # ip a1 : lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN groupdefault qlen 1000link/loopback 00 :00:00:00:00:00 brd 00 :00:00:00:00:00inet 127 .0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever2 : eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UPgroup default qlen 1000link/ether 00 :0c:29:63:8b:ac brd ff:ff:ff:ff:ff:ffinet 10 .0.0.100/24 brd 10 .0.0.255 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe63:8bac/64 scope linkvalid_lft forever preferred_lft forever3 : docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue stateDOWN group defaultlink/ether 02 :42:24:86:98:fb brd ff:ff:ff:ff:ff:ffinet 172 .17.0.1/16 brd 172 .17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:24ff:fe86:98fb/64 scope linkvalid_lft forever preferred_lft forever[root@ubuntu1804 /] #
1.2.5 自定义网络模式
除了以上的网络模式,也可以自定义网络,使用自定义的网段地址,网关等信息
docker network create -d <mode> --subnet <CIDR> --gateway < 网关 > < 自定义网络名称 ># 注意 mode 不支持 host 和 none, 默认是 bridge 模式-d <mode> 可省略,默认为 bridg
docker network inspect < 自定义网络名称或网络 ID>
docker run --network < 自定义网络名称 > < 镜像名称 >docker run --net < 自定义网络名称 > --ip < 指定静态 IP> < 镜像名称 ># 注意:静态 IP 只支持自定义网络模型
doccker network rm < 自定义网络名称或网络 ID>
[root@ubuntu2004 ~] #docker network create -d bridge --subnet 172.27.0.0/16 --gateway 172.27.0.1 bridge2[root@ubuntu2004 ~] #docker run -d -p 8080:80 --network bridge2 --namewordpress2 -v /data/wordpress2:/var/www/html --restart=always wordpress:php7.4-apache[root@ubuntu2004 ~] #docker run --network bridge2 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=123456 --name mysql2 -d -v /data/mysql2:/var/lib/mysql --restart=always mysql:8.0.29-oracle#wordpress 连接数据库时,数据库主机是容器的名称 mysql2
2.搭建harbor私有仓库并且上传镜像到私有仓库
注意:搭建harbor,必须先安装docker以及docker compose
2.1 安装harbor
#提前下载haproxy tar包文件或者使用wget在线下载,不推荐在线下载
wget https://github.com/goharbor/harbor/releases/download/v2.8.0/harbor-offline-installer-v2.8.2.tgz
#解压缩到指定目录tar xvf harbor-offfline-installer-v2.8.2.tgz -C 、/apps
cd /apps/harbor
#修改配置文件
cp harbor.yml.tmpl harbor.yml
HARBOR_NAME=`hostname -I|awk '{print $1}'`
sed -ri "/^hostname/s/reg.mydomain.com/${HARBOR_NAME}/" harbor.yml
sed -ri "/^https/s/(https:)/#\1/" harbor.yml
sed -ri "s/(port: 443)/#\1/" harbor.yml
sed -ri "/certificate:/s/(.*)/#\1/" harbor.yml
sed -ri "/private_key:/s/(.*)/#\1/" harbor.yml
sed -ri "s/Harbor12345/123456/" harbor.yml
sed -i 's#^data_volume: /data#data_volume: /data/harbor#' harbor.yml
#安装python,运行harbor安装脚本
apt -y install python
/apps/harbor/install.sh
#成功安装harbor后查看容器
[root@ubuntu1804 ~] #docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bceb7edd65d6 goharbor/harbor-jobservice:v2.8.2 "/harbor/entrypoint.…" 8 seconds ago Up 5 seconds (health: starting) harbor-jobservice
b76a3dc29d9a goharbor/nginx-photon:v2.8.2 "nginx -g 'daemon of…" 8 seconds ago Up 7 seconds (health: starting) 0.0.0.0:80->8080/tcp, :::80->8080/tcp nginx
93d16deeff91 goharbor/harbor-core:v2.8.2 "/harbor/entrypoint.…" 8 seconds ago Up 8 seconds (health: starting) harbor-core
d433df44e31b goharbor/harbor-registryctl:v2.8.2 "/home/harbor/start.…" 9 seconds ago Up 8 seconds (health: starting) registryctl
3bbb2071bb2e goharbor/harbor-db:v2.8.2 "/docker-entrypoint.…" 9 seconds ago Up 8 seconds (health: starting) harbor-db
0c334e971fa8 goharbor/redis-photon:v2.8.2 "redis-server /etc/r…" 9 seconds ago Up 8 seconds (health: starting) redis
ee08f68db46b goharbor/harbor-portal:v2.8.2 "nginx -g 'daemon of…" 9 seconds ago Up 8 seconds (health: starting) harbor-portal
f02846d56bee goharbor/registry-photon:v2.8.2 "/home/harbor/entryp…" 9 seconds ago Up 8 seconds (health: starting) registry
78e96d5fbc3c goharbor/harbor-log:v2.8.2 "/bin/sh -c /usr/loc…" 9 seconds ago Up 9 seconds (health: starting) 127.0.0.1:1514->10514/tcp harbor-log
登录harbor页面
新建项目
2.2 上传镜像到私有仓库
准备一个本地镜像
root@ubuntu2004:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine-base 1.0 63341a78f287 1 hours ago 5.59MB#上传镜像前需要先登录harbor
root@ubuntu2004:/apps/harbor# docker login harbor.huang.org
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
#给镜像贴标签
root@ubuntu2004:~# docker tag alpine-base:v1.0 harbor.huang.org/homework/alpine-base:v1.0
root@ubuntu2004:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine-base v1.0 c4a11418aa85 About a minute ago 5.59MB
harbor.huang.org/homework/alpine-base v1.0 c4a11418aa85 About a minute ago 5.59MB#上传镜像
root@ubuntu2004:~# docker push harbor.huang.org/homework/alpine-base:v1.0
The push refers to repository [harbor.huang.org/homework/alpine-base]
8d3ac3489996: Pushed
v1.0: digest: sha256:96c3a6f7a362073dec55bb206c34ae4ba065340d3f961d485ff8a34bcc680e3f size: 528
验证上传成功
3.总结JumpServer的安装和使用
3.1 JumpServer安装
JumpServer安装环境要求:
mysql,redis
官方一键安装脚本
curl -sSL
https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh | bash
3.2 JumpServer使用

3.2.1 创建用户和组
- 系统管理员
- 普通用户
- 系统审计员
创建用户huang
创建运维组,并将huang加入组内
3.2.2 管理资产
JumpServer 可以管理各种类型的资产
- 登录用户:
- 系统用户中的特权用户(管理用户):
- 系统用户中的普通用户(系统用户):
创建管理用户(系统用户中特权用户)
- 通常是后端服务器的root或者是具备root权限的超级用户
- 用于推送或者是创建系统用户
- 用于获取被管理的硬件资产信息
创建资产
创建节点dev,创建资产10.0.0.200
3.2.3 授权管理
创建系统用户(系统用户中普通用户)
关联使用系统用户的资产



切换用户huang,登录链接资产
3.2.4会话管理

历史会话可以回放用户的操作
3.2.5 命令过滤

创建命令过滤规则