目录
1.总结Dockerfile的指令和Docker的网络模式
1.1 Dockerfile指令
1.1.1 FROM :指定基础镜像,必须放在Dockerfile文件第一个非注释行
1.1.2 LABEL : 指定镜像元数据,如:镜像作者等
1.1.3 RUN :执行shell命令
1.1.4 ENV:设置环境变量
1.1.5 COPY :复制文本
1.1.6 ADD:复制和解包文件
1.1.7 CMD:容器启动命令
1.1.8 ENTRYPOINT: 入口点
1.2 Docker的网络模式
1.2.1 Bridge网络模式:
1.2.2 Host模式
1.2.3 None模式
1.2.4 Container模式
1.2.5 自定义网络模式
2.搭建harbor私有仓库并且上传镜像到私有仓库
2.1 安装harbor
2.2 上传镜像到私有仓库
3.总结JumpServer的安装和使用
3.1 JumpServer安装
3.2 JumpServer使用
3.2.1 创建用户和组
3.2.2 管理资产
3.2.3 授权管理
3.2.4会话管理
3.2.5 命令过滤
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 命令过滤
创建命令过滤规则