目录
清除dangling的镜像,dangling images表示TAG为的镜像
查看容器相关命令 docker container 就能查看
docker rmi : 删除本地一个或多个镜像 -f强制 在运行强制删也没用
利用 DockerFile 文件执行 docker build 自动构建镜像
2. LABEL: 指定镜像元数据 可以指定镜像元数据,如: 镜像作者等
docker执行规则 有前台的进程才能进去页面
操作系统的镜像,如果没有前台进程,此容器自动退出,非守护进程的容器
应用级的镜像,比如,nginx, 有前台进程,正常运行,守护进程的容器
下载镜像存在位置
ls /var/lib/docker/image/overlay2/
操作系统的镜像是不运行的需要有前台才能进行 列:
让容器持续运行
没有运行时
运行时
运行时进去操作
退出进程
清除dangling的镜像,dangling images表示TAG为<none>的镜像
docker image prune
默认清除dangling以及不再使用的镜像
docker image prune -a -f
镜像打标签
docker tag 可以给镜像打标签,类似于起别名,但通常要遵守一定的命名规范,才可以上传到指定仓库 格式
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
#TARGET_IMAGE[:TAG]格式一般形式 上传规格
仓库主机FQDN或IP[:端口]/项目名(或用户名)/image名字:版本Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE [root@ubuntu2004 ~]#docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest beae173ccac6 9 months ago 1.24MB rockylinux latest 210996f98b85 10 months ago 205MB [root@ubuntu2004 ~]#docker tag busybox rockylinux:v1.0 [root@ubuntu2004 ~]#docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest beae173ccac6 9 months ago 1.24MB rockylinux v1.0 beae173ccac6 9 months ago 1.24MB rockylinux latest 210996f98b85 10 months ago 205MB
查看容器相关命令 docker container 就能查看
启动容器 docker run拉去打开 create拉去
#选项:
-i, --interactive Keep STDIN open even if not attached,通常和-t一起使用
-t, --tty 分配pseudo-TTY,通常和-i一起使用,注意对应的容器必须运行shell才支持进入
-d, --detach Run container in background and print container ID,台后运行,默认前台--name string 为容器分配一个名称
--rm 当容器退出时自动删除它
--restart 可以指定四种不同的policy
no 默认为no推出就退出,不做干扰 on-failure[:max-retries] 因为特殊原因退出,则自动重启 非o always 开机自启且退出立马起来 unless-stopped 除了不能开机自启,其余的和上面always一样
docker run 可以启动容器,进入到容器,并随机生成容器ID和名称
docker run nginx:1.22.0 #nginx是前台运行跑起来之后会卡在页面不退出
docker run -d nginx:1.22.0 #前台变后台运行
docker run = docker create + docker start #意思
docker run -it rockylinux bash #交互式打开 (进入输命令的)
docker run --name mginx01 -d nginx:1.22.0 --name 为容器分配一个名称
docker run -it --rm rockylinux bash 当容器退出时自动删除它
删除容器
docker rm -f `docker ps -aq` 删除所有容器
docker rm `docker ps -aq` 删除没有运行的容器
images 列出本地镜像
-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
--digests :显示镜像的摘要信息;
-f :显示满足条件的镜像;
--format :指定返回值的模板文件;
--no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。
docker rmi : 删除本地一个或多个镜像 -f强制 在运行强制删也没用
在容器在用时(stop是停,但是他还在用)删除镜像也是假删除,你虽然看不到他了,空间并没有删除,镜像列表不再显示, 只有他停了在删除,才是真正的删除
docker ps : 列出容器
-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小
从容器内退出
- 从容器内退出,并停止容器 exit
- 从容器内退出,且容器不停止 ctrl+p+q
定义别名
vim .bashrc 这样删除方便
alias rmc='docker rm -f `docker ps -qa`'
. .bashrc
root权限问题--privileged 选项 尽量别用
--privileged 选项被引入docker。使用该参数,container内的root拥有真正的root权限。
否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。
内核是宿主机的内核,文件个是个的 例如
docker run -it --privileged --rm rockylinux bash 真正打开
他挂在查看的都是宿主机的硬盘 删除也是,尽量别用
运行docker官方文档容器
显示当前存在容器
- docker ps -f 'status=exited' #查看退出状态的容器
- docker ps -f 'status=running' #只显示运行的容器
- docker ps -l #显示最新创建的容器(停止的容器也能显示)
- docker ps -a -s #显示容器大小
- docker ps -a -q #只显示容器ID
- docker ps -a #显示全部容器,包括退出状态的容器
- docker ps #显示运行的容器
查看容器内的进程
#docker run -d httpd
db144f1978148242dc20bd0be951628f1c00371b2c69dee53d84469c52995d8f#docker top db144f19 #镜像前面的名字才行
UID PID PPID C STIME TTY TIME CMD
root 9821 9797 3 22:02 ? 00:00:00 httpd -DFOREGROUN
查看容器资源使用情况
docker stats 251c7c7cf2aa 持续查看 一个
docker stats --no-stream 0e92b 一次性查看
--no-stream ip号更全
docker stats #查看所有容器
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx128m" elasticsearch:7.6.2 #限制内存使用大小
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2 #默认启动elasticsearch会使用较多的内存
查看容器的详细信息 inspect
docker inspect 可以查看docker各种对象的详细信息,包括:镜像,容器,网络等
docker inspect 9997
容器的启动和停止
docker start|stop|restart|pause|unpause 容器ID
给正在运行的容器发信号 docker kill
docker kill 可以给容器发信号,默认号SIGKILL,即9信号
#强制关闭所有运行中的容器 docker kill `docker ps -a -q`
进入正在运行的容器 双页面同步
docker attach 容器名,attach 类似于vnc,操作会在同一个容器的多个会话界面同步显示,所有使用此方式进入容器的操作都是同步显示的,且使用exit退出后容器自动关闭,不推荐使用,需要进入到有
docker run -it nginx:1.22.0 bash 进去 ctrl+p+q 退出 这样他正在运行、
docker attach 94a5 #查看端口进去 ,在另一本台机器上也一样就可以了
使用exec命令
在运行中的容器启动新进程,可以执行单次命令,以及进入容器
测试环境使用此方式,使用exit退出,但容器还在运行,此为推荐方式
-d, --detach 分离模式:在后台执行命令
-e, --env list 设置环境变量
-it
暴露所有容器端口 -P -p
容器启动后,默认处于预定义的NAT网络中,所以外部网络的主机无法直接访问容器中网络服务
docker run -P 可以将事先容器预定义的所有端口映射宿主机的网卡的随机端口,默认从32768开始
使用随机端口 时,当停止容器后再启动可能会导致端口发生变化 就是映射到别的机器可以访问
docker run -d --name nginx01 -P nginx:1.22.0 #映射容器所有暴露端口至随机本地端口
iptables -vnL -t nat #查看映射的端口号 docker ps 查看
curl 10.0.0.100:49153 #在别的主机ping下
docker run -d -p 80:80 --name name nginx01 nginx:1.22.0 指定端口映射
容器80端口映射宿主机本地随机端口 docker run -p 80 --name nginx-test-port1 nginx 容器80端口映射宿主机本地随机端口 docker run -p 81:80 --name nginx-test-port2 nginx 宿主机本地IP:宿主机本地端口:容器端口 docker run -p 10.0.0.100:82:80 --name nginx-test-port3 docker.io/nginx 宿主机本地IP:宿主机本地随机端口:容器端口,默认从32768开始 docker run -p 10.0.0.100::80 --name nginx-test-port4 docker.io/nginx 宿主机本机ip:宿主机本地端口:容器端口/协议,默认为tcp协议 docker run -p 10.0.0.100:83:80/udp --name nginx-test-port5 docker.io/nginx 一次性映射多个端口+协议 docker run -p 8080:80/tcp -p 8443:443/tcp -p 53:53/udp --name nginx-test-port6 nginx
查看容器的日志 docker logs nginx01
docker logs 可以查看容器中运行的进程在控制台输出的日志信息
docker logs -f nginx01 #持续跟踪
docker run alpine /bin/sh -c 'i=1;while true;do echo hello$i;let i++;sleep 2;done' #在外面打印可看到,有的里面也行根据情况定 终端
docker logs 5126
hello1
hello2
传递运行命令
容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令
容器里的PID为1的守护进程的实现方式
- 服务类: 如: Nginx,Tomcat,Apache ,但服务不能停
- 命令类: 如: tail -f /etc/hosts ,主要用于测试环境,注意: 不要tail -f <服务访问日志> 会产生不必要的磁盘IO
大概意思就是当你运行程序时 它需要有默认进程才能起来,而这个默认进程你可以自己指定,默认模拟命令进程编号为1(在里面)
默认
root@f1abb81d0c88:/# ls /proc/1/exe -l
lrwxrwxrwx 1 root root 0 Oct 18 06:24 /proc/1/exe -> /usr/sbin/nginx
替换
docker run --name nginx01 nginx:1.22.0 tail -f /etc/hosts
docker exec -it 2bc9fa486769 sh run exec都可以
需要用一个持续运行的命令把他替掉 tail -f 可以秩序运行所以用它, /etc/hosts 这个也是自己随便指定的 ls也可以但是他会瞬间结束
总结:就是用一个持续运行的程序来替代最初的那个一
容器内部的hosts文件
容器会自动将容器的ID加入自已的/etc/hosts文件中,并解析成容器的IP
[root@ubuntu1804 ~]#docker run -it centos /bin/bash
[root@598262a87c46 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 598262a87c46 #默认会将实例的ID 添加到自己的hosts文件,在容器里是可以ping通的容器外面不行
docker run -it --rm --add-host www.wangxiaochun.com:6.6.6.6--add-host www.wang.org:8.8.8.8 busybox 修改容器的 hosts文件,就是可以开始就加进去
/ # cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
6.6.6.6 www.wangxiaochun.com
8.8.8.8 www.wang.org
172.17.0.2 449bf0468efd
指定容器DNS
容器的dns服务器,默认采用宿主机的dns 地址,可以用下面方式指定其它的DNS地址
- 将dns地址配置在宿主机
- 在容器启动时加选项 --dns=x.x.x.x
- 在/etc/docker/daemon.json 文件中指定
容器的DNS默认从宿主机的DNS获取
docker exec -it nginx01 bash
root@f6cfbd1a6adc:/# cat /etc/resolv.conf
# operation for /etc/resolv.conf.
nameserver 180.76.76.76
nameserver 223.6.6.6
search wei.com wei.org #search 就是自动补全后面的命令,一不行就地第二,二不行就是失败
docker run -it --rm --add-host www.wei.com:6.6.6.6 --add-host www.wei.org:8.8.8.8 busybox
nameserver 180.76.76.76
nameserver 223.6.6.6
search wang.com wang.org
/ # ping www
PING www (47.93.189.255): 56 data bytes
64 bytes from 47.93.189.255: seq=0 ttl=127 time=8.766 ms
64 bytes from 47.93.189.255: seq=1 ttl=127 time=9.780 ms
指定DNS地址
[root@ubuntu1804 ~]#docker run -it --rm --dns 1.1.1.1 --dns 8.8.8.8 centos bash
[root@ef9cacc74b58 /]# cat /etc/resolv.conf
search wangxiaochun.com wang.org
nameserver 1.1.1.1
nameserver 8.8.8.8
[root@ef9cacc74b58 /]# exit
指定domain名
[root@ubuntu1804 ~]#docker run -it --rm --dns 1.1.1.1 --dns 8.8.8.8 --dns-search
a.com --dns-search b.com busybox
/ # cat /etc/resolv.conf
search a.com b.com
nameserver 1.1.1.1
nameserver 8.8.8.8
#用--dns指定优先级更高
[root@ubuntu1804 ~]#docker run -it --rm --dns 8.8.8.8 --dns 8.8.4.4 centos bash
[root@80ffe3547b87 /]# cat /etc/resolv.conf
search wangxiaochun.com wang.org
nameserver 8.8.8.8
nameserver 8.8.4.4
[root@80ffe3547b87 /]# exit
修改宿主机的docker 让其重启就可以自行更改 (配置文件在加速文件哪里更改)指定优先级高于配置
[root@ubuntu1804 ~]#vim /etc/docker/daemon.json
[root@ubuntu1804 ~]#cat /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"],
"dns" : [ "114.114.114.114", "119.29.29.29"],
"dns-search": [ "wangxiaochun.com", "wang.org"][root@ubuntu2004 /]#systemctl restart docker.service 配置好后重启
[root@ubuntu2004 /]#docker run -it --rm busybox
/ # cat /etc/resolv.conf
search wangxiaochun.com wang.org
nameserver 114.114.114.114
nameserver 119.29.29.29
/ #
容器内和宿主机之间复制文件 cp 文件夹也可以
[root@ubuntu2004 /]#docker run -d --name b1 busybox sleep 100 #后台运行起来
307342a8497a544a89ab7f1642c520d366c7aadaea8c5c061107d85e7d60873d[root@ubuntu2004 /]#docker cp b1:/etc/hosts hosts.b1 把里面的的文件复制出来
[root@ubuntu2004 /]#cat hosts.b1
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix[root@ubuntu2004 /]#docker cp /etc/passwd b1:/etc/os 宿主机倒入
[root@ubuntu2004 /]#docker exec b1 cat /etc/os
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
容器参数设置如密码之类 这个需要先去相关官网看看支持不支持
https://hub.docker.com/ docker里自己找 mysql为例 具体看官方
[root@ubuntu2004 /]#docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wei mysql:8.0 #指定密码,映射端口,创建数据库wei 也可以写在--env-file里看下
Unable to find image 'mysql:8.0' locally
8.0: Pulling from library/mysql
72a69066d2fe: Pull complete
[root@rocky8 ~]# mysql -uroot -p123456 -h10.0.0.100 #在另一台机器上链接
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wei |
+--------------------+
5 rows in set (0.02 sec)
传递环境变量
有些容器运行时,需要传递变量,可以使用 -e <参数> 或 --env-file <参数文件> 实现
清除不再使用的数据
dangling images表示TAG为<none>的镜像
[root@ubuntu1804 ~]#docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache
#清除不再使用的镜像
[root@ubuntu1804 ~]#docker system prune -f -a a所有 f强行
利用 Docker 快速部署自动化运维平台
拉取 启动 初始化
Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能
特性
- 批量执行: 主机命令在线批量执行
- 在线终端: 主机支持浏览器在线终端登录
- 文件管理: 主机文件在线上传下载
- 任务计划: 灵活的在线任务计划
- 发布部署: 支持自定义发布部署流程
- 配置中心: 支持 KV、文本、json 等格式的配置
- 监控中心: 支持站点、端口、进程、自定义等监控
- 报警中心: 支持短信、邮件、钉钉、微信等报警方式
- 优雅美观: 基于 Ant Design 的 UI 界面
- 开源免费: 前后端代码完全开源
- 官网地址: https://www.spug.dev/
使用文档:https://www.spug.dev/docs/about-spug/
gitee链接: https://gitee.com/openspug/spug
拉取镜像
[root@ubuntu1804 ~]# docker pull registry.aliyuncs.com/openspug/spug
启动容器
[root@ubuntu1804 ~]#docker run -d --restart=always --name=spug -p 80:80
registry.aliyuncs.com/openspug/spug
# 持久化存储启动命令:
# mydata指的是本地磁盘路径,也可以是其他目录,但需要保证映射的本地磁盘路径已经存在,
/data是容器内代码和数据初始化存储的路径
$ docker run -d --restart=always --name=spug -p 80:80 -v /mydata/:/data
registry.aliyuncs.com/openspug/spug
初始化
以下操作会创建一个用户名为 admin 密码为 123456 的管理员账户,可自行替换管理员账户。
[root@ubuntu1804 ~]#docker exec spug init_spug admin 123456
Migrations for 'account':
data/spug/spug_api/apps/account/migrations/0001_initial.py
- Create model Rol
Docker 镜像制作和管理
前台执行程序,能精简就精简
制作镜像方式
- Docker 镜像制作类似于虚拟机的镜像(模版)制作,即按照公司的实际业务需求将需要安装的软件、相关配置等基础环境配置完成,然后将其做成镜像,最后再批量从镜像批量生成容器实例,这样可以极大的简化相同环境的部署工作.
- Docker的镜像制作分为手动制作(基于容器)和自动制作(基于DockerFile),企业通常都是基于Dockerfile制作镜像
docker commit #通过修改现有容器,将之手动构建为镜像
docker build #通过Dockerfile文件,批量构建为镜像
docker commit 制作过程之修改现有容器,将之手动构建为镜像 #都手动完成无法自动化
[root@ubuntu2004 /]#docker run -it --name busyboy busybox sh
/ # echo website on busybox > index.html
/ # httpd #写入内容启动
[root@ubuntu2004 ~]#curl 172.17.0.2 在用一主机上访问 访问完之后exit退出
website on busybox
[root@ubuntu2004 /]#docker commit -a wei -m "init busyboy" busyboy bosybox:v1.0
做以容器为标准做镜像 -a作者是谁 -m 提交做了啥
[root@ubuntu2004 /]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
bosybox v1.0 633af848349e 6 minutes ago 1.24MB
registry.aliyuncs.com/openspug/spug latest a6a4856a9f3b 3 months ago 698MB
busybox latest beae173ccac6 9 months ago 1.24MB
mysql 8.0 3218b38490ce 10 months ago 516MB
[root@ubuntu2004 /]#docker run --name b1 -p 80:80 bosybox:v1.0 httpd -f #启动转前台
[root@ubuntu2004 ~]#curl 172.17.0.2 访问
website on busybox
利用 DockerFile 文件执行 docker build 自动构建镜像
DockerFile 是一种被Docker程序解释执行的脚本,由一条条的命令组成的,每条命令对应linux下面的一条命令,Docker程序将这些DockerFile指令再翻译成真正的linux命令,其有自己的书写方式和支持的命令,Docker程序读取DockerFile并根据指令生成Docker镜像,相比手动制作镜像的方式,DockerFile更能直观的展示镜像是怎么产生的,有了DockerFile,当后期有额外的需求时,只要在之前的DockerFile添加或者修改响应的命令即可重新生成新的Docker镜像,避免了重复手动制作镜像的麻烦,类似与shell脚本一样,可以方便高效的制作镜像
Docker守护程序 Dockerfile 逐一运行指令,如有必要,将每个指令的结果提交到新镜像,然后最终输出新镜像的ID。Docker守护程序将自动清理之前发送的上下文
请注意,每条指令都是独立运行的,并会导致创建新镜像,比如 RUN cd /tmp 对下一条指令不会有任何影响。
Docker将尽可能重用中间镜像层(缓存),以显著加速 docker build 命令的执行过程,这由 Using
cache 控制台输出中的消息指示
Dockerfile 镜像制作和使用流程
Dockerfile文件的制作镜像的分层结构
范例:
#按照业务类型或系统类型等方式划分创建目录环境,方便后期镜像比较多的时候进行分类
[root@ubuntu1804 ~]#mkdir
/data/dockerfile/{web/{nginx,apache,tomcat,jdk},system/{centos,ubuntu,alpine,debian}} -p
[root@ubuntu1804 ~]#tree /data/dockerfile/
/data/dockerfile/
├── system
│ ├── alpine
│ ├── centos
│ ├── debian
│ └── ubuntu
└── web
├── apache
├── jdk
├── nginx
└── tomcat
Dockerfile 文件说明
- 每一行以Dockerfile的指令开头,指令不区分大小写,但是惯例使用大写
- 使用 # 开始作为注释
- 每一行只支持一条指令,每条指令可以携带多个参数
- 指令按文件的顺序从上至下进行执行
- 每个指令的执行会生成一个新的镜像层,为了减少分层和镜像大小,尽可能将多条指令合并成一条指令
- 制作镜像一般可能需要反复多次,每次执行dockfile都按顺序执行,从头开始,已经执行过的指令已经缓存,不需要再执行,如果后续有一行新的指令没执行过,其往后的指令将会重新执行,所以为加速镜像制作,将最常变化的内容放下dockerfile的文件的后面
Dockerfile 相关指令
dockerfile 文件中的常见指令
ADD
COPY
ENV
EXPOSE
FROM
LABEL
STOPSIGNAL
USER
VOLUME
WORKDIR
1. FROM: 指定基础镜像
定制镜像,需要先有一个基础镜像,在这个基础镜像上进行定制。
FROM 就是指定基础镜像,此指令通常必需放在Dockerfile文件第一个非注释行。后续的指令都是运行于此基准镜像所提供的运行环境
基础镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry上拉取所需的镜像文件.如果找不到指定的镜像文件,docker build会返回一个错误信息
如何选择合适的镜像呢?
对于不同的软件官方都提供了相关的docker镜像,比如: nginx、redis、mysql、httpd、tomcat等服务类的镜像,也有操作系统类,如: centos、ubuntu、debian等。建议使用官方镜像,比较安全。
关于scratch 镜像 所有镜像的祖宗最小镜像
FROM scratch
参考链接:
https://hub.docker.com/_/scratch?tab=description
https://docs.docker.com/develop/develop-images/baseimages/
该镜像是一个空的镜像,可以用于构建busybox等超小镜像,可以说是真正的从零开始构建属于自己的镜像该镜像在构建基础镜像(例如debian和busybox)或超最小镜像(仅包含一个二进制文件及其所需内容,例如:hello-world)的上下文中最有用
范例:
FROM scratch #所有镜像的起源镜像,相当于Object类
FROM ubuntu
FROM ubuntu:bionic
FROM debian:buster-slim
列:制作ubuntu镜像
[root@ubuntu2004 ~]#cd /data/dockerfile/system/ubuntu/
[root@ubuntu2004 ubuntu]# vim Dockerfile
#可以不叫这个名字但是如果不叫,需要制作的时候指定文件的名称才行 Dockerfile他为默认指定名称
FROM ubuntu:22.04 指定版本名字,如果用空镜像里面什么都没有,你还需要把bash之类的相关路径考进去
~ :wq
[root@ubuntu2004 ubuntu]#docker build -t ubuntu:22.04-20221017 .
Sending build context to Docker daemon 2.048kB
Step 1/1 : FROM ubuntu:22.04
#-t指定名字 . 在当前路径去找 Dockerfile(默认文件) 需要在互联网拉取镜像
[root@ubuntu2004 ubuntu]#docker images
busybox latest beae173ccac6 9 months ago 1.24MB
mysql 8.0 3218b38490ce 10 months ago 516MB
ubuntu 22.04 9d28ccdc1fc7 10 months ago 76.3MB
ubuntu 22.04-20221017 9d28ccdc1fc7 10 months ago 76.3MB
2. LABEL: 指定镜像元数据 可以指定镜像元数据,如: 镜像作者等
[root@ubuntu2004 ubuntu]#vim Dockerfile
FROM ubuntu:22.04
LABEL Author=weizhaohui version=ubuntu:22.04-v1.0 ORG=CSDN imperial
# LABEL 标签 Author=指定作者 version=版本号 ORG=组织
:wq
[root@ubuntu2004 ubuntu]#docker build -t ubuntu:22.04-20221017 . #把之前的覆盖下
嫌弃麻烦可以写个脚本
[root@ubuntu2004 ubuntu]#vim build.sh
docker build -t ubuntu:$1 .
[root@ubuntu2004 ubuntu]#bash build.sh 22.04-20221017-v1.0
[root@ubuntu2004 ubuntu]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 22.04-20221017 e04f7e4a2dd5 2 minutes ago 76.3MB
ubuntu 22.04-20221017-v1.0 e04f7e4a2dd5 2 minutes ago 76.3MB
bosybox v1.0 633af848349e 2 hours ago 1.24MB
[root@ubuntu2004 ubuntu]#docker history ubuntu:22.04-20221017-v1.0 #查看镜像的制作过程
IMAGE CREATED CREATED BY SIZE COMMENT
e04f7e4a2dd5 5 minutes ago /bin/sh -c #(nop) LABEL Author=weizhaohui v… 0B
9d28ccdc1fc7 10 months ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 10 months ago /bin/sh -c #(nop) ADD file:1e60bfbe5a32672bf… 76.3MB
[root@ubuntu2004 ubuntu]#docker inspect ubuntu:22.04-20221017-v1.0 #查看详细信息
进入 查看发现什么命令都没有
3. RUN: 执行 shell命令
RUN 指令用来在构建镜像阶段需要执行 FROM 指定镜像所支持的Shell命令。
通常各种基础镜像一般都支持丰富的shell命令
注意: RUN 可以写多个,每一个RUN指令都会建立一个镜像层,所以尽可能合并成一条指令,比如将多个shell命令通过 && 连接一起成为在一条指令 每个RUN都是独立运行的,和前一个RUN无关
shell 是空格隔开 exec是在[ ] 里用,隔开
#shell 格式: 相当于 /bin/sh -c <命令> 此种形式支持环境变量
RUN <命令>
#exec 格式: 此种形式不支持环境变量,注意:是双引号,不能是单引号
RUN ["executable","param1","param2"...]
#exec格式可以指定其它shell
RUN ["/bin/bash","-c","echo hello wang"]
修改次数多的在后面,修改次数少的在前面,这样一样的就不会重复占用资源
RUN 多的会占用资源 尽量少点 构建的时候执行
[root@ubuntu2004 ubuntu]#vim Dockerfile
FROM ubuntu:22.04
LABEL Author=weizhaohui version=ubuntu:22.04-v1.0 ORG=CSDN.imperial
RUN sed -i "s@http://.*archive.ubuntu.com@http://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list && sed -i "s@http://.*security.ubuntu.com@http://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list && apt update && apt -y install wget curl net-tools iproute2 tcpdump telnet traceroute nfs-common lrzsz tree iotop unzip zip vim && rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/locatime
#删除的那个是为了更改时间
# RUN 支持丰富的shell命令 做些优化把从官方拉去改为清华源 apt update 记得
ENV: 设置环境变量
ENV 可以定义环境变量和值,会被后续指令(如:ENV,ADD,COPY,RUN等)通过$KEY或${KEY}进行引用,并在容器运行时保持
FROM ubuntu:22.04
LABEL Author=weizhaohui version=ubuntu:22.04-v1.0 ORG=CSDN.imperial
COPY sources.list /etc/apt/sources.list
RUN apt update && apt -y install wget curl net-tools iproute2 tcpdump telnet traceroute nfs-common lrzsz tree iotop unzip zip vim tzdata && rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/locatime
ENV CLASS=mss DATE=2022-10-17
[root@ubuntu2004 ~]#docker run -it --rm -e CLASS=m33 ubuntu:22.04-20221017-v6.0 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=bb622ab86ad0
TERM=xterm
CLASS=m33 #可以自行定义
DATE=2022-10-17
HOME=/root
COPY: 复制文本
复制本地宿主机的 到容器中的 。
说明:
- 可以是多个,可以使用通配符,通配符规则满足Go的filepath.Match 规则
- filepath.Match 参考链接: https://golang.org/pkg/path/filepath/#Match
- 必须是build上下文中的路径(为 Dockerfile 所在目录的相对路径),不能是其父目录中的文件
- 如果是目录,则其内部文件或子目录会被递归复制,但目录自身不会被复制
- 如果指定了多个, 或在中使用了通配符,则必须是一个目 录,且必须以 / 结尾
- 可以是绝对路径或者是 WORKDIR 指定的相对路径
- 使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等
- 如果事先不存在,它将会被自动创建,这包括其父目录路径,即递归创建目录
COPY 就是把当前文件的目录 复制到容器
FROM ubuntu:22.04
LABEL Author=weizhaohui version=ubuntu:22.04-v1.0 ORG=CSDN.imperial
COPY sources.list /etc/apt/sources.list
RUN apt update && apt -y install wget curl net-tools iproute2 tcpdump telnet traceroute nfs-common lrzsz tree iotop unzip zip vim tzdata && rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/locatime
ENV CLASS=mss DATE=2022-10-17
FROM ubuntu:22.04
LABEL Author=weizhaohui version=ubuntu:22.04-v1.0 ORG=CSDN.imperial
COPY sources.list /etc/apt/sources.list
#RUN apt update && apt -y install wget curl net-tools iproute2 tcpdump telnet traceroute nfs-common lrzsz tree iotop unzip zip vim tzdata && rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/locatime
#ENV CLASS=mss DATE=2022-10-17
[root@ubuntu2004 ubuntu]#docker run -it --rm ubuntu:22.04-20221017-v1.0 cat /etc/apt/sources.list
显示复制的内容
deb http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-backports main restricted universe multiverse
ADD: 复制和解包文件
该命令可认为是增强版的COPY,不仅支持COPY,还支持自动解压缩。可以将复制指定的 到容器中的
说明:
- 可以是Dockerfile所在目录的一个相对路径;也可是一个 URL;还可是一个 tar 文件(自动解压)
- 可以是绝对路径或者是 WORKDIR 指定的相对路径
- 如果是目录,只复制目录中的内容,而非目录本身
- 如果是一个 URL ,下载后的文件权限自动设置为 600
- 如果为URL且不以/结尾,则指定的文件将被下载并直接被创建为,如果以 / 结尾,则文件名URL指定的文件将被直接下载并保存为/< filename>
- 如果是一个本地文件系统上的打包文件,如: gz, bz2 ,xz ,它将被解包 ,其行为类似于"tar -x"命令,但是通过URL获取到的tar文件将不会自动展开
- 如果有多个,或其间接或直接使用了通配符,则必须是一个以/结尾的目录路径;如果不以/结尾,则其被视作一个普通文件,的内容将被直接写入到
纯之压缩不行 ,打包压缩可以
[root@ubuntu2004 ubuntu]# echo docker website > index.html
[root@ubuntu2004 ubuntu]#gzip index.html
FROM ubuntu:22.04
LABEL Author=weizhaohui version=ubuntu:22.04-v1.0 ORG=CSDN.imperial
COPY sources.list /etc/apt/sources.list
#RUN apt update && apt -y install wget curl net-tools iproute2 tcpdump telnet traceroute nfs-common lrzsz tree iotop unzip zip vim tzdata && rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/locatime
#ENV CLASS=mss DATE=2022-10-17
ADD index.html.tar.gz /data/www/ #他自己可以创建文件,解压
[root@ubuntu2004 ubuntu]#bash build.sh 22.04-20221017-v2.0
CMD: 容器启动命令
一个容器中需要持续运行的进程一般只有一个,CMD 用来指定启动容器时默认执行的一个命令,且其运行结束后,容器也会停止,所以一般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"]
范例:
CMD ["nginx", "-g", "daemon off;"]
编译安装nginx 镜像
[root@ubuntu2004 nginx]#wget http://nginx.org/download/nginx-1.22.0.tar.gz #下载源码
FROM ubuntu:22.04-20221017-v1.0
ENV VERSTON="1.22.0"
ENV NGINX_INSTALL_DIR="/web/nginx"
LABEL Author=weizhaohui version=nginx-${VERSTON}
RUN sed -i "s@http://.*archive.ubuntu.com@http://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list && sed -i "s@http://.*security.ubuntu.com@http://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
RUN apt update && apt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev
ADD nginx-${VERSTON}.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-${VERSTON} && \
./configure --prefix=${NGINX_INSTALL_DIR} --user=www --group=www --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make &&make install
EXPOSE 80
COPY nginx.conf ${NGINX_INSTALL_DIR}/conf/nginx.conf
ADD index.html.tar.gz /web/nginx/html/
CMD ${NGINX_INSTALL_DIR}/sbin/nginx -g "daemon off;"
nginxd定制
[root@ubuntu2004 nginx]#docker cp ac510c:/web/nginx/conf/nginx.conf /data/dockerfile/web/nginx/
[root@ubuntu2004 nginx]#vim nginx.conf[root@ubuntu2004 nginx]#vim Dockerfile
COPY nginx.conf ${NGINX_INSTALL_DIR}/conf/nginx.conf #加一行这个复制到里面,也方便改
ENTRYPOINT: 入口点
CMD和ENTRYPOINT共存 他会首先执行ENTRYPOINT 如果发现有CMD她会把她是做参数放在后面
通常用于金蝉脱壳 CMD和ENTRYPOINT 执行脚本 后面跟个exec “$@"
当上个命令执行完到exec这里会把CMD的·参数替换到原本的ENTRYPOINT,这样相当于执行两边, CMD这种命令只能执行程序内只能执行一次
功能类似于CMD,配置容器启动后执行的命令及参数
- 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指令提供环境配置